proteus仿真 lcd1602显示

2019-07-15 12:11发布

proteus仿真中lcd1602能显示,到实际电路里面就不能显示了怎么回事
  求大神给看一下,解释一下原因,电路连线应该没问题。下面是程序,程序应该没问题吧?由于是新手,就有两积分/*头文件*/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define yh 0x80 //LCD第一行的初始位置
#define er 0x80+0x40 //LCD第二行初始位置
sbit DHT=P2^6;    //温湿度传感器数据线
sbit set_key=P1^5;   //"设置"键 K1
sbit add_key=P1^6;    //"加"键 K2
sbit cut_key=P1^7;    //  "减"键 K3
sbit mode_key=P1^4;    //  "模式"键 K0
sbit key=P1^3;    //  "报警"键 K4
sbit speak=P3^7;    //   蜂鸣器
sbit led=P1^2;   //   led
sbit rs=P2^0;   
sbit en=P2^2;   
unsigned char shiZ,check;
uchar temp,a;
uchar code tab1[]={"H:  %"};//显示的固定字符
uchar code tab2[]={"set:  %"};//显示的固定字符
uchar set_deta=60;
uchar set_deta1=40;
uchar XX[2];
uchar tate[2];
uchar read_data[5];
uchar flog4;
void delay_10us()
{
   uchar i;
   i--;i--;i--;i--;i--;i--;
}
void delay_1ms(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
   for(y=124;y>0;y--);
}
//****液晶写入指令函数****//
void write_1602com(uchar com)
{      
rs=0;//数据/指令选择置为指令
P0=com;//送入数据
delay_1ms(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay_1ms(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
//***液晶写入数据函数****//
void write_1602dat(uchar dat)
{
rs=1;//数据/指令选择置为数据
P0=dat;//送入数据
delay_1ms(1);
en=1; //en置高电平,为制造下降沿做准备
delay_1ms(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}
//***液晶初始化函数****//
void lcd_init()
{
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示
write_1602com(er+0);
for(a=0;a<7;a++)
{
    write_1602dat(tab2[a]);
}
   write_1602com(yh+0);
for(a=0;a<5;a++)
{
    write_1602dat(tab1[a]);
}
}
/*****************温湿度传感器DHT11 读一个字节函数******************/
uchar read_byte()
{
uchar value,i;
for(i=0;i<8;i++)  //一个字节有八位 所以用for循环
{
   value=value<<1;  //从字节高位开始读  需要移位
   while(DHT==0);
   delay_10us();
   delay_10us();
   delay_10us();
   if(DHT)      //判断读到是"1"还是"0"
   {
    value=value|0x01; //如果是"1" value的值就要加一
    while(DHT!=0)  //等待这一位数据结束 因为70us的高电平表示"1"
    {     //
     DHT=1;
    }
   }
}
return value;  //返回读到的这一字节数据
}
/*****************温湿度传感器DHT11 读数据函数******************/
/**一个完整的数据一共是五个字节******************/
void read_value()   
{
uchar i;
DHT=0;
delay_1ms(20);
DHT=1;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
if(DHT==0)
{
   while(DHT!=1);
   DHT=1;
   while(DHT==1);
   for(i=0;i<5;i++)
   {
    read_data=read_byte();//将读到的五个字节数据放到数组read_data【5】中
   }
}
}
/**********处理读到的温湿度数据******************/
void pro_value()
{
read_value();
temp=read_data[0]+read_data[1]+read_data[2]+read_data[3];
if(read_data[4]==temp)  //检测读到的数据是否正确   
   {
    shiZ=read_data[0];    //湿度整数部分
   }  
tate[0]=shiZ/10;  //将湿度的整数部分的十位和个位分开
tate[1]=shiZ%10;
write_1602com(yh+2);
for(a=0;a<2;a++)
{
    write_1602dat(tate[a]+0x30);
}
}
void pros_data()
{
XX[0]=set_deta/10;
XX[1]=set_deta%10;
write_1602com(er+4);
for(a=0;a<2;a++)
{
    write_1602dat(XX[a]+0x30);
}
}
void display1()     //设置显示
{
   pros_data();
}
void display2()     //设置显示
{
    write_1602com(er+4);
write_1602dat(set_deta1/10+0x30);
write_1602com(er+5);
write_1602dat(set_deta1%10+0x30);
}
void key_caa()
{
if(set_key==0)   
    {
     delay_1ms(5);
    if(set_key==0)
    {   
     flog4=!flog4;
     while(set_key==0);
    }
   }
   if(flog4==1)         
   {
     if(add_key==0)
     {
      delay_1ms(5);
      if(add_key==0)
      {
       set_deta=set_deta+1;
      while(add_key==0);
      if(set_deta>99)
      {
        set_deta=99;
      }
      }
     }
     if(cut_key==0)
     {
      delay_1ms(5);
      if(cut_key==0)
      {
       set_deta=set_deta-1;
      while(cut_key==0);
      if(set_deta<=0)
      {
       set_deta=0;
      }
      }
     }
       display1();  
      }
}
void baojing()
{
if(key==0)
{
   delay_1ms(5);
   if(key==0)
   {
    speak=0;
    led=1;
    while(key==0);
   }
}
else
{
    speak=1;
}
if(shiZ<set_deta)
{
     led=0;
}
else
{
     led=1;
}
}
/**********主函数******************/
void main()
{
lcd_init();
display1();
mode_key=1;
while(1)
{
   if(mode_key==0)
   {
    display2();
    pro_value();
    baojing();
   }
   else
   {
    key_caa();
      if(flog4==0)
    {
     display1();
     pro_value();
     baojing();
    }
   }
}   
}









友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。