在
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();
}
}
}
}
一周热门 更多>