12864LCD上显示温湿度.docx
- 文档编号:2193713
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:18
- 大小:61.64KB
12864LCD上显示温湿度.docx
《12864LCD上显示温湿度.docx》由会员分享,可在线阅读,更多相关《12864LCD上显示温湿度.docx(18页珍藏版)》请在冰点文库上搜索。
12864LCD上显示温湿度
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[]={"湿度:
"};
UCharcodeIcd3[]={"C"};
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总线由上拉电阻拉高主机延时20usdelay1();
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);
/*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 } 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 /****************************************************************************************************************/#defineuintunsignedint #defineucharunsignedchar #definenoACK0 #defineACK1 #defineSTATUS_REG_W0x06 #defineSTATUS_REG_R0x07 #defineMEASURE_TEMP0x03 #defineMEASURE_HUMI0x05 #defineRESET0x1eenum{TEMP,HUMI}; typedefunion//定义共用同类型 {unsignedinti;floatf; }value; /********************************************************位定义 ********************************************************/sbitlcdrs=P2^0; sbitlcdrw=P2^1; sbitlcden=P2^2; sbitSCK=P1^0; sbitDATA=P1^1;/********************************************************变量定义 ******************************************************uchartable2[]="SHT11温湿度检测"; UChartable3[]="温度为: C"; uchartable4[]="湿度为: "; UChartable5[]="."; UCharwendU[6]; UCharshidU[6]; ]******************************************************** 1ms 延时函数 ********************************************************/voiddelay(intz) {intx,y;for(x=z;x>0;x--)for(y=125;y>0;y--);} ]******************************************************** 50Us 延时函数 ****************************************************** voiddelay_50Us(Uintt) { Uintj; for(;t>0;t--) for(j=19;j>0;j--); } /********************************************************50ms延时函数 ********************************************************/ voiddelay_50ms(Uintt){ uintj;for(;t>0;t--)for(j=6245;j>0;j--); } /********************************************************12864液晶写指令 ********************************************************/voidwrite_12864com(ucharcom) {lcdrs=0; lcdrw=0; delay_50us (1); P0=com; lcden=1;delay_50us(10); lcden=0; delay_50us (2); } /********************************************************12864液晶写数据 ******************************************************lcdrs=1; lcdrw=0; delay_50us (1); P0=dat;lcden=1; delay_50us(10); lcden=0;delay_50us (2);} ]********************************************************12864液晶初始化 ******************************************************voidinit12864lcd(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液晶显示函数 ********************************************************/voiddisplay1(void) { uchari; write_12864com(0x80); for(i=0;i<18;i++) { write_dat(table2[i]); delay_50us (1);}}/********************************************************12864液晶显示函数 ********************************************************/voiddisplay2(void) { uchari; write_12864com(0x90); for(i=0;i<18;i++) { write_dat(table3[i]); delay_50us (1);}}/********************************************************12864液晶显示函数 ********************************************************/voiddisplay3(void) {uchari;write_12864com(0x88); for(i=0;i<8;i++) {write_dat(table4[i]);delay_50us (1);} } ]********************************************************12864液晶显示函数 ******************************************************voiddisplaywendu(void){uchari;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液晶显示函数 ********************************************************/voiddisplayshidu(void){ uchari; 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写字节程序 ********************************************************/chars_write_byte(unsignedcharvalue) unsignedchari,error=0;for(i=0x80;i>0;i>>=1){if(i&value)DATA=1;elseDATA=0; SCK=1;_nop_();_nop_();_nop_(); { //高位为1,循环右移 //和要发送的数相与,结果为发送的位 //延时3us SCK=0; DATA=1;//释放数据线 SCK=1; error=DATA;//检查应答信号,确认通讯正常 _nop_();_nop_();_nop_(); SCK=0; DATA=1; returnerror;//error=1通讯错误 } /********************************************************SHT11读字节程序 ********************************************************/chars_read_byte(unsignedcharack) { unsignedchari,val=0; DATA=1;//释放数据线for(i=0x80;i>0;i>>=1)//高位为1,循环右移{ SCK=1;if(DATA)val=(val|i);//读一位数据线的值 SCK=0;} DATA=! ack;//如果是校验,读取完后结束通讯;SCK=1; _nop_();_nop_();_nop_();//延时3usSCK=0; _nop_();_nop_();_nop_(); DATA=1;//释放数据线returnval;} /********************************************************SHT11启动传输 ********************************************************/voids_transstart(void) { DATA=1; SCK=0;//准备 _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0;}/********************************************************SHT11连接复位 //准备 //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位 //启动传输} voids_connectionreset(void){unsignedchari;DATA=1;SCK=0;for(i=0;i<9;i++){SCK=1;SCK=0;}s_transstart(); /********************************************************SHT11温湿度检测 ********************************************************/ chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode){ unsignederror=0; unsignedinti; s_transstart();//启动传输 switch(mode)//选择发送命令 {caseTEMP: error+=s_write_byte(MEASURE_TEMP); break;//测量温度 caseHUMI: error+=s_write_byte(MEASURE_HUMI); break;//测量湿度 default: break; for(i=0;i<65535;i++)if(DATA==0)break;//等待测量结束 if(DATA)error+=1;//如果长时间数据线没有拉低,说明测量错误*(p_va
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 LCD 显示 温湿度