搜索
查看: 2064|回复: 0

[分享] 【STM32G491试用】+驱动NOKIA LCD5110并移植 ZLGGUI

[复制链接]

该用户从未签到

14

主题

237

帖子

3

蝴蝶豆

金牌会员

最后登录
2023-1-28
发表于 2021-3-22 12:19:56 | 显示全部楼层 |阅读模式
周末整理东西,翻出了老早之前的5110的屏幕,点阵是84*48。看到它,我就想到了我的青葱岁月,真是时光如梭啊~5110虽然简单,但是用它来学习单色屏,确实一个很好的选择。我们往往能从最原始的某些东西的原型,看出物质的本质。
5110的引出引脚分别为:RST、 CE 、DC 、DIN 、CLK 、VCC 、BL 、GND。我把它插到我做的一个Ardunio接口的万能板上,
让它和MCU引脚相连。上面接口,下面连了个触摸按键!
M1.jpg

我们用模拟SPI的方式来驱动5110。

我们打开STM32CUBEMX来配置引脚:
S1.png
生成代码,cubeMx的事就到此结束。
我们打开MDK工程,开始写LCD5110的驱动代码:
C文件:
  1. #include "LCD5110.h"
  2. #include "Pixel_EN.h"
  3. #include "delay.h"
  4. #include "string.h"
  5. #include "font.h"
  6. #include "icon.h"

  7. //-------------------------------------------------------------------
  8. //        Nokia5510指令集
  9. //  D7  D6  D5  D4  D3  D2  D1  D0
  10. //  0   0   1   0   0   PD  V   H
  11. //                      |   |   |_______1->扩展指令集  0->基本指令集
  12. //                      |   |___________1->垂直寻址    0->水平寻址
  13. //                      |_______________1->低功耗模式  0->正常模式
  14. //-------------------------------------------------------------------
  15. //        显示模式
  16. //  D7  D6  D5  D4  D3  D2  D1  D0
  17. //  0   0   0   0   1   D   0   E
  18. //                      |       |_______0    0    1    1
  19. //                      |_______________0    1    0    1
  20. //                                      白屏 正常 全显 反转
  21. //-------------------------------------------------------------------
  22. static u8 lcd_buf[84*6] ;
  23. unsigned char LcdDispBuf[GUI_LCD_YMAX/8][GUI_LCD_XMAX] ={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};

  24. /**************************************
  25. 为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法
  26. ***************************************/
  27. const u8 MaskTab[] =         {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  28. /*******************************************************************************
  29. * Function Name  : LCD_Init
  30. * Description    : LCD初始化
  31. * Input          : None        
  32. * Output         : None
  33. * Return         : None
  34. *******************************************************************************/
  35. void LCD_Init(void)
  36. {
  37.                 //GPIO配置
  38.           LCD_GPIO_Configuration();
  39.           //复位LCD_低电平脉冲
  40.           LCD_RST_L();               
  41.           delay_ms(1);
  42.            LCD_RST_H();
  43.           //复位串行接口_高电平脉冲
  44.           LCD_CE_H();
  45.           delay_ms(1);
  46.           LCD_CE_L();
  47.           //设置LCD
  48.     LCD_Send(0x21, DC_CMD);        //使用扩展命令设置LCD模式
  49.     LCD_Send(0xC8, DC_CMD);        //设置偏置电压
  50.     LCD_Send(0x06, DC_CMD);        //温度校正
  51.     LCD_Send(0x13, DC_CMD); //1:48
  52.     LCD_Send(0x20, DC_CMD);        //使用基本命令
  53.     LCD_Send(0x0E, DC_CMD);        //设定显示模式,反转显示
  54. }

  55. //更新显存到LCD                 
  56. void LCD_Refresh_Gram(void)
  57. {
  58.         LCD_Disp_Buf();
  59. }

  60. /*******************************************************************************
  61. * Function Name  : LCD_SetContrast
  62. * Description    : 设置LCD对比度(对比度范围: 0~127)
  63. * Input          : u8 contrast
  64. * Output         : None
  65. * Return         : None
  66. *******************************************************************************/
  67. void LCD_SetContrast(u8 contrast)
  68. {
  69.     LCD_Send(0x21, DC_CMD);
  70.     LCD_Send(0x80 | contrast, DC_CMD);
  71.     LCD_Send(0x20, DC_CMD);
  72. }
  73. /*******************************************************************************
  74. * Function Name  : LCD_SetXY
  75. * Description    : 设置LCD当前坐标
  76. * Input          : u8 X, u8 Y          X:0-83  Y:0-5
  77. * Output         : None
  78. * Return         : None
  79. *******************************************************************************/
  80. void LCD_SetXY(u8 X, u8 Y)
  81. {
  82.         if (X>83) X = 83;
  83.         if (Y>5) Y = 5;

  84.         LCD_Send(0x80 | X, DC_CMD);    // 列
  85.         delay_ms(10);  
  86.         LCD_Send(0x40 | Y, DC_CMD);    // 行
  87. }
  88. /*******************************************************************************
  89. * Function Name  : LCD_Clear
  90. * Description    : LCD清屏
  91. * Input          : None        
  92. * Output         : None
  93. * Return         : None
  94. *******************************************************************************/
  95. void LCD_Clear(void)
  96. {
  97.         u16 i;
  98.   LCD_Send(0x80, DC_CMD);
  99.         delay_ms(1);
  100.         LCD_Send(0x40, DC_CMD);
  101.         for(i=0; i<504; i++)
  102.                 LCD_Send(0, DC_DATA);         
  103. }

  104. //画点
  105. void LCD_DrawPoint(u8 x, u8 y, u8 Color)                 //(0,0)   //1 = Black.
  106. {
  107.         if(x>GUI_LCD_XMAX||y>GUI_LCD_YMAX)return;//超出范围了.
  108.         
  109.         if(Color == BLACK)
  110.         {
  111.                 LcdDispBuf[y/8][x] |= MaskTab[y%8];

  112.         }
  113.         else if(Color == WHITE)
  114.         {
  115.                 LcdDispBuf[y/8][x] &=  ~MaskTab[y%8];

  116.         }
  117. }

  118. void LCD_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)
  119. {
  120.         u8 x,y;  
  121.         for(x=x1;x<=x2;x++)
  122.         {
  123.                 for(y=y1;y<=y2;y++)LCD_DrawPoint(x,y,dot);
  124.         }                                                                                                            
  125.         LCD_Refresh_Gram();//更新显示
  126. }
  127. /*******************************************************************************
  128. * Function Name  : LCD_Send
  129. * Description    : 向LCD发送数据
  130. * Input          : u8 data, DCType dc
  131. * Output         : None
  132. * Return         : None
  133. *******************************************************************************/
  134. void LCD_Send(u8 data, DCType dc)
  135. {
  136.         u8 i=8;

  137.         if (dc==DC_CMD)
  138.                 LCD_DC_CMD();        //发送命令
  139.         else
  140.                 LCD_DC_DATA();//发送数据
  141.         while (i--)
  142.         {
  143.                 LCD_CLK_L();
  144.                 if(data&0x80)
  145.                         LCD_MOSI_H();        /* MSB first */
  146.                 else
  147.                         LCD_MOSI_L();
  148.                 LCD_CLK_H();
  149.                 data <<= 1;                /* Data shift */
  150.         }
  151. }

  152. /*******************************************************************************
  153. * Function Name  : LCD_Write_Char
  154. * Description    : 向LCD写一个英文字符  显示6(宽)*8(高)点阵列数字字母符号等半角类
  155. * Input          : u8 ascii  84/6=14  一行共可写14个字 row 范围0~13 page:0~5
  156. * Output         : None
  157. * Return         : None
  158. *******************************************************************************/
  159. void LCD_Write_Char_6X8(u8 row,u8 page,u8 ascii)
  160. {
  161.     u8 n;

  162.                 LCD_SetXY(row*6, page);// 列,页

  163.                 ascii -= 32; //ASCII码-32
  164.                 for (n=0; n<6; n++)
  165.                 LCD_Send(Font6x8[ascii][n], DC_DATA);
  166. }

  167. /*---------------------------------------------
  168. LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
  169. 输入参数:c:显示的字符;
  170. 编写日期:20080918
  171. -----------------------------------------------*/
  172. void LCD_write_Char_8X16(u8 row, u8 page,u8 c) //row:列 page:页 dd:字符
  173. {
  174.         unsigned char i;         
  175.         
  176.         LCD_SetXY(row*8, page);// 列,页
  177.         c -= 32; //ASCII码-32
  178.         
  179.         for(i=0; i<8;i++)
  180.         {
  181.                 //LCD_Send(shuzi[c*16+i],DC_DATA);
  182.                 LCD_Send(Font8x16[c][i],DC_DATA);
  183.         }
  184.         
  185.     LCD_SetXY(row*8, page+1);// 列,页
  186.         for(i=8; i<16;i++)
  187.         {
  188.                 //LCD_Send(shuzi[c*16+i],DC_DATA);
  189.                 LCD_Send(Font8x16[c][i],DC_DATA);
  190.         }                 
  191. }
  192. /*******************************************************************************
  193. * Function Name  : LCD_Write_Char
  194. * Description    : 向LCD写一个汉字
  195. * Input          : u8 ascii
  196. * Output         : None
  197. * Return         : None
  198. *******************************************************************************/
  199. void LCD_Write_Hanzi_12x16(u8 X, u8 Y,u8 GBK)
  200. {
  201.         u8 n;
  202.         LCD_SetXY(X*12,Y);
  203.         for (n=0; n<12; n++)
  204.         {      
  205.                                  LCD_Send(Font12x16_chinese[GBK][n], DC_DATA);
  206.         }

  207.         delay_ms(10);
  208.         LCD_SetXY(X*12,Y+1);
  209.         for (n=12; n<24; n++)
  210.         {      
  211.                          LCD_Send(Font12x16_chinese[GBK][n], DC_DATA);
  212.         }
  213.                         
  214. }

  215. void LCD_Write_Hanzi_16x16(u8 X, u8 Y,u8 GBK)
  216. {
  217.         u8 n;
  218.         LCD_SetXY(X*16,Y);
  219.         for (n=0; n<16; n++)
  220.         {      
  221.                                  LCD_Send(Font16x16_chinese[GBK][n], DC_DATA);
  222.         }

  223.         delay_ms(10);
  224.         LCD_SetXY(X*16,Y+1);
  225.         for (n=16; n<32; n++)
  226.         {      
  227.                          LCD_Send(Font16x16_chinese[GBK][n], DC_DATA);
  228.         }
  229.                         
  230. }
  231. /*******************************************************************************
  232. * Function Name  : LCD_Write_Char
  233. * Description    : 向LCD写一个图像
  234. * Input          : u8 ascii
  235. * Output         : None
  236. * Return         : None
  237. *******************************************************************************/
  238. void LCD_Write_Image(void)
  239. {
  240.      u8 row,column;
  241.       
  242.            for (row=0; row<6; row++)
  243.        {LCD_SetXY(0,row);
  244.                                         for (column=0; column<84; column++)
  245.                   {      
  246.                            LCD_Send(image1[row][column], DC_DATA);
  247.                         }
  248.            
  249.           delay_ms(100);
  250.                  
  251.                                 }
  252.                         
  253. }
  254. /*******************************************************************************
  255. * Function Name  : LCD_Write_EnStr
  256. * Description    : 向LCD写英文字符串
  257. * Input          : u8 ascii
  258. * Output         : None
  259. * Return         : None
  260. *******************************************************************************/
  261. void LCD_Write_EnStr_6X8(u8 X, u8 Y, u8* s)
  262. {
  263.     u8 * str = s;
  264.     int i = 0;
  265.     int lcd_index =0;
  266.     if(str == 0 )
  267.     {
  268.         return ;
  269.     }
  270.     LCD_SetXY(X,Y);//设置光标位置
  271.     while(*str)
  272.     {
  273.         //拷贝显示数据到缓冲区
  274.         for(i=0;i<6;i++)
  275.         {
  276.             lcd_buf[lcd_index ++ ] = Font6x8[*str - 32][i];
  277.         }
  278.                                         //memcpy(lcd_buf+6*str,&Font6x8[*str - 32][0],6);        
  279.         str ++ ;
  280.     }
  281.     lcd_buf[lcd_index ++ ] = 0 ; // lcd_index ++ 多发送一个0否者最后一个字符会缺少一个像素

  282.     for(i = 0 ;i<lcd_index ;i++)
  283.     {
  284.         LCD_Send(lcd_buf[i], DC_DATA);
  285.                 }

  286. }

  287. /*******************************************************************************
  288. * Function Name  : LCD_Write_EnStr
  289. * Description    : 向LCD写英文字符串
  290. * Input          : u8 ascii  当前行的数量 84/8=10个 最多显示10个 超出范围的不显示
  291. * Output         : None
  292. * Return         : None
  293. *******************************************************************************/
  294. void LCD_Write_EnStr_8X16(u8 X, u8 Y, u8* s)
  295. {
  296.     u8 * str = s;
  297.     int i = 0,j=0;
  298.     int lcd_index =0;
  299.         
  300.     if(str == 0 )
  301.     {
  302.         return ;
  303.     }
  304.     LCD_SetXY(X,Y);//设置光标位置
  305.     while(*str)
  306.     {
  307.         //拷贝显示数据到缓冲区
  308.         for(i=0;i<16;i++)
  309.         {
  310.             lcd_buf[lcd_index ++ ] = Font8x16[*str - 32][i];
  311.         }
  312.                                         //memcpy(lcd_buf+6*str,&Font6x8[*str - 32][0],6);        
  313.         str ++ ;
  314.     }
  315.                
  316.                  //如果要写的字大于10个,就仅仅显示10个
  317.                 if(lcd_index/16>(84-X)/8) lcd_index=(84-X)/8*16;
  318.                         
  319.     lcd_buf[lcd_index ++ ] = 0 ; // lcd_index ++ 多发送一个0否者最后一个字符会缺少一个像素
  320.    
  321.                 //写上半部
  322.                 LCD_SetXY(X,Y);//设置光标位置
  323.     for(i = 0;i<(lcd_index-1)/16;i++)//一般的数值为上半部分
  324.     {
  325.                         for(j=0;j<8;j++)
  326.         LCD_Send(lcd_buf[i*16+j], DC_DATA);
  327.                 }
  328.                
  329.                 //写下半部
  330.                 LCD_SetXY(X,Y+1);//设置光标位置
  331.     for(i = 0 ;i<(lcd_index-1)/16 ;i++)
  332.     {
  333.                         for(j=0;j<8;j++)
  334.         LCD_Send(lcd_buf[i*16+8+j], DC_DATA);
  335.                 }

  336. }

  337. void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char map, //unsigned char *map,
  338. unsigned char Pix_x,unsigned char Pix_y)
  339. {
  340.   unsigned int i,n;
  341.   unsigned char row;
  342.   if (Pix_y%8==0)
  343.     row=Pix_y/8;//计算位图所占行数
  344.   else
  345.     row=Pix_y/8+1;
  346.   for (n=0;n<row;n++)
  347.   {
  348.     LCD_SetXY(X,Y);
  349.     for(i=0; i<Pix_x; i++)
  350.     {
  351.                         LCD_Send(0xFE,DC_DATA);
  352.     }
  353.     Y++;//换行
  354.   }
  355. }


  356. void LCD_Disp_Buf(void)
  357. {
  358.   unsigned char x = 0, y = 0;
  359.         
  360.         for (y = 0; y < GUI_LCD_YMAX/8; y++)
  361.         {
  362.                 LCD_SetXY(0,y);
  363.                 for(x = 0; x < GUI_LCD_XMAX; x++)
  364.                 {
  365.                   LCD_Send(LcdDispBuf[y][x],DC_DATA);
  366.                 }
  367.         }
  368.         
  369. }


  370. /////////////////////////new add //////////////////////
  371. /* @ horizontal addressing (V = 0)
  372. */
  373. void LCD_draw_bytes(const u8 *buffer, int nbytes) {
  374.         while(nbytes --) {
  375. //                LCDSPI_WRITE(*(buffer ++));
  376.                                          LCD_Send(*(buffer ++), DC_DATA);
  377.         }
  378. }
  379. /*
  380. * @ write char by ascii code
  381. */
  382. void LCD_draw_string(u8 *str) {
  383.         int index;
  384.         u8 c;

  385.         while(*str != 0)
  386.         {
  387.                 c = *str;
  388.                 index = c - ' ';
  389.                 str ++;
  390.                 LCD_draw_bytes(font_5_8[index], 5);
  391.                 //LCDSPI_WRITE(0x00);
  392.                 LCD_Send(0x00, DC_DATA);
  393.         }
  394. }

  395. /*
  396. * @ write symble by id
  397. * @ id = [0, 21]
  398. */
  399. void LCD_draw_symble(u8 id) {
  400.         if(id > 21) {
  401.                 id = 0;
  402.         }
  403.         LCD_draw_bytes(font_5_8[id + 0x5f], 5);
  404.         //LCDSPI_WRITE(0x00);
  405.                                 LCD_Send(0x00, DC_DATA);
  406. }

  407. /*
  408. * @ LCD draw icon
  409. * @ id = [0, 26]
  410. */
  411. void LCD_draw_icon(u8 id) {
  412.         LCD_draw_bytes(icon[id], 10);
  413. //        LCDSPI_WRITE(0x00);
  414. //        LCDSPI_WRITE(0x00);
  415.         LCD_Send(0x00, DC_DATA);
  416.         LCD_Send(0x00, DC_DATA);
  417. }
  418. /*******************************************************************************
  419. * Function Name  : GPIO_Configuration
  420. * Description    : Configures the different GPIO ports.
  421. * Input          : None
  422. * Output         : None
  423. * Return         : None
  424. *******************************************************************************/
  425. void LCD_GPIO_Configuration(void)
  426. {
  427.   //其余全部置低
  428.         LCD_VCC_H();
  429.         LCD_GND_L();
  430.         delay_ms(1000);        
  431.         LCD_BGL_H();
  432.         delay_ms(100);        
  433. }


