LCD补充

打印 上一主题 下一主题

主题 660|帖子 660|积分 1980

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上表现数据这三部分的代码最好分开写,避免造成问题。
  1. #include "2.h"
  2. #include "3.h"
  3. const unsigned char *gImage[]={gImage_2,gImage_3};
  4. u8 i=0;
  5. int main()
  6. {
  7.     //pwm_init();
  8.     dht11_init();
  9.     SysTick_Config(72000);
  10.     usart_init();
  11.     //exti_init();
  12.     key_init();
  13.     uint16_t b=100;
  14.     uint8_t keyflag = 0;
  15.    
  16.     adc_init();
  17.     relay_init();
  18.     rtc_init();
  19.    
  20.    
  21.     LCD_Init();//屏幕初始化一定要写到串口初始化后面
  22.    
  23.     LCD_DrawPoint(10,10);
  24.     LCD_ShowString(0,0,80,16,16,"123456qwer");                                                //宽度字符是汉字的一半,是8,汉字是16,8*10
  25.     //LCD_ShowPhoto(0,16,240,135,(uint8_t *)gImage_1);//必须是
  26. //摄氏度符号的取模显示*************************************************************************
  27.     uint8_t xiang[]=
  28.     {0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,
  29.     0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00};/*"℃",0*/
  30.    
  31.     //1对应的黑色
  32.     uint16_t cnttt = 0;
  33.     for(uint8_t i=0;i<32;i++) {
  34.         for(uint8_t j=0;j<8;j++) {
  35.             if((xiang[i] & (1<<(7-j))) != 0) {
  36.                 LCD_DrawPoint(cnttt%16+80, cnttt/16+16);
  37.             }
  38.             cnttt++;       
  39.         }
  40.     }
  41. //*************************************************************************       
  42.    
  43.    
  44.    
  45.     while(1)
  46.     {
  47.         
  48.         if(lcdtime >= 200)
  49.         {
  50.             lcdtime = 0;
  51.             LCD_ShowPhoto(0,80,98,100,(uint8_t *)gImage[i++]);
  52.             if(i>=2)i=0;
  53.             sprintf(D_wen, "tem: %.2f℃",dht.tem);
  54.             sprintf(D_shi, "hum: %.2f%RH", dht.hum);
  55.             //printf("tem:%.2f℃\r\n",dht.tem);
  56.             LCD_ShowString(0,16,strlen(D_wen)*8,16,16,D_wen);
  57.             LCD_ShowString(0,32,120,16,16,D_shi);
  58.         }
  59.         
  60.         if(dhtime >=2000)
  61.         {
  62.             dhtime =0 ;
  63.             get_dht11_val();
  64.         }
  65.         
  66.         
  67.         if(rtctime >=999)
  68.         {
  69.             rtctime = 0;
  70.             get_time();
  71.             
  72.             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);
  73.             
  74.             LCD_ShowString(0,48,180,16,16,D_time);
  75.         }
  76.     }
  77. }
  78.         
复制代码

-- 结果图 

-- 补充:各种图标
iconfont-阿里巴巴矢量图标库

-- 2、更改LCD屏幕上表现字体和配景的颜色

-- 起首更改官方函数,先找到表现字符串的函数 

-- 然后更改函数,为了使我们更加方便的更改颜色,直接定义两个变量。先复制原来的官方函数然后更改函数名,在函数中添加两个变量,然后更改函数内容 

  1. //改变颜色
  2. void LCD_ShowCharColor(u16 x,u16 y,u8 num,u8 size,u8 mode,u16 P_COLOR,u16 B_COLOR)
  3. {                                                            
  4.   u8 temp,t1,t;
  5.     u16 y0=y;
  6.     u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数       
  7.     num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
  8.     for(t=0;t<csize;t++)
  9.     {   
  10.         if(size==12)temp=asc2_1206[num][t];                  //调用1206字体
  11.         else if(size==16)temp=asc2_1608[num][t];        //调用1608字体
  12.         else if(size==24)temp=asc2_2412[num][t];        //调用2412字体
  13.         else return;                                                                //没有的字库
  14.         for(t1=0;t1<8;t1++)
  15.         {                            
  16.             if(temp&0x80)LCD_Fast_DrawPoint(x,y,P_COLOR);                                                        //最后一个参数是颜色
  17.             else if(mode==0)LCD_Fast_DrawPoint(x,y,B_COLOR);
  18.             temp<<=1;
  19.             y++;
  20.             if(y>=lcddev.height)return;                //超区域了
  21.             if((y-y0)==size)
  22.             {
  23.                 y=y0;
  24.                 x++;
  25.                 if(x>=lcddev.width)return;        //超区域了
  26.                 break;
  27.             }
  28.         }           
  29.     }                                            
  30. }   
