记录一下修改LCD例程显示DHT11温湿度实验的过程

老规矩上链接

链接:https://pan.baidu.com/s/1wIbGhExWudEC0KbKO6zUXQ
提取码:i2j5

IC:stm32f103vet6

硬件:DHT11、1.44寸LCD屏

接线方法:

DH11---stm32

VCC ---   3.3V

GND ---   GND

DATA ---  PC4

 

LCD---stm32

VCC --- 5V

GND --- GND

SCL --- PB13

SDA --- PB15

RES --- PB12

DC --- PB10

CS浮空

BL浮空

 

因为卖家提供的代码函数部分有问题这里就不在下面贴出代码了

需要的自行去百度网盘下载

讲一下修改了什么地方

 

就是在User下的gui.c里面的函数LCD_ShowChar

stm32单片机WiFi连接Android stm32单片机连接lcd_屏幕显示

stm32单片机WiFi连接Android stm32单片机连接lcd_数据_02

1 //******************************************************************
 2 //函数名:  LCD_ShowChar
 3 //功能:    显示单个英文字符
 4 //输入参数:(x,y):字符显示位置起始坐标
 5 //            fc:前置画笔颜色
 6 //            bc:背景颜色
 7 //            num:数值(0-94)
 8 //            size:字体大小
 9 //            mode:模式  0,填充模式;1,叠加模式
10 //返回值:  无
11 //修改记录:无
12 //******************************************************************  
13 void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
14 {  
15   u8 temp;
16   u8 pos,t;
17     u16 colortemp=POINT_COLOR;      
18            
19     num=num-' ';//得到偏移后的值
20     LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
21     if(!mode) //非叠加方式
22     {
23         
24         for(pos=0;pos<size;pos++)
25         {
26             if(size==12)temp=asc2_1206[num][pos];//调用1206字体
27             else temp=asc2_1608[num][pos];         //调用1608字体
28             for(t=0;t<size/2;t++)
29             {                 
30                 if(temp&0x01)LCD_WR_DATA(fc); 
31                 else LCD_WR_DATA(bc); 
32                 temp>>=1; 
33                 
34             }
35             
36         }    
37     }else//叠加方式
38     {
39         for(pos=0;pos<size;pos++)
40         {
41             if(size==12)temp=asc2_1206[num][pos];//调用1206字体
42             else temp=asc2_1608[num][pos];         //调用1608字体
43             for(t=0;t<size/2;t++)
44             {   
45                 POINT_COLOR=fc;              
46                 if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点    
47                 temp>>=1; 
48             }
49         }
50     }
51     POINT_COLOR=colortemp;    
52     LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏                      
53 }

问题函数

注意这里引入参数的最后一位是0是覆盖模式,1是叠加模式

也就是选0的话在这个地方显示的东西是把之前显示的给覆盖掉

问题就是显示温湿度选0的话不能正常显示数值,显示是一个大约4*4的方块,搞不懂是什么问题,没有时间去深究

选0显示中文的话又可以正常使用,那好吧那就不管那么多选1叠加模式

那么要如何在显示新内容前删除之前显示的内容呢

于是我在LCD_Clear(BLACK)清除屏幕内容的基础上写了一个新函数rwLCD_Clear,放在lcd.c的最下面

stm32单片机WiFi连接Android stm32单片机连接lcd_屏幕显示

stm32单片机WiFi连接Android stm32单片机连接lcd_数据_02

1 //自定义的覆盖函数2020-2-8
 2 void rwLCD_Clear(u16 x, u16 y, u16 x1, u16 y1, u16 Color)
 3 {
 4     u16 i,j;      
 5     LCD_SetWindows(x,y,x1,y1);      
 6     for(i=0;i<lcddev.width;i++)
 7     {
 8         for(j=0;j<lcddev.height;j++)
 9         LCD_WR_DATA_16Bit(Color);    //写入数据      
10     }
11 }

代码中修改的清除函数

解释一下参数的含义

rwLCD_Clear(u16 x, u16 y, u16 x1, u16 y1, u16 Color)

x和y是组合选择出第一个点

x1和y1是组合选择出第二点

将(x,y)和(x1,y1)这两个点做一个长方形,也就是面积从x到x1,y到y1的区域

然后将这个面积里面的颜色换成Color

只要Color选择BLACK也就达到了清除屏幕显示内容的目的

 

因为这个问题这个工程代码写的也不是挺好,之后有时间再来修改一下,最近在忙一个项目

简单放两张测试的图片来

这是接线没问题,成功从DHT11采集到数据的照片

stm32单片机WiFi连接Android stm32单片机连接lcd_数据_05

 

这个是将dht11的线断开,下面的采集成功会替换成采集失败,如果重新接上dht11就是显示采集成功

stm32单片机WiFi连接Android stm32单片机连接lcd_屏幕显示_06

 

今天也是充满希望的一天

stm32单片机WiFi连接Android stm32单片机连接lcd_屏幕显示_07