12864LCD上显示温湿度.docx
- 文档编号:28044707
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:24
- 大小:19.09KB
12864LCD上显示温湿度.docx
《12864LCD上显示温湿度.docx》由会员分享,可在线阅读,更多相关《12864LCD上显示温湿度.docx(24页珍藏版)》请在冰豆网上搜索。
12864LCD上显示温湿度
12864LCD显示温湿度
第一种方式:
/**********************DHT11与12864LCD************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharlcd_x,lcd_y,data_byte=0,count;
uintTH_data,TL_data,RH_data,RL_data,CK_data;
uintTH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
ucharnum;
sbitRS=P2^0;//并行指令,数据选择信号
sbitRW=P2^1;//读写信号
sbitEN=P2^2;//并行使能信号
sbitPSB=P2^3;//并串口选择信号
sbitRST=P2^5;//复位信号
sbitio=P1^0;//DHT11总线
voidread_io();//开始信号,读数据并校验
voiddelay(uinta);//延时函数
voidLCD_init();//LCD初始化程序
voidwrite_cmd(ucharcmd);//写指令
voidwrite_data(uchardat);//写数据
bitcheck_busy();//检测LCD忙信号
//voidclear_gcrom();//清除GCROM
voiddelay1();//10us延时
voidlcd_dis_code(uintcmd_addr,ucharnum,uchardis[]);//显示函数
voidlcd_pos(unsignedcharX,unsignedcharY);//LCD显示位置计算
ucharcodelcd[]={"温湿度检测系统"};
ucharcodelcd1[]={"温度:
"};
ucharcodelcd2[]={"湿度:
"};
ucharcodelcd3[]={"℃"};
ucharcodelcd4[]={"%RH"};
ucharstr1[]={""};
ucharstr2[]={""};
voidmain()
{
uchark,j;
LCD_init();
lcd_dis_code(0x80,16,lcd);
lcd_dis_code(0x88,9,lcd1);
lcd_dis_code(0x98,9,lcd2);
lcd_dis_code(0x8e,2,lcd3);
lcd_dis_code(0x9e,5,lcd4);
while
(1)
{
read_io();//读取温湿度数据
//clear_gcrom();
//湿度
for(k=0;k<2;k++)
{
lcd_pos(4,k+4);
write_data(str1[k]);
}
//clear_gcrom();
//温度
for(j=0;j<2;j++)
{
lcd_pos(3,j+4);
write_data(str2[j]);
}
delay(500);
}
}
voiddelay1()//延时10us
{
unsignedchari;
for(i=0;i<3;i++);
}
voidlcd_pos(unsignedcharX,unsignedcharY)
{
unsignedcharpos;
if(X==1)
{pos=0x80;}
elseif(X==2)
{pos=0x90;}
elseif(X==3)
{pos=0x88;}
else
{pos=0x98;}
write_cmd(Y|pos);//数据指针=80+地址变量
}
/**********************DHT11模块**********************/
ucharreceive_byte()//接收一个字节
{
uchari,temp;
for(i=0;i<8;i++)
{
count=2;
while((!
io)&&count++)//等待50us低电平结束,并防止死循环
temp=0;
delay1();
delay1();
delay1();
if(io==1)
{
temp=1;
count=2;
while(io&&count++);
}
else
temp=0;
data_byte<<=1;
data_byte|=temp;
}
return(data_byte);
}
voidread_io()//开始信号,读数据并校验
{
io=0;
delay(18);//主机拉低18ms
io=1;//DATA总线由上拉电阻拉高主机延时20us
delay1();
delay1();
delay1();
delay1();
io=1;//主机设置为输入高电平,判断从机响应信号
if(!
io)
{
count=2;
while((!
io)&&count++);//判断DHT11发出80us低电平响应信号是否结束
count=2;
while(io&&count++);//判断DHT11拉高总线80us高电平是否结束
RH_temp=receive_byte();
RL_temp=receive_byte();
TH_temp=receive_byte();
TL_temp=receive_byte();
CK_temp=receive_byte();
io=1;
num=(RH_temp+RL_temp+TH_temp+TL_temp);//数据校验
if(num==CK_temp)
{
RH_data=RH_temp;
RL_data=RL_temp;
TH_data=TH_temp;
TL_data=TL_temp;
CK_data=CK_temp;
}
}
//湿度整数部分
str1[0]=(char)(0x30+RH_data/10);
str1[1]=(char)(0x30+RH_data%10);
//温度整数部分
str2[0]=(char)(0x30+TH_data/10);
str2[1]=(char)(0x30+TH_data%10);
}
/**********************END**********************/
/**********************12864模块程序**********************/
/*voidclear_gcrom()
{
uchari,j,k;
lcd_x=0x80;
lcd_y=0x80;
write_cmd(0x34);
for(i=0;i<2;i++)//上下两屏幕
{
for(j=0;j<32;j++)
{
write_cmd(lcd_y+j);
write_cmd(lcd_x);
for(k=0;k<16;k++)
{
write_data(0x00);
}
}
lcd_x=0x88;
}
write_cmd(0x36);
write_cmd(0x30);
}*/
voidlcd_dis_code(uintcmd_addr,ucharnum,uchardis[])
{
uinti;
write_cmd(cmd_addr);
for(i=0;i write_data(dis[i]); } voidLCD_init() { PSB=1; RST=0; delay(5); RST=1; delay(5); write_cmd(0x34);//扩充指令 delay(5); write_cmd(0x30);//基本指令 delay(5); write_cmd(0x0c);//显示开关光标 delay(5); write_cmd(0x01);//清屏 delay(5); } bitcheck_busy() { bittemp; RS=0; RW=1; EN=1; delay(5); temp=(bit)(P0&0x80);//按位与操作 EN=0; return(temp); } voidwrite_cmd(ucharcmd) { while(check_busy()); RS=0; RW=0; EN=0; delay(5); P0=cmd; delay(5); EN=1; delay(5); EN=0; } voidwrite_data(uchardat) { while(check_busy()); RS=1; RW=0; EN=0; P0=dat; delay(5); EN=1; delay(5); EN=0; } voiddelay(uinta) { uchari; while(a--) { for(i=0;i<113;i++); } } /**********************END**********************/ 第二种编程方式,其实大体都差不了多少 #include /******************************************************** 宏定义 ********************************************************/ #define uint unsigned int #define uchar unsigned char #define noACK 0 #define ACK 1 #define STATUS_REG_W 0x06 #define STATUS_REG_R 0x07 #define MEASURE_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0x1e enum {TEMP,HUMI}; typedef union //定义共用同类型 { unsigned int i; float f; } value; /******************************************************** 位定义 ********************************************************/ sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2; sbit SCK = P1^0; sbit DATA = P1^1; /******************************************************** 变量定义 ********************************************************/ uchar table2[]="SHT11 温湿度检测"; uchar table3[]="温度为: ℃"; uchar table4[]="湿度为: "; uchar table5[]="."; uchar wendu[6]; uchar shidu[6]; /******************************************************** 1ms延时函数 ********************************************************/ void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=125;y>0;y--); } /******************************************************** 50us延时函数 ********************************************************/ void delay_50us(uint t) { uint j; for(;t>0;t--) for(j=19;j>0;j--); } /******************************************************** 50ms延时函数 ********************************************************/ void delay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } /******************************************************** 12864液晶写指令 ********************************************************/ void write_12864com(uchar com) { lcdrs=0; lcdrw=0; delay_50us (1); P0=com; lcden=1; delay_50us(10); lcden=0; delay_50us (2); } /******************************************************** 12864液晶写数据 ********************************************************/ void write_dat(uchar dat) { lcdrs=1; lcdrw=0; delay_50us (1); P0=dat; lcden=1; delay_50us(10); lcden=0; delay_50us (2); } /******************************************************** 12864液晶初始化 ********************************************************/ void init12864lcd(void) { delay_50ms (2); write_12864com(0x30); delay_50us(4); write_12864com(0x30); delay_50us(4); write_12864com(0x0f); delay_50us(4); write_12864com(0x01); delay_50us(240); write_12864com(0x06); delay_50us(10); write_12864com(0x0c); delay_50us(10); } /******************************************************** 12864液晶显示函数 ********************************************************/ void display1(void) { uchar i; write_12864com(0x80); for(i=0;i<18;i++) { write_dat(table2[i]); delay_50us (1); } } /******************************************************** 12864液晶显示函数 ********************************************************/ void display2(void) { uchar i; write_12864com(0x90); for(i=0;i<18;i++) { write_dat(table3[i]); delay_50us (1); } } /******************************************************** 12864液晶显示函数 ********************************************************/ void display3(void) { uchar i; write_12864com(0x88); for(i=0;i<8;i++) { write_dat(table4[i]); delay_50us (1); } } /******************************************************** 12864液晶显示函数 ********************************************************/ void displaywendu(void) { uchar i; write_12864com(0x94); for(i=0;i<3;i++) { write_dat(wendu[i]); delay_50us (1); } for(i=0;i<1;i++) { write_dat(table5[i]); delay_50us (1); } for(i=4;i<5;i++) { write_dat(wendu[i]); delay_50us (1); } } /******************************************************** 12864液晶显示函数 ********************************************************/ void displayshidu(void) { uchar i; write_12864com(0x8C); for(i=0;i<3;i++) { write_dat(shidu[i]); delay_50us (1); } for(i=0;i<1;i++) { write_dat(table5[i]); delay_50us (1); } for(i=4;i<5;i++) { write_dat(shidu[i]); delay_50us (1); } } /******************************************************** SHT11写字节程序 ********************************************************/ char s_write_byte(unsigned char value) { unsigned char i,error=0; for (i=0x80;i>0;i>>=1) //高位为1,循环右移 { if (i&value) DATA=1; //和要发送的数相与,结果为发送的位 else DATA=0; SCK=1; _nop_();_nop_();_nop_(); //延时3us SCK=0; } DATA=1; //释放数据线 SCK=1; error=DATA; //检查应答信号,确认通讯正常 _nop_();_nop_();_nop_(); SCK=0; DATA=1; return error; //error=1 通讯错误 } /******************************************************** SHT11读字节程序 *
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 LCD 显示 温湿度