复制代码
-- 之后再将改过的函数放进表现字符串的函数中,同样加上表现颜色的变量。
  1. void LCD_ShowStr(u16 x,u16 y,u8 size,u8 *p,u16 P_COLOR,u16 B_COLOR)
  2. {         
  3.     u8 x0=x;
  4.     while((*p<='~')&&(*p>=' '))                //判断是不是非法字符!
  5.     {  
  6.             //LCD_ShowChar(x,y,*p,size,0);
  7.         
  8.         LCD_ShowCharColor(x,y,*p,size,0,P_COLOR,B_COLOR);
  9.             p++;
  10.             x+=size/2;
  11.         
  12.         if(x>(240-size/2))                                        //这一行写满了,该换行了
  13.         {
  14.             y+=size;
  15.             x=0;//从头开始/                                /也可以x=x0给一个起点坐标
  16.         }
  17.     }  
  18. }
复制代码
-- 最后在主函数中更改表现的颜色即可
  1.     if(rtctime >=999)
  2.     {
  3.         rtctime = 0;
  4.         get_time();
  5.         
  6.         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);
  7.         
  8.         LCD_ShowString(0,48,180,16,16,D_time);
  9.     }
  10.     if(dhtime >=2000)
  11.     {
  12.         dhtime =0 ;
  13.         get_dht11_val();
  14.     }
  15.     if(lcdtime >= 2000)
  16.     {
  17.         lcdtime =0 ;
  18.         
  19.         sprintf(D_wen, "tem: %.2f℃",dht.tem);
  20.         sprintf(D_shi, "hum: %.2f%RH", dht.hum);
  21.         //printf("tem:%.2f℃\r\n",dht.tem);
  22.         LCD_ShowString(0,16,strlen(D_wen)*8,16,16,D_wen);       
  23.         LCD_ShowStr(0,32,16,D_shi,RED,YELLOW);//改变颜色的显示字符串
  24.     }
复制代码
-- 结果图 

-- 3、在LCD屏幕上画圆



  • 在bsp_lcd.c文件中,添加函数,并在.h文件中声明
  1. //在LCD屏幕上画圆--------------------------------------------------------------------------------------
  2. void LCD_Draw_ColorPoint(u16 x,u16 y,u16 P_COLOR)
  3. {
  4.     LCD_SetCursor(x,y);                //设置光标位置
  5.     LCD_WriteRAM_Prepare();        //开始写入GRAM
  6.     LCD->LCD_RAM=P_COLOR;
  7. }
  8. void LCD_Draw_ColorCircle(uint16_t x, uint16_t y, uint16_t r,u16 P_COLOR)
  9. {
  10.     /* Bresenham画圆算法 */
  11.     int16_t a = 0, b = r;
  12.     int16_t d = 3 - (r << 1);                //算法决策参数
  13.         
  14.     /* 如果圆在屏幕可见区域外,直接退出 */
  15.     if (x - r < 0 || x + r > 480 || y - r < 0 || y + r > 800)
  16.                 return;
  17.         
  18.     /* 开始画圆 */
  19.     while(a <= b)
  20.     {
  21.         LCD_Draw_ColorPoint(x - b, y - a,P_COLOR);
  22.         LCD_Draw_ColorPoint(x + b, y - a,P_COLOR);
  23.         LCD_Draw_ColorPoint(x - a, y + b,P_COLOR);
  24.         LCD_Draw_ColorPoint(x - b, y - a,P_COLOR);
  25.         LCD_Draw_ColorPoint(x - a, y - b,P_COLOR);
  26.         LCD_Draw_ColorPoint(x + b, y + a,P_COLOR);
  27.         LCD_Draw_ColorPoint(x + a, y - b,P_COLOR);
  28.         LCD_Draw_ColorPoint(x + a, y + b,P_COLOR);
  29.         LCD_Draw_ColorPoint(x - b, y + a,P_COLOR);
  30.         a++;
  31.         if(d < 0)
  32.             d += 4 * a + 6;
  33.         else
  34.         {
  35.             d += 10 + 4 * (a - b);
  36.             b--;
  37.         }
  38.         LCD_Draw_ColorPoint(x + a, y + b,P_COLOR);
  39.     }
  40. }
复制代码
-- main.c
  1. LCD_Init();
  2. LCD_Draw_ColorCircle(120,120,85,RED);
复制代码
-- 结果图 

-- 可以参考该文章


【玩转嵌入式屏幕表现】(三)TFT-LCD屏幕打点 + 画线 + 画矩形 + 画圆Bresenham算法实现(基于打点函数,算法可移植到任何屏幕的驱动步伐之上)_51CTO博客_嵌入式lcd表现圆形

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表