在上一篇文章中没有写出来,在设计LCD1602显示模式的时候出现了一个难题,就是分屏显示数据的问题,因为要显示的东西比较多但是显示屏只支持16*2的显示,所以要设置多个界面显示。在这我设置了几个按键作为触发的条件,进行界面的切换。
void anjiank1() { if(k1==0) { delay1ms(10); if(k1==0) { lcd_init(); write_com(0x80); display(table1); write_com(0x80+0x40); display(table2); write_com(0x80+0x0A); display(table3); write_com(0x80+0x4A); display(table4); while(3) { xianshi1(); jinchu(); if(k2==0||k3==0) { break; } } } } } void anjiank3() { if(k3==0) { delay1ms(10); if(k3==0) { lcd_init(); while(2) { xianshi3(); if(k1==0||k2==0) { break; } } } } } void anjiank2() { if(k2==0) { delay1ms(10); if(k2==0) { lcd_init(); init_play(); while(4) { xianshi2(); ledss(); temp(); smoke(); if(k1==0||k3==0) { break; } } } } }
再设计的过程中我只考虑了温度的检测,没有进行湿度的检测,所以在检测的过程中使用DS18B20温度传感器就可以,这个温度传感器不需要数模转换器就可以进行显示,现实的结果要在LCD1602上显示出来,所以需要设置一下LCD的另一个显示界面。
DS18B20温度传感器的两个模式就是读和写模式,具体的时序图可以查询其他的CSDN的大神!!
void delay_18B20(unsigned int i) //延时1微秒 { while(i--); } void ds1820rst() //ds1820复位 { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd() //读数据 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata) //写数据 { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } read_temp() //读取温度值并转换 { uchar a,b; ds1820rst(); ds1820wr(0xcc); //跳过读序列号 ds1820wr(0x44); //启动温度转换 ds1820rst(); ds1820wr(0xcc); //跳过读序列号 ds1820wr(0xbe); //读取温度 a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); }