LCD补充
目录
LCD补充
tip:随着我们学的越来越多,代码长度越来越长,编译越来越慢,有没有超过内存是我们比较关心的一件事,通过以下方法可以实时看到写的代码的大小
回顾LCD
LCD补充功能
-- 1、有关在LCD上显示动图,可以用动图拆分软件
-- 2、更改LCD屏幕上显示字体和背景的颜色
-- 3、在LCD屏幕上画圆
tip:随着我们学的越来越多,代码长度越来越长,编译越来越慢,有没有超过内存是我们比较关心的一件事,通过以下方法可以实时看到写的代码的大小
回顾LCD
-- LCD屏幕的核心:
-
最重要的就是界面的设计(有专门的UI设计师) 对于产品,一个好看的外壳,一个好看的界面,这些都是很重要的。
-
屏幕:液晶面板+液晶控制芯片+pcb底板
-- 单片机是和谁通信?和液晶控制芯片通信
-- 液晶控制芯片的型号?ILI9341
-- 双方的通信方式是什么?8080或者spi,但是昨天使用的就是8080
-- 通信过程?8080读写操作(各种操作指令:0x2a,0x2b,0x2c)
-- 由于单片机上没有8080,所以又引入了FSMC
-- FSMC的本质是用来扩容的。
-- 那么为什么用FSMC呢?因为FSMC读写时序和8080读写时序接近。
因为单片机上没有8080,但与ILI9341通信必须用8080时序
-- 以上就是昨天LCD的理论内容的简单总结
LCD补充功能
-- 1、有关在LCD上显示动图,可以用动图拆分软件
先在网站上搜一个想要的动图,然后把他拖入动图拆分软件,然后保存,就可以得到一张一张的图片,然后把这些图片另存为jpg格式,然后用图片取模软件,生成.h文件
-- 可以上网搜动图,网上搜的图片改属性,点另存为就可以更改了,也可以截图改图片的属性,随后使用图片取模软件更改大小
-- 动图拆分软件 在线GIF图片帧拆分工具 - UU在线工具
-- 在lcd屏幕上显示动图,温度,湿度,时间的代码。注意获取温湿度的代码和获取时间,在lcd上显示数据这三部分的代码最好分开写,避免造成问题。
#include "2.h"
#include "3.h"const unsigned char *gImage[]={gImage_2,gImage_3};
u8 i=0;int main()
{//pwm_init();dht11_init();SysTick_Config(72000);usart_init();//exti_init();key_init();uint16_t b=100;uint8_t keyflag = 0;adc_init();relay_init();rtc_init();LCD_Init();//屏幕初始化一定要写到串口初始化后面LCD_DrawPoint(10,10);LCD_ShowString(0,0,80,16,16,"123456qwer"); //宽度字符是汉字的一半,是8,汉字是16,8*10//LCD_ShowPhoto(0,16,240,135,(uint8_t *)gImage_1);//必须是//摄氏度符号的取模显示*************************************************************************uint8_t xiang[]={0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00};/*"℃",0*///1对应的黑色uint16_t cnttt = 0;for(uint8_t i=0;i<32;i++) {for(uint8_t j=0;j<8;j++) {if((xiang[i] & (1<<(7-j))) != 0) {LCD_DrawPoint(cnttt%16+80, cnttt/16+16);}cnttt++; }}
//************************************************************************* while(1){if(lcdtime >= 200){lcdtime = 0;LCD_ShowPhoto(0,80,98,100,(uint8_t *)gImage[i++]);if(i>=2)i=0;sprintf(D_wen, "tem: %.2f℃",dht.tem);sprintf(D_shi, "hum: %.2f%RH", dht.hum);//printf("tem:%.2f℃\r\n",dht.tem);LCD_ShowString(0,16,strlen(D_wen)*8,16,16,D_wen);LCD_ShowString(0,32,120,16,16,D_shi);}if(dhtime >=2000){dhtime =0 ;get_dht11_val();}if(rtctime >=999){rtctime = 0;get_time();sprintf(D_time, "%04d/%02d/%02d %02d:%02d:%02d",a.tm_year+1900,a.tm_mon+1,a.tm_mday,a.tm_hour+8,a.tm_min,a.tm_sec);LCD_ShowString(0,48,180,16,16,D_time);}}
}
-- 效果图
-- 补充:各种图标
iconfont-阿里巴巴矢量图标库
-- 2、更改LCD屏幕上显示字体和背景的颜色
-- 首先更改官方函数,先找到显示字符串的函数
-- 然后更改函数,为了使我们更加方便的更改颜色,直接定义两个变量。先复制原来的官方函数然后更改函数名,在函数中添加两个变量,然后更改函数内容
//改变颜色
void LCD_ShowCharColor(u16 x,u16 y,u8 num,u8 size,u8 mode,u16 P_COLOR,u16 B_COLOR)
{ u8 temp,t1,t;u16 y0=y;u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数 num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)for(t=0;t<csize;t++){ if(size==12)temp=asc2_1206[num][t]; //调用1206字体else if(size==16)temp=asc2_1608[num][t]; //调用1608字体else if(size==24)temp=asc2_2412[num][t]; //调用2412字体else return; //没有的字库for(t1=0;t1<8;t1++){ if(temp&0x80)LCD_Fast_DrawPoint(x,y,P_COLOR); //最后一个参数是颜色else if(mode==0)LCD_Fast_DrawPoint(x,y,B_COLOR);temp<<=1;y++;if(y>=lcddev.height)return; //超区域了if((y-y0)==size){y=y0;x++;if(x>=lcddev.width)return; //超区域了break;}} }
}
-- 之后再将改过的函数放进显示字符串的函数中,同样加上显示颜色的变量。
void LCD_ShowStr(u16 x,u16 y,u8 size,u8 *p,u16 P_COLOR,u16 B_COLOR)
{ u8 x0=x;while((*p<='~')&&(*p>=' ')) //判断是不是非法字符!{ //LCD_ShowChar(x,y,*p,size,0);LCD_ShowCharColor(x,y,*p,size,0,P_COLOR,B_COLOR);p++;x+=size/2;if(x>(240-size/2)) //这一行写满了,该换行了{y+=size;x=0;//从头开始/ /也可以x=x0给一个起点坐标}}
}
-- 最后在主函数中更改显示的颜色即可
if(rtctime >=999){rtctime = 0;get_time();sprintf(D_time, "%04d/%02d/%02d %02d:%02d:%02d",a.tm_year+1900,a.tm_mon+1,a.tm_mday,a.tm_hour+8,a.tm_min,a.tm_sec);LCD_ShowString(0,48,180,16,16,D_time);}if(dhtime >=2000){dhtime =0 ;get_dht11_val();}if(lcdtime >= 2000){lcdtime =0 ;sprintf(D_wen, "tem: %.2f℃",dht.tem);sprintf(D_shi, "hum: %.2f%RH", dht.hum);//printf("tem:%.2f℃\r\n",dht.tem);LCD_ShowString(0,16,strlen(D_wen)*8,16,16,D_wen); LCD_ShowStr(0,32,16,D_shi,RED,YELLOW);//改变颜色的显示字符串}
-- 效果图
-- 3、在LCD屏幕上画圆
- 在bsp_lcd.c文件中,添加函数,并在.h文件中声明
//在LCD屏幕上画圆--------------------------------------------------------------------------------------
void LCD_Draw_ColorPoint(u16 x,u16 y,u16 P_COLOR)
{LCD_SetCursor(x,y); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAMLCD->LCD_RAM=P_COLOR;
}void LCD_Draw_ColorCircle(uint16_t x, uint16_t y, uint16_t r,u16 P_COLOR)
{/* Bresenham画圆算法 */int16_t a = 0, b = r;int16_t d = 3 - (r << 1); //算法决策参数/* 如果圆在屏幕可见区域外,直接退出 */if (x - r < 0 || x + r > 480 || y - r < 0 || y + r > 800) return;/* 开始画圆 */while(a <= b){LCD_Draw_ColorPoint(x - b, y - a,P_COLOR);LCD_Draw_ColorPoint(x + b, y - a,P_COLOR);LCD_Draw_ColorPoint(x - a, y + b,P_COLOR);LCD_Draw_ColorPoint(x - b, y - a,P_COLOR);LCD_Draw_ColorPoint(x - a, y - b,P_COLOR);LCD_Draw_ColorPoint(x + b, y + a,P_COLOR);LCD_Draw_ColorPoint(x + a, y - b,P_COLOR);LCD_Draw_ColorPoint(x + a, y + b,P_COLOR);LCD_Draw_ColorPoint(x - b, y + a,P_COLOR);a++;if(d < 0)d += 4 * a + 6;else{d += 10 + 4 * (a - b);b--;}LCD_Draw_ColorPoint(x + a, y + b,P_COLOR);}
}
-- main.c
LCD_Init();LCD_Draw_ColorCircle(120,120,85,RED);
-- 效果图
-- 可以参考该文章
【玩转嵌入式屏幕显示】(三)TFT-LCD屏幕打点 + 画线 + 画矩形 + 画圆Bresenham算法实现(基于打点函数,算法可移植到任何屏幕的驱动程序之上)_51CTO博客_嵌入式lcd显示圆形