微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求高手指点为什么lcd不显示

求高手指点为什么lcd不显示

时间:10-02 整理:3721RD 点击:
#include <reg51.H>
#include <intrins.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
/******************************
DS18B20引脚
******************************/
sbit DQ=P1^3;  //13
uchar data  temp_data[2] = {0x00,0x00} ;
uchar data  display[5] =   {0x00,0x00,0x00,0x00,0x00} ;
bit presence;
/******************************
继电器开关
******************************/
sbit guang=P3^3;
sbit shidi=P3^4;
sbit shigao=P3^5;
sbit wendi=P3^6;
sbit wengao=P3^7;
/******************************
定义12864引脚
******************************/
#define LCD_data P0
sbit LCD_RS=P2^4;
sbit LCD_RW=P2^3;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^5;
/******************************
定义ADC0832引脚
******************************/
sbit ADCS =P1^4;  //ADC0832 chip seclect
sbit ADDI =P1^6;  //ADC0832 k in
sbit ADDO =P1^6;  //ADC0832 k out
sbit ADCLK =P1^5;  //ADC0832 clock signal
/******************************
12864显示各个参数
******************************/
uchar code dis1[]={"湿度:"};
uchar code dis2[]={"光照:"};
uchar code dis3[]={"温度:      ."};
uchar code dis4[]={"马星云2013/12/16"};
uchar dispbuf[3];
/******************************
显示中间变量
******************************/
uint temp;
uint dat0=0;
uchar disp[]={"0123456789"};//显示数组
uchar adc[4];
uchar abc[6];
//uchar abc_1[3];
uchar bijiao[5];
uchar uart[2];
/******************************
12864驱动
******************************/
void delay_1ms(uint x)        //延迟时间函数
{
  uchar i,j;
  for(i=0;i<x;i++)
   for(j=0;j<110;j++);
}
void write_cmd(uchar cmd)
{
  LCD_RS=0;
  LCD_RW=0;
  LCD_EN=0;
  P0=cmd;
  delay_1ms(10);
  LCD_EN=1;
  delay_1ms(10);
  LCD_EN=0;
}
void write_dat(uchar dat)
{
  LCD_RS=1;
  LCD_RW=0;
  LCD_EN=0;
  P0=dat;
  delay_1ms(6);
  LCD_EN=1;
  delay_1ms(6);
  LCD_EN=0;
}
void lcd_pos(uchar x,uchar y)
{
  uchar pos;
  if(x==0)
  {x=0x80;}
  if(x==1)
  {x=0x90;}
  if(x==2)
  {x=0x88;}
  if(x==3)
  {x=0x98;}
  pos=x+y;
  write_cmd(pos);
}
/******************************
12864初始化
******************************/
void lcd_init()
{
  LCD_PSB=1;
  write_cmd(0x30);
  delay_1ms(5);
  write_cmd(0x0c);
  delay_1ms(5);
  write_cmd(0x01);
  delay_1ms(5);
}
/******************************
显示名称
******************************/
void display_nm()   
{
  uchar i;
  lcd_pos(0,0);
  i=0;
  while(dis1[i]!='\0')
   {
     write_dat(dis1[i]);
     i++;
   }
  lcd_pos(1,0);
  i=0;
  while(dis2[i]!='\0')
   {
     write_dat(dis2[i]);
     i++;
   }
  lcd_pos(2,0);
  i=0;
  while(dis3[i]!='\0')
   {
     write_dat(dis3[i]);
     i++;
   }
  lcd_pos(3,0);
  i=0;
  while(dis4[i]!='\0')
   {
     write_dat(dis4[i]);
     i++;
   }
}

/******************************
18B20程序模块
******************************/
unsigned char code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;///*小数位表,四舍五入*/

void Delay(unsigned int num)
{
  while( --num ) ;
}
/*初始化ds1820                                      */
/*******************************************************************/
Init_DS18B20(void)
{
     DQ = 1 ;      //DQ复位
     Delay(8) ;    //稍做延时
     DQ = 0 ;      //单片机将DQ拉低
     Delay(90) ;   //精确延时 大于 480us
     DQ = 1 ;       //拉高总线
     Delay(8) ;
     presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
     Delay(100) ;
     DQ = 1 ;
     return(presence) ; //返回信号,0=presence,1= no presence
}

