|
附上程序代码
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char U8;
typedef unsigned int U16;
//*********定义变量区*******************
sbit lcdrs=P1^0; //数据命令选择控制
sbit lcdrw=P1^1; //读/写选择控制
sbit lcden=P1^2; //使能信号
sbit DHT = P3^3;
sbit fm=P3^4;
sbit jdq=P3^5;
U8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80,0x63 };
U8 code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
uchar tab_key[32];
uchar code tab[]="0123456789.-#de ";
uchar code tab1[]="Tem: " ;
uchar code tab2[]="RH : " ;
uchar n,temp,key;
uchar flag=0;
U8 U8FLAG,U8temp;
U8 shidu_shi,shidu_ge,wendu_shi,wendu_ge;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
void lcd_disp(); //LCD显示函数
void lcd_init(); //LCD初始化函数
void write_com(uchar); //写命令函数
void write_data(uchar); //写数据函数
void delay(uint); //延迟函数
void key_scan(); //键盘扫描函数
void key_manage1(); //键盘功能分配函数
void key_manage2();
void key_manage3();
void key_manage4();
void key_manage5();
void key_manage6();
void key_manage7();
void key_manage8();
void key_manage9();
void key_manage10();
void key_manage11();
void key_manage12();
void key_manage13();
void key_manage14();
void key_manage15();
void key_manage16();
void RH();
void warn();
void main()
{
lcd_init();
write_com(1);
while(1)
{
//P2=0;
RH();
key_scan();
lcd_disp();
if(n>8)
warn();
}
}
void warn()
{
uchar tem1,tem2,rh1,rh2;
uchar rh,tem;
rh= U8RH_data_H;
tem= U8T_data_H;
tem1=tab_key[0]*10+tab_key[1]+tab_key[3]/10;
tem2=tab_key[4]*10+tab_key[5]+tab_key[7]/10;
rh1=tab_key[8]*10+tab_key[9]+tab_key[11]/10;
rh2=tab_key[12]*10+tab_key[13]+tab_key[18]/10;
if(temtem2)
{
delay(1000);
fm=0;
delay(1000);
fm=1;
}
if(n>=16)
{if(rhrh2)
{
delay(115);
jdq=0;
delay(115);
jdq=1;
}
}
}
void Delay(U16 z)
{
U8 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DHT)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT)U8temp=1;
U8FLAG=2;
while((DHT)&&U8FLAG++);
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
void display(U8 shidu_shi,U8 shidu_ge,U8 wendu_shi,U8 wendu_ge)
{
P2=table[shidu_shi];
P1=wema[2];
Delay(5);
P2=table[shidu_ge];
P1=wema[3];
Delay(5);
P2=table[wendu_shi];
P1=wema[4];
Delay(5);
P2=table[wendu_ge];
P1=wema[5];
Delay(5);
}
void RH()
{
U8 rh,tem;
DHT=0;
Delay(34);
DHT=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
DHT=1;
if(!DHT)
{
U8FLAG=2;
while((!DHT)&&U8FLAG++);
U8FLAG=2;
while((DHT)&&U8FLAG++);
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DHT=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
shidu_shi=U8RH_data_H/10;
shidu_ge=U8RH_data_H%10;
wendu_shi=U8T_data_H/10;
wendu_ge=U8T_data_H%10;
}
display(shidu_shi,shidu_ge,wendu_shi,wendu_ge);
}
//**********LCD显示函数开始***********
void lcd_disp()
{
uchar a,i=0;
uchar m=0;
write_com(0x80);
for(i=0;i<4;i++)
{
write_data(tab1);
delay(0);
}
write_com(0x80+8);
write_data(tab[11]);
write_com(0x80+9);
write_data(tab[11]);
write_com(0x80+0x40);
for(i=0;i<4;i++)
{
write_data(tab2);
delay(0);
}
write_com(0x80+0x40+8);
write_data(tab[11]);
write_com(0x80+0x40+9);
write_data(tab[11]);
for(i=0;i<=n;i++)
{
a=tab_key;
if(i<4)
{
write_com(0x80+i+4);
write_data(tab[a]);
delay(0);
}
if(i>=4&&i<8)
{
write_com(0x80+i+6);
write_data(tab[a]);
delay(0);
}
if(i>=8&&i<12)
{
write_com(0x80+i+4+0x40-8);
write_data(tab[a]);
delay(0);
}
if(i>=12)
{
write_com(0x80+i+6+0x40-8);
write_data(tab[a]);
delay(0);
}
}
}
//**********LCD初始化函数开始*********
void lcd_init()
{
lcden=0;
lcdrw=0;
write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口
write_com(0x01);
write_com(0x0c); //开显示,显示光标,光标闪烁
write_com(0x06); //读写一个字符后,地址指针及光标加一整屏显示不移动
write_com(0x80); //设置光标指针
}
//**********写命令函数开始************
void write_com(uchar com)
{
lcdrs=0; //低电平写命令
P2=com; //写入命令
delay(5); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//**********写数据函数开始************
void write_data(uchar dat)
{
lcdrs=1; //低电平写数据
P2=dat; //写入命令
delay(5); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//**********键盘扫描函数开始****
void key_scan()
{
//**********扫描第一行*********
P0=0xfe;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xee:
key_manage1();
break;
case 0xde:
key_manage2();
break;
case 0xbe:
key_manage3();
break;
case 0x7e:
key_manage4();
break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}
//**********扫描第二行*********
P0=0xfd;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xed:
key_manage5();
break;
case 0xdd:
key_manage6();
break;
case 0xbd:
key_manage7();
break;
case 0x7d:
key_manage8();
break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}
//**********扫描第三行*********
P0=0xfb;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xeb:
key_manage9();
break;
case 0xdb:
key_manage10();
break;
case 0xbb:
key_manage11();
break;
case 0x7b:
key_manage12();
break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}
//**********扫描第四行*********
P0=0xf7;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xe7:
key_manage13();
break;
case 0xd7:
key_manage14();
break;
case 0xb7:
key_manage15();
break;
case 0x77:
key_manage16();
break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}
}
//*********延时函数开始**************
/*void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=50;j>0;j--);
}
*/
//******键盘功能分配函数群开始********
// 键盘功能示意图
// 设计者:聂金波
//** 1 ** 2 ** 3 ** 4 **
//** 5 ** 6 ** 7 ** 8 **
//** 9 ** 0 ** s ** c **
//** M1** M2** M3** M4**
void key_manage1()
{
tab_key[n]=0;
n++;
}
void key_manage2()
{
tab_key[n]=1;
n++;
}
void key_manage3()
{
tab_key[n]=2;
n++;
}
void key_manage4()
{
tab_key[n]=3;
n++;
}
void key_manage5()
{
tab_key[n]=4;
n++;
}
void key_manage6()
{
tab_key[n]=5;
n++;
}
void key_manage7()
{
tab_key[n]=6;
n++;
}
void key_manage8()
{
tab_key[n]=7;
n++;
}
void key_manage9()
{
tab_key[n]=8;
n++;
}
void key_manage10()
{
tab_key[n]=9;
n++;
}
void key_manage11()
{
tab_key[n]=10;
n++;
}
void key_manage12()
{
tab_key[n]=11;
n++;
}
void key_manage13()
{
tab_key[n]=12;
n++;
}
void key_manage14()
{
tab_key[n]=13;
n++;
}
void key_manage15()
{
tab_key[n]=14;
n++;
}
void key_manage16()
{
flag++;
} |
|