复制代码
H文件:
  1. #ifndef _LCD5110_H
  2. #define _LCD5110_H
  3. #include "main.h"
  4. #include "sys.h"
  5. #include "gpio.h"
  6. #include "Pixel_EN.h"

  7. /******************************宽高像素 ******************************/
  8. //#define LCD_X_RES                84
  9. //#define LCD_Y_RES                48


  10. #define  GUI_LCD_XMAX                84        //   定义液晶x轴的像素数 *
  11. #define  GUI_LCD_YMAX                48        //   定义液晶y轴的像素数 *
  12. /* 定义LCM像素数宏 */
  13. //#define  GUI_LCM_XMAX                GUI_LCD_XMAX        //   定义液晶x轴的像素数 *
  14. //#define  GUI_LCM_YMAX                GUI_LCD_YMAX        //   定义液晶y轴的像素数 *

  15. extern unsigned char LcdDispBuf[GUI_LCD_YMAX/8][GUI_LCD_XMAX];
  16. /**************************枚举 D/C模式选择 **************************/
  17. typedef enum
  18. {
  19.   DC_CMD  = 0,        //写命令
  20.         DC_DATA = 1                //写数据        
  21. } DCType;

  22. #define BLACK 1
  23. #define WHITE 0

  24. //#define TCOLOR        u32
  25. /***************************config as spi2 ***************************/
  26. #define LCD_RST_H()                HAL_GPIO_WritePin(NOKAI5110_RST_GPIO_Port,NOKAI5110_RST_Pin,GPIO_PIN_SET)
  27. #define LCD_RST_L()                HAL_GPIO_WritePin(NOKAI5110_RST_GPIO_Port,NOKAI5110_RST_Pin,GPIO_PIN_RESET)
  28. #define LCD_CE_H()                HAL_GPIO_WritePin(NOKIA5110_CE_GPIO_Port, NOKIA5110_CE_Pin,GPIO_PIN_SET)
  29. #define LCD_CE_L()                HAL_GPIO_WritePin(NOKIA5110_CE_GPIO_Port, NOKIA5110_CE_Pin,GPIO_PIN_RESET)
  30. #define LCD_DC_DATA()        HAL_GPIO_WritePin(NIKIA5110_DC_GPIO_Port, NIKIA5110_DC_Pin,GPIO_PIN_SET)
  31. #define LCD_DC_CMD()        HAL_GPIO_WritePin(NIKIA5110_DC_GPIO_Port, NIKIA5110_DC_Pin,GPIO_PIN_RESET)
  32. #define LCD_MOSI_H()        HAL_GPIO_WritePin(NOKIA5110_DIN_GPIO_Port,NOKIA5110_DIN_Pin,GPIO_PIN_SET)
  33. #define LCD_MOSI_L()        HAL_GPIO_WritePin(NOKIA5110_DIN_GPIO_Port,NOKIA5110_DIN_Pin,GPIO_PIN_RESET)
  34. #define LCD_CLK_H()                HAL_GPIO_WritePin(NOKIA5110_SCK_GPIO_Port,NOKIA5110_SCK_Pin,GPIO_PIN_SET)
  35. #define LCD_CLK_L()                HAL_GPIO_WritePin(NOKIA5110_SCK_GPIO_Port,NOKIA5110_SCK_Pin,GPIO_PIN_RESET)
  36. #define LCD_VCC_H()                HAL_GPIO_WritePin(NOKIA5110_VCC_GPIO_Port,NOKIA5110_VCC_Pin,GPIO_PIN_SET)
  37. #define        LCD_BGL_H()                HAL_GPIO_WritePin(NOKIA5110_BL_GPIO_Port, NOKIA5110_BL_Pin,GPIO_PIN_SET)
  38. #define LCD_GND_L()                HAL_GPIO_WritePin(NIKOA5110_GND_GPIO_Port,NIKOA5110_GND_Pin,GPIO_PIN_RESET)


  39. /************************函数定义****************************/
  40. void LCD_Init(void);
  41. void LCD_Clear(void);
  42. void LCD_SetXY(u8 X, u8 Y);
  43. void LCD_SetContrast(u8 contrast);
  44. void LCD_Send(u8 data, DCType dc);
  45. void LCD_Write_Char_6X8(u8 row,u8 page,u8 ascii);
  46. void LCD_write_Char_8X16(u8 row, u8 page,u8 c);
  47. void LCD_Write_EnStr_6X8(u8 X, u8 Y, u8* s);
  48. void LCD_Write_EnStr_8X16(u8 X, u8 Y, u8* s);
  49. void LCD_Write_Hanzi_12x16(u8 X, u8 Y,u8 GBK);
  50. void LCD_Write_Hanzi_16x16(u8 X, u8 Y,u8 GBK);
  51. void LCD_Write_Image(void);
  52. void LCD_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);

  53. void LCD_DrawPoint(u8 x, u8 y, u8 Color);
  54. void LCD_Refresh_Gram(void);

  55. void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char map, //unsigned char *map,
  56. unsigned char Pix_x,unsigned char Pix_y);
  57. void LCD_Disp_Buf(void);
  58. //一个应用实例
  59. void LCD_Disp_test(void);

  60. void LCD_GPIO_Configuration(void);
  61. void Array_chinese(void);
  62. #define puts_xy(x,y,s) LCD_Write_EnStr(x, y, s)

  63. //NEW ADD 5x7字符
  64. void LCD_draw_bytes(const u8 *buffer, int nbytes);
  65. void LCD_draw_string(u8 *str);
  66. void LCD_draw_symble(u8 id);
  67. void LCD_draw_icon(u8 id);

  68. #endif