/* 读一个字节                     */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ; // 给脉冲信号
    dat >>= 1 ;
    DQ = 1 ; // 给脉冲信号
    if(DQ)
     dat |= 0x80 ;
    Delay(4) ;
  }
    return (dat) ;
}
/* 写一个字节                                         */
/*******************************************************************/
void WriteOneChar(unsigned char dat)
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    DQ = dat&0x01 ;
    Delay(5) ;
    DQ = 1 ;
    dat>>=1 ;
  }
}
/* 读取温度                            */
/*******************************************************************/
void Read_Temperature(void)
{
     Init_DS18B20() ;
     WriteOneChar(0xCC) ;  // 跳过读序号列号的操作
     WriteOneChar(0x44) ;  // 启动温度转换
     Init_DS18B20() ;
     WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     WriteOneChar(0xBE) ;  //读取温度寄存器
     temp_data[0] = ReadOneChar() ;   //温度低8位
     temp_data[1] = ReadOneChar() ;   //温度高8位
}
/* 数据转换与温度显示                                              */
/*******************************************************************/
void Disp_Temperature()
{
  display[4]=temp_data[0]&0x0f ;
  display[0]=ditab[display[4]]+0x30 ;     //查表得小数位的值
  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  display[3]=display[4]/100+0x30 ;
  display[1]=display[4]%100 ;
  display[2]=display[1]/10+0x30 ;
  display[1]=display[1]%10+0x30 ;
  bijiao[4]=ditab[display[4]];
  bijiao[3]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  bijiao[2]=bijiao[3]/100;//比较百位
  bijiao[0]=bijiao[3]%100;
  bijiao[1]=bijiao[0]/10;//比较十位
  bijiao[0]=bijiao[0]%10;//比较个位
    if(display[3]==0x30)        //高位为0,不显示
   {
     display[3]=0x20 ;
     if(display[2]==0x30)      //次高位为0,不显示
     display[2]=0x20 ;
   }
   lcd_pos(2,3);
   write_dat(display[3]);
   lcd_pos(2,4);
   write_dat(display[2]);
   lcd_pos(2,5);
   write_dat(display[1]);
   lcd_pos(2,7);
   write_dat(display[0]);
}

/******************************
ADC0832数据转换
******************************/
uint Adc0832(uchar channel)     //AD转换,返回结果
{
    uchar i=0;
    uchar j;
    uint dat=0;
    uchar ndat=0;
    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;//拉低CS端
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿1
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿2
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿3
    ADDI=1;//控制命令结束
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;//拉低CS端
    ADCLK=0;//拉低CLK端
    ADDO=1;//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k
}

/************************************
不同通道的0832显示
************************************/
void action(uchar x,uchar y,uchar x1,uchar y1,uchar x2,uchar y2,uint ADC)
{
   dat0= ADC;
   temp=dat0*1*500/255;  //电压值转换,5V做为参考电压,分成256份。
   dispbuf[0]=temp%10;         //个位
   dispbuf[1]=temp/10%10; //十位
   dispbuf[2]=temp/100%10; //百位
   lcd_pos(x,y);
   write_dat(disp[dispbuf[2]]);
   lcd_pos(x1,y1);
   write_dat(disp[dispbuf[1]]);
   lcd_pos(x2,y2);
   write_dat(disp[dispbuf[0]]);
   adc[0]=dispbuf[2];
   adc[1]=dispbuf[1];
   adc[2]=dispbuf[0];
   
}
/**************************************
串口初始化
**************************************/
void init_u()
{
   TMOD=0x20;  //TMOD=0010 0000B,定时器T1工作于方式2
   SCON=0x40;  //SCON=0100 0000B,串口工作方式1 1起始位8数据位1停止位
   PCON=0x00;  //PCON=0000 0000B,波特率9600  晶振11.0592
   TH1=0xfd;    //根据规定给定时器T1赋初值
   TL1=0xfd;    //根据规定给定时器T1赋初值
   TR1=1;
}
/**************************************
串口发送
**************************************/
void send()
{
        uchar i=3,j;
        uart[0]=(Adc0832(0)*1*500/255)%255;
        uart[1]=(Adc0832(1)*1*500/255)%255;
        abc[0]=display[4];
    abc[1]=uart[0];
        abc[2]=uart[1];
        abc[3]=(~wengao)&0x1;
        abc[4]=(~shigao)&0x1;
        abc[5]=(~guang)&0x1;
        SBUF=i;
        while(TI!=1);
        TI=0;
        delay_1ms(10);
        for(j=0;j<6;j++)
        {
            SBUF=abc[j];
                   while(TI!=1);
            TI=0;
            delay_1ms(100);       
        }
}
/**************************************
控制函数
**************************************/
void kongzhi_wen()
{
        if(bijiao[0]+bijiao[1]*10+bijiao[2]*100>30)
        wengao=1;
                 if(bijiao[0]+bijiao[1]*10+bijiao[2]*100<10)
                wendi=1;
        else
        wengao=0;
        wendi=0;
}
/****************************************
函数功能:主程序
****************************************/
void main(void)
{      
  lcd_init();
  init_u();
  display_nm();
  guang=1;
  shigao=1;
  shidi=1;
  wengao=1;
  wendi=1;
  Read_Temperature();
  Disp_Temperature();
  while(1)
  {
        Read_Temperature();
        Disp_Temperature();
        action(0,5,0,6,0,7,Adc0832(0));
        if(adc[2]+adc[1]*10+adc[0]*100>180)
        guang=1;
         if(adc[2]+adc[1]*10+adc[0]*100<120)
        guang=0;
        action(1,5,1,6,1,7,Adc0832(1));
        if(adc[2]+adc[1]*10+adc[0]*100>180)
                  shigao=1;
                 if(adc[2]+adc[1]*10+adc[0]*100<90)
                shidi=1;
        else
        shidi=0;
        shigao=0;
        kongzhi_wen();
        send();
         }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top