复制代码


其中关于字模的大小选择,ASCII字符,有6x8 、8x16。汉字取模则用了12X16及16x16.具体看个人需求。字模软件用的PCtoLCD2002,设置为:
NOKIA5110取模.png
我们让RTOS的其中一个任务显示:
  1. void StartDefaultTask(void const * argument)
  2. {
  3.   /* USER CODE BEGIN StartDefaultTask */
  4.                 u16 i,cnt;
  5.         
  6.           GUI_Initialize();
  7.     GUI_SetColor(1,0);//此时是正常显示,若(0,1)则反色显示
  8.           //LCD_Write_Image();
  9.         

  10.                 /* Infinite loop */
  11.                 for(;;)
  12.                 {

  13.                         LCD_Clear();
  14.                         LCD_Write_Image();
  15.                         osDelay(2000);
  16.                         LCD_Clear();
  17.                         LCD_draw_string("!"#$%&'()*+,-./");
  18.                         LCD_draw_string("0123456789:;<=>?@");
  19.                         osDelay(2000);
  20.                         for(i = 0; i < 22; i ++)
  21.                         {
  22.                                 LCD_draw_symble(i);
  23.                         }
  24.                         osDelay(2000);
  25.                         LCD_Clear();
  26.                         LCD_draw_string("ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`");
  27.                         LCD_draw_string("abcdefghijklmnopqrstuvwxyz{|}~");
  28.                         osDelay(2000);
  29.                         LCD_Clear();
  30.                         for(i = 0; i < 27; i ++)
  31.                         {
  32.                                 LCD_draw_icon(i);
  33.                         }               
  34.                         osDelay(2000);
  35.                         
  36.                         LCD_Clear();

  37.                         LCD_Write_EnStr_6X8(0,0,"Thanks ST!");
  38.                         
  39.                         LCD_Write_EnStr_8X16(0,2,"ThanksST");
  40.                         
  41.                         //84/12=7
  42. //                        LCD_Write_Hanzi_12x16(0,4,0);
  43. //                        LCD_Write_Hanzi_12x16(1,4,1);
  44. //                        LCD_Write_Hanzi_12x16(2,4,2);
  45. //                        LCD_Write_Hanzi_12x16(3,4,3);
  46. //                        LCD_Write_Hanzi_12x16(4,4,4);
  47. //                        LCD_Write_Hanzi_12x16(5,4,5);
  48. //                        LCD_Write_Hanzi_12x16(6,4,6);
  49.                         
  50.                         //84/16=5
  51.                         LCD_Write_Hanzi_16x16(0,4,0);
  52.                         LCD_Write_Hanzi_16x16(1,4,1);
  53.                         LCD_Write_Hanzi_16x16(2,4,2);
  54.                         LCD_Write_Hanzi_16x16(3,4,3);
  55.                         LCD_Write_Hanzi_16x16(4,4,4);
  56.                         
  57. //                        LCD_write_Char_8X16(0,2,'a');               
  58. //                        LCD_Write_Char_6X8(0,1,'a');
  59.                         osDelay(2000);
  60.                 }
  61.   /* USER CODE END StartDefaultTask */
  62. }
复制代码
编译,查看效果:
1616385867765.gif
下面,我们来移植ZLGGUI,虽然年代久远,但用在单色屏还是不错的,而且源码易懂,好修改~
我们把ZLG_GUI文件夹复制到工程目录,并添加到工程。我们对底层接口实现函数文件lvmdrv,进行修改:
C文件:
  1. #include "config.h"
  2. #include "main.h"
  3. #include "delay.h"
  4. #include "LCD5110.h"



  5. /****************************************************************************
  6. * 名称:GUI_Initialize()
  7. * 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
  8. * 入口参数:无
  9. * 出口参数:无
  10. * 说明:用户根据LCM的实际情况编写此函数。
  11. ****************************************************************************/
  12. void  GUI_Initialize(void)
  13. {
  14.     LCD_Init();//LCD初始化
  15. }
  16. /****************************************************************************
  17. * 名称:GUI_FillSCR()
  18. * 功能:全屏填充。直接使用数据填充显示缓冲区。
  19. * 入口参数:dat     填充的数据
  20. * 出口参数:无
  21. * 说明:用户根据LCM的实际情况编写此函数。
  22. ****************************************************************************/
  23. void  GUI_FillSCR(TCOLOR dat)
  24. {
  25.     LCD_Fill(0,0,83,47,dat);
  26. }
  27. /****************************************************************************
  28. * 名称:GUI_ClearSCR()
  29. * 功能:清屏。
  30. * 入口参数:无
  31. * 出口参数:无
  32. * 说明:用户根据LCM的实际情况编写此函数。
  33. ****************************************************************************/
  34. void  GUI_ClearSCR()
  35. {
  36.     LCD_Clear();
  37. }
  38. /****************************************************************************
  39. * 名称:GUI_Point()
  40. * 功能:在指定位置上画点。
  41. * 入口参数: x      指定点所在列的位置
  42. *            y      指定点所在行的位置
  43. *            color  显示颜色(对于黑白色LCM,为0时灭,为1时显示)
  44. * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
  45. *          效范围)
  46. * 说明:用户根据LCM的实际情况编写此函数。
  47. ****************************************************************************/
  48. void  GUI_Point(uint16 x, uint8 y, TCOLOR color)
  49. {
  50.     LCD_DrawPoint(x,y,color);
  51. }
  52. /****************************************************************************
  53. * 名称:GUI_ReadPoint()
  54. * 功能:读取指定点的颜色。
  55. * 入口参数:x       指定点所在列的位置
  56. *           y       指定点所在行的位置
  57. *           ret     保存颜色值的指针
  58. * 出口参数:返回0表示指定地址超出缓冲区范围
  59. * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
  60. *      RGB结构则R、G、B变量有效。
  61. ****************************************************************************/
  62. uint8  GUI_ReadPoint(uint16 x, uint8 y, TCOLOR *ret)
  63. {
  64.     return 0;
  65. }
  66. /****************************************************************************
  67. * 名称:GUI_HLine()
  68. * 功能:画水平线。
  69. * 入口参数: x0     水平线起点所在列的位置
  70. *           y0      水平线起点所在行的位置
  71. *           x1      水平线终点所在列的位置
  72. *           color   显示颜色(对于黑白色LCM,为0时灭,为1时显示)
  73. * 出口参数:无
  74. * 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更
  75. *      新8个点,而不需要一个点一个点的写到LCM中。
  76. ****************************************************************************/
  77. void  GUI_HLine(uint16 x0, uint8 y0, uint16 x1, TCOLOR color)
  78. {
  79.     uint8  temp;
  80.     if(x0>x1)               // 对x0、x1大小进行排列,以便画图
  81.     {
  82.         temp = x1;
  83.         x1 = x0;
  84.         x0 = temp;
  85.     }
  86.     do
  87.     {
  88.         GUI_Point(x0, y0, color);   // 逐点显示,描出垂直线
  89.         x0++;
  90.     }
  91.     while(x1>=x0);
  92. }
  93. /****************************************************************************
  94. * 名称:GUI_RLine()
  95. * 功能:画垂直线。
  96. * 入口参数: x0     垂直线起点所在列的位置
  97. *           y0      垂直线起点所在行的位置
  98. *           y1      垂直线终点所在行的位置
  99. *           color   显示颜色
  100. * 出口参数:无
  101. * 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更
  102. *      新8个点,而不需要一个点一个点的写到LCM中。
  103. ****************************************************************************/
  104. void  GUI_RLine(uint16 x0, uint8 y0, uint8 y1, TCOLOR color)
  105. {
  106.     uint8  temp;
  107.     if(y0>y1)       // 对y0、y1大小进行排列,以便画图
  108.     {
  109.         temp = y1;
  110.         y1 = y0;
  111.         y0 = temp;
  112.     }
  113.     do
  114.     {
  115.         GUI_Point(x0, y0, color);   // 逐点显示,描出垂直线
  116.         y0++;
  117.     }
  118.     while(y1>=y0);
  119. }
  120. /****************************************************************************
  121. * 名称:GUI_Exec()
  122. * 功能:刷新屏幕         
  123. *           
  124. *           
  125. *
  126. *
  127. *
  128. ****************************************************************************/
  129. void  GUI_Exec(void)
  130. {
  131.     LCD_Refresh_Gram();
  132. }


复制代码
H文件:
  1. /****************************************************************************
  2. * 文件名:LCMDRV.H
  3. * 功能:12864图形液晶模块驱动程序。
  4. *       用于ZLG/GUI用户图形界面。
  5. *  
  6. *  作者:黄绍斌
  7. *  日期:2005/3/7
  8. ****************************************************************************/
  9. #ifndef  LCMDRV_H
  10. #define  LCMDRV_H  


  11. /* 定义颜色数据类型(可以是数据结构) */
  12. #define  TCOLOR          uint8_t                 //自行修改,原来是        uint8_t

  13. /* 定义LCM像素数宏 */
  14. #define  GUI_LCM_XMAX                84                                //自行修改                        /* 定义液晶x轴的像素数 */
  15. #define  GUI_LCM_YMAX                48                                //自行修改                        /* 定义液晶y轴的像素数 */


  16. void  GUI_Initialize(void);
  17. void  GUI_FillSCR(TCOLOR dat);
  18. void  GUI_ClearSCR(void);
  19. void  GUI_Point(uint16_t x, uint8_t y, TCOLOR color);
  20. uint8_t  GUI_ReadPoint(uint16_t x, uint8_t y, TCOLOR *ret);
  21. void  GUI_HLine(uint16_t x0, uint8_t y0, uint16_t x1, TCOLOR color);
  22. void  GUI_RLine(uint16_t x0, uint8_t y0, uint8_t y1, TCOLOR color);
  23. void  GUI_Exec(void);

  24. /****************************************************************************
  25. * 名称:GUI_CmpColor()
  26. * 功能:判断颜色值是否一致。
  27. * 入口参数:color1                颜色值1
  28. *                   color2                颜色值2
  29. * 出口参数:返回1表示相同,返回0表示不相同。
  30. * 说明:由于颜色类型TCOLOR可以是结构类型,所以需要用户编写比较函数。
  31. ****************************************************************************/
  32. #define  GUI_CmpColor(color1, color2)        ( (color1&0x01) == (color2&0x01) )

  33. /****************************************************************************
  34. * 名称:GUI_CopyColor()
  35. * 功能:颜色值复制。
  36. * 入口参数:color1                目标颜色变量
  37. *                   color2                源颜色变量
  38. * 出口参数:无
  39. * 说明:由于颜色类型TCOLOR可以是结构类型,所以需要用户编写复制函数。
  40. ****************************************************************************/
  41. #define  GUI_CopyColor(color1, color2)         *color1 = color2



  42. #endif
复制代码


在任务中添加。显示GUI:
  1.    //显示一个窗口
  2.                         Win_Dis(0,0,84,48,head,text);
  3.                         //显示菜单
  4.                         Mem_Dis();
  5.                         //显示菜单选择
  6.                         GUI_MMenuSelect(&mymenu,1);
  7.                         //显示按键
  8.                         GUI_Button_OK(20,24);
  9.                                 GUI_Exec();
复制代码
WIN和MEm的显示和定义函数:
  1. //GUI
  2. u8 head[]={"Win_XP"};
  3. u8 text[]={"Please select!"};

  4. WINDOWS winxp;
  5. MMENU mymenu;
  6. /* USER CODE END Variables */

  7. /* Private function prototypes -----------------------------------------------*/
  8. /* USER CODE BEGIN FunctionPrototypes */


  9. void Win_Dis(u8 pos_x,u8 pos_y,u8 width,u8 high,u8 *headline,u8 *contain)
  10. {

  11.     winxp.x=pos_x;
  12.     winxp.y=pos_y;
  13.     winxp.with=width;
  14.     winxp.hight=high;
  15.     winxp.title=headline;
  16.     winxp.state=contain;
  17.     GUI_WindowsDraw(&winxp);        
  18. }

  19. void Mem_Dis(void)
  20. {
  21.     mymenu.win=&winxp;
  22.     mymenu.no=3;
  23.     mymenu.str[0]="YES";
  24.     mymenu.str[1]="NO";
  25.     mymenu.str[2]="CHANCE";

  26.     GUI_MMenuDraw(&mymenu);

  27. }
复制代码
编译,下载,查看:
46.jpg
zlg_gui包: ZLG_GUI.rar (34.44 KB, 下载次数: 14)
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 11:30 , Processed in 0.154904 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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