[其他ST产品] STM32之FreeRTOS

[复制链接]
586|13
 楼主| kqh11a 发表于 2022-12-31 23:47 | 显示全部楼层 |阅读模式
简介

  学习的硬件平台是基于正点原子的精英板。

1. CubeMX创建FreeRTOS工程模板

  选择芯片配置时钟及调试接口这种基本操作就不说了,直接从开始配置FreeRTOS工程模板说起。

  ① 首先点击最下方的FreeRTOS选项

2492963b0597b236ee.png


 楼主| kqh11a 发表于 2022-12-31 23:48 | 显示全部楼层
② 点击v2版本,v1和v2有啥区别我不知道,可以自己试试
5195663b059b9321c5.png
 经过如上操作,FreeRTOS的工程模板就已经创建好了。
注意:如果使用FreeRTOS的话,它也是和HAL库一样用的sysTick作为系统时基,因此我们需要将HAL库的时基换一下,这里我使用的是定时器1。
 楼主| kqh11a 发表于 2022-12-31 23:48 | 显示全部楼层
 楼主| kqh11a 发表于 2022-12-31 23:50 | 显示全部楼层
跑马灯验证移植模板

  现在我们可以验证一下我们的工程模板是否有问题,我们先玩个跑马灯,还是在CubeMX上配置任务,步骤如下:
5258163b05a352bb7a.png
 楼主| kqh11a 发表于 2022-12-31 23:51 | 显示全部楼层
第三步的操作是进行任务添加,设置任务名称任务堆栈任务优先级之类的,添加好了之后直接点击生成代码即可。
 楼主| kqh11a 发表于 2022-12-31 23:52 | 显示全部楼层
生成完毕之后打开MDK工程在文件freertos.c文件中的任务函数里添加如下代码(注意,是找到自己在CubeMX配置的任务函数名字,将函数的内容添加进去,不是直接将整个任务函数复制粘贴进去):
 楼主| kqh11a 发表于 2022-12-31 23:53 | 显示全部楼层
  1. void Fun_LED1(void *argument)
  2. {
  3.   /* USER CODE BEGIN Fun_LED1 */
  4.   /* Infinite loop */
  5.   for(;;)
  6.   {
  7.                 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
  8.     osDelay(50);
  9.                 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
  10.     osDelay(50);
  11.   }
  12.   /* USER CODE END Fun_LED1 */
  13. }


  14. void Fun_LED2(void *argument)
  15. {
  16.   /* USER CODE BEGIN Fun_LED2 */
  17.   /* Infinite loop */
  18.   for(;;)
  19.   {
  20.     HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
  21.     osDelay(50);
  22.                 HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
  23.     osDelay(50);
  24.   }
  25.   /* USER CODE END Fun_LED2 */
  26. }
 楼主| kqh11a 发表于 2022-12-31 23:54 | 显示全部楼层
经过上面的例程,可以发现两个灯都是同时亮同时灭,看起来像是同一时刻执行两个任务(其实不是),示波器检测两个引脚的波形也是一致的,移植成功。
 楼主| kqh11a 发表于 2022-12-31 23:54 | 显示全部楼层
移植正点原子精英板TFTLCD程序代码

  正点原子的例程都是根据标准库写的,在我们使用CubeMX工具配置的话就得需要经过一个移植来完成对LCD的控制。通讯时序我采用的是FSMC模拟产生8080时序来完成,主要分为两部分:
①:FSMC的配置
②:LCD的驱动及功能代码的移植
 楼主| kqh11a 发表于 2022-12-31 23:55 | 显示全部楼层
FSMC的配置

  具体的FSMC配置如下:
6099663b05b61960cf.png
同一器件,FSMC可以挂载4个,用片选引脚分开,这里我们选用块1的第四个区,也就是第2步所选的内容,采用与NOR FLASH通信的这块地址区域来模拟产生8080时序。这里我们主要关注的是第2步和第4步,因为这两个是根据硬件图来决定的,FSMC的数据线和地址线及其他的信号线都是固定的,因此这个我们不用管,我们需要关注的就是就是我们硬件中采用的是哪个区的那个片选,对应着不同的通信地址。我的板子上片选引脚连接的是PG12,对应FSMC的片选4,因此这里采用片选4。因为LCD屏没有地址线,但是有一个数据命令区分线,因此我们可以将LCD的数据命令区分线连接到其中的一根地址线,这里我的硬件连接是FSMC的A10地址线,对应GPIO的PG0。根据访问不同的地址A10地址线产生的高低电平来决定是给LCD写数据还是写命令(具体是哪个电平写数据哪个电平写命令是根据LCD的控制芯片来决定的)。
 楼主| kqh11a 发表于 2022-12-31 23:56 | 显示全部楼层
 主要的地方配置好后就是第6项的数据命令等待时间及模式的配置,数据命令等待时间可以根据LCD时序图来配置,也可以使用经验值,模式我选得A模式。配置好之后就可以去控制我们的LCD了
 楼主| kqh11a 发表于 2022-12-31 23:57 | 显示全部楼层
LCD的驱动及功能函数的移植

首先是lcd.h文件,代码如下:
  1. #ifndef _LCD_H
  2. #define        _LCD_H

  3. #include "stm32f1xx_hal.h"
  4. #include "FreeRTOS.h"
  5. #include "cmsis_os.h"


  6. //定义一些常用的数据类型短关键字
  7. //-----------------------------------------------------------------------------------------------------------------
  8. typedef                      int32_t         s32;
  9. typedef                      int16_t         s16;
  10. typedef                      int8_t          s8;

  11. typedef const                int32_t         sc32;  
  12. typedef const                int16_t         sc16;  
  13. typedef const                int8_t          sc8;  

  14. typedef __IO                 int32_t         vs32;
  15. typedef __IO                 int16_t         vs16;
  16. typedef __IO                 int8_t          vs8;

  17. typedef __I                  int32_t         vsc32;  
  18. typedef __I                  int16_t         vsc16;
  19. typedef __I                  int8_t          vsc8;   

  20. typedef                      uint32_t        u32;
  21. typedef                      uint16_t        u16;
  22. typedef                      uint8_t         u8;

  23. typedef const                uint32_t        uc32;  
  24. typedef const                uint16_t        uc16;  
  25. typedef const                uint8_t         uc8;

  26. typedef __IO                 uint32_t        vu32;
  27. typedef __IO                 uint16_t        vu16;
  28. typedef __IO                 uint8_t         vu8;

  29. typedef __I                  uint32_t        vuc32;  
  30. typedef __I                  uint16_t        vuc16;
  31. typedef __I                  uint8_t         vuc8;         
  32. //-----------------------------------------------------------------------------------------------------------------






  33. // 代码移植部分
  34. //-----------------------------------------------------------------------------------------------------------------
  35. // 注意:
  36. // FSMC 部分为硬件固定引脚,不可更改
  37. //
  38. // 引脚连接状态:
  39. //
  40. // 可自定义引脚
  41. // LCD_RST------------------------------------nRST LCD      复位引脚       
  42. // LCD_BL-------------------------------------PB0 LCD       背光控制引脚,通过三极管控制
  43. //
  44. // FSMC 固定引脚
  45. // FSMC_NE4 -> LCD_CS-------------------------PG12          片选引脚,选择的是块 1 第 4 个区(总共四块,每块4个区)                       
  46. // FSMC_NOE -> LCD_RD-------------------------PD4           读数据
  47. // FSMC_NWE -> LCD_WR-------------------------PD5           写数据

  48. // FSMC_A10 -> LCD_RS-------------------------PG0           数据/命令选择/地址线

  49. // FSMC_D0  -> LCD_D0-------------------------PD14          数据/命令线 0
  50. // FSMC_D1  -> LCD_D1-------------------------PD15          数据/命令线 1
  51. // FSMC_D2  -> LCD_D2-------------------------PD0           数据/命令线 2
  52. // FSMC_D3  -> LCD_D3-------------------------PD1           数据/命令线 3
  53. // FSMC_D4  -> LCD_D4-------------------------PE7           数据/命令线 4
  54. // FSMC_D5  -> LCD_D5-------------------------PE8           数据/命令线 5
  55. // FSMC_D6  -> LCD_D6-------------------------PE9           数据/命令线 6
  56. // FSMC_D7  -> LCD_D7-------------------------PE10          数据/命令线 7
  57. // FSMC_D8  -> LCD_D8-------------------------PE11          数据/命令线 8
  58. // FSMC_D9  -> LCD_D9-------------------------PE12          数据/命令线 9
  59. // FSMC_D10 -> LCD_D10------------------------PE13          数据/命令线 10       
  60. // FSMC_D11 -> LCD_D11------------------------PE14          数据/命令线 11
  61. // FSMC_D12 -> LCD_D12------------------------PE15          数据/命令线 12
  62. // FSMC_D13 -> LCD_D13------------------------PD8           数据/命令线 13
  63. // FSMC_D14 -> LCD_D14------------------------PD9           数据/命令线 14
  64. // FSMC_D15 -> LCD_D15------------------------PD10          数据/命令线 15
  65. //----------------------------------------------------------------------------------------------------------------





  66. // TFTLCD 数据命令选择
  67. //
  68. // 由于 TFTLCD 没有地址线,但是有一条 LCD_RS 线,将
  69. // 其连接在其中一条地址线上,通过访问不同的地址改变
  70. // LCD_RS 引脚的高低电平来决定是数据与命令
  71. //
  72. // 注意:
  73. //      STM32 FSMC 访问外部 SRAM 地址时,会自动将地址右移一位对齐
  74. //-----------------------------------
  75. typedef        struct
  76. {
  77.   vu16 LCD_Cmd;
  78.   vu16 LCD_Data;
  79. }LCD_TypeDef;
  80. #define                LCD_BASE     ( (u32)(0x6C000000 | 0x000007FE) )
  81. #define                LCD          ( (LCD_TypeDef *) LCD_BASE       )       
  82. //-----------------------------------------------------------------------------------------------------------------





  83. // TFTLCD 背光
  84. // 1:开背光
  85. // 0:关背光
  86. //-----------------------------------
  87. #define                ON                          1
  88. #define                OFF                         0

  89. #define                LCD_BL(ONorOFF)             if(ONorOFF)               \
  90.                                          GPIOB->ODR |= 0x01;      \
  91.                                               else                      \
  92.                                          GPIOB->ODR &= 0xFE;
  93. //-----------------------------------------------------------------------------------------------------------------
  94.        

  95.                                                                                                                                                
  96.                                                                                                                                                
  97.                                                                                                                                                
  98. // TFTLCD 读写方向
  99. //-----------------------------------
  100. #define                L2R_U2D                                                                                0
  101. #define                L2R_D2U                                                                                1
  102. #define                R2L_U2D                                                                                2
  103. #define                R2L_D2U                                                                                3

  104. #define                U2D_L2R                                                                                4
  105. #define                U2D_R2L                                                                                5
  106. #define                D2U_L2R                                                                                6
  107. #define                D2U_R2L                                                                                7
  108. //-----------------------------------------------------------------------------------------------------------------

  109.                                                                                                                                                



  110. // 笔画颜色
  111. //-----------------------------------
  112. #define WHITE                       0xFFFF
  113. #define BLACK                       0x0000          
  114. #define BLUE                        0x001F  
  115. #define BRED                        0XF81F
  116. #define GRED                        0XFFE0
  117. #define GBLUE                       0X07FF
  118. #define RED                         0xF800
  119. #define MAGENTA                     0xF81F
  120. #define GREEN                       0x07E0
  121. #define CYAN                        0x7FFF
  122. #define YELLOW                      0xFFE0
  123. #define BROWN                       0XBC40 //棕色
  124. #define BRRED                       0XFC07 //棕红色
  125. #define GRAY                        0X8430 //灰色
  126. //-----------------------------------------------------------------------------------------------------------------
  127.                                                                                                                                                




  128. // 液晶驱动芯片常用指令
  129. // 0x36:读写方向
  130. // 0x2A:设置 x 起始坐标
  131. // 0x2B:设置 y 起始坐标
  132. // 0x2C:写 GRAM 指令(设置此指令之后,有效位宽为 16 位)
  133. //-----------------------------------
  134. #define                RW_Direction              0x36
  135. #define                X_Pos                     0x2A
  136. #define                Y_Pos                     0x2B
  137. #define                WR_GRAM                   0x2C               
  138. //-----------------------------------------------------------------------------------------------------------------
  139.                                                                                                                                        
  140.                                                                                                                                                                                                                



  141. // API函数声明
  142. //-----------------------------------
  143. // 写操作
  144. void LCD_WR_Cmd(u16 cmd);
  145. void LCD_WR_Data(u16 data);
  146. void LCD_WR_GRAM_Cmd(void);
  147. u16  RD_ID(void);

  148. // 读操作
  149. u16  LCD_RD_Cmd(void);
  150. u16  LCD_RD_Data(void);

  151. // 初始化部分(用cubeMX配置之后,初始化此处即可)
  152. void LCD_DriveID_5310_Init(void);                                     // 此函数包含了开背光,设置读写方向和清屏函数
  153. void Set_RW_Direction(u8 direction);
  154. void LCD_Clear(u16 color);

  155. // 功能函数
  156. void Open_Window(u16 Xpos, u16 Ypos, u16 Width, u16 Hight);
  157. void LCD_SetCursor(u16 Xpos, u16 Ypos);                               // 设置光标
  158. void LCD_DrawPoint(u16 x,u16 y,u16 color);                            // 画点
  159. void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color);                       // 快速画点
  160. u16  LCD_ReadPoint(u16 x,u16 y);                                      // 读点
  161. void LCD_Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);                   // 画圆
  162. void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2, u16 color);         // 画线
  163. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2, u16 color);    // 画矩形
  164. void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);                 // 填充单色
  165. void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color);          // 填充指定颜色
  166. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);                // 显示一个字符
  167. void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);                 // 显示一个数字
  168. void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);        // 显示 数字
  169. void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);  // 显示一个字符串,12/16字体
  170. //-----------------------------------------------------------------------------------------------------------------
  171. #endif
 楼主| kqh11a 发表于 2022-12-31 23:58 | 显示全部楼层
再就是lcd.c文件,代码如下:
  1. #include "lcd.h"

  2. // TFTLCD 写指令
  3. //-----------------------------------
  4. void        LCD_WR_Cmd(u16 cmd)
  5. {
  6.                 LCD->LCD_Cmd = cmd;
  7. }
  8. //-----------------------------------------------------------------------------------------------------------------


  9. // TFTLCD 写数据
  10. //-----------------------------------
  11. void        LCD_WR_Data(u16 data)
  12. {
  13.                 LCD->LCD_Data = data;
  14. }
  15. //-----------------------------------------------------------------------------------------------------------------


  16. // 开始写 GRAM
  17. //-----------------------------------
  18. void        LCD_WR_GRAM_Cmd(void)
  19. {
  20.                 LCD_WR_Cmd(0x2C);
  21. }
  22. //-----------------------------------------------------------------------------------------------------------------


  23. // TFTLCD 读指令
  24. //-----------------------------------
  25. u16        LCD_RD_Cmd(void)
  26. {
  27.                 vu16 tmp;
  28.                 tmp = LCD->LCD_Cmd ;
  29.        
  30.                 return tmp;
  31. }
  32. //-----------------------------------------------------------------------------------------------------------------


  33. // TFTLCD 读数据
  34. //-----------------------------------
  35. u16        LCD_RD_Data(void)
  36. {
  37.                 vu16 tmp;
  38.                 tmp = LCD->LCD_Data;
  39.        
  40.                 return tmp;
  41. }
  42. //-----------------------------------------------------------------------------------------------------------------




  43. // 设置 TFTLCD 读写方向
  44. //-----------------------------------
  45. void        Set_RW_Direction(u8 direction)
  46. {
  47.                 u8 tmp = 0;
  48.        
  49.                 switch(direction)
  50.                 {
  51.                         case L2R_U2D://从左到右,从上到下
  52.                                         tmp|=(0<<7)|(0<<6)|(0<<5);
  53.                                         break;
  54.                         case L2R_D2U://从左到右,从下到上
  55.                                         tmp|=(1<<7)|(0<<6)|(0<<5);
  56.                                         break;
  57.                         case R2L_U2D://从右到左,从上到下
  58.                                         tmp|=(0<<7)|(1<<6)|(0<<5);
  59.                                         break;
  60.                         case R2L_D2U://从右到左,从下到上
  61.                                         tmp|=(1<<7)|(1<<6)|(0<<5);
  62.                                         break;         
  63.                         case U2D_L2R://从上到下,从左到右
  64.                                         tmp|=(0<<7)|(0<<6)|(1<<5);
  65.                                         break;
  66.                         case U2D_R2L://从上到下,从右到左
  67.                                         tmp|=(0<<7)|(1<<6)|(1<<5);
  68.                                         break;
  69.                         case D2U_L2R://从下到上,从左到右
  70.                                         tmp|=(1<<7)|(0<<6)|(1<<5);
  71.                                         break;
  72.                         case D2U_R2L://从下到上,从右到左
  73.                                         tmp|=(1<<7)|(1<<6)|(1<<5);
  74.                                         break;                                
  75.                 }
  76.                 LCD_WR_Cmd(0x36);
  77.                 LCD_WR_Data(tmp);
  78. }
  79. //-----------------------------------------------------------------------------------------------------------------





  80. // 清屏函数(适用于 3.5寸屏)
  81. // color:要清屏的填充色
  82. //-----------------------------------------------------------------------------------------------------------------
  83. void LCD_Clear(u16 color)
  84. {
  85.                 u32 index=0;      
  86.                
  87.                 Open_Window(0,0,320,480);
  88.                 LCD_WR_GRAM_Cmd();
  89.                 for(index = 0; index<320*480; index++)
  90.         {
  91.                         LCD_WR_Data(color);
  92.         }
  93. }
  94. //-----------------------------------------------------------------------------------------------------------------






  95. //-----------------------------------------------------------------------------------------------------------------
  96. void        LCD_DriveID_5310_Init()
  97. {
  98.                 u32 i;
  99.         // ID 为 5310 驱动的初始化序列
  100.                 LCD_WR_Cmd(0xED);
  101.                 LCD_WR_Data(0x01);
  102.                 LCD_WR_Data(0xFE);

  103.                 LCD_WR_Cmd(0xEE);
  104.                 LCD_WR_Data(0xDE);
  105.                 LCD_WR_Data(0x21);

  106.                 LCD_WR_Cmd(0xF1);
  107.                 LCD_WR_Data(0x01);
  108.                 LCD_WR_Cmd(0xDF);
  109.                 LCD_WR_Data(0x10);

  110.                 //VCOMvoltage//
  111.                 LCD_WR_Cmd(0xC4);
  112.                 LCD_WR_Data(0x8F);          //5f

  113.                 LCD_WR_Cmd(0xC6);
  114.                 LCD_WR_Data(0x00);
  115.                 LCD_WR_Data(0xE2);
  116.                 LCD_WR_Data(0xE2);
  117.                 LCD_WR_Data(0xE2);
  118.                 LCD_WR_Cmd(0xBF);
  119.                 LCD_WR_Data(0xAA);

  120.                 LCD_WR_Cmd(0xB0);
  121.                 LCD_WR_Data(0x0D);
  122.                 LCD_WR_Data(0x00);
  123.                 LCD_WR_Data(0x0D);
  124.                 LCD_WR_Data(0x00);
  125.                 LCD_WR_Data(0x11);
  126.                 LCD_WR_Data(0x00);
  127.                 LCD_WR_Data(0x19);
  128.                 LCD_WR_Data(0x00);
  129.                 LCD_WR_Data(0x21);
  130.                 LCD_WR_Data(0x00);
  131.                 LCD_WR_Data(0x2D);
  132.                 LCD_WR_Data(0x00);
  133.                 LCD_WR_Data(0x3D);
  134.                 LCD_WR_Data(0x00);
  135.                 LCD_WR_Data(0x5D);
  136.                 LCD_WR_Data(0x00);
  137.                 LCD_WR_Data(0x5D);
  138.                 LCD_WR_Data(0x00);

  139.                 LCD_WR_Cmd(0xB1);
  140.                 LCD_WR_Data(0x80);
  141.                 LCD_WR_Data(0x00);
  142.                 LCD_WR_Data(0x8B);
  143.                 LCD_WR_Data(0x00);
  144.                 LCD_WR_Data(0x96);
  145.                 LCD_WR_Data(0x00);

  146.                 LCD_WR_Cmd(0xB2);
  147.                 LCD_WR_Data(0x00);
  148.                 LCD_WR_Data(0x00);
  149.                 LCD_WR_Data(0x02);
  150.                 LCD_WR_Data(0x00);
  151.                 LCD_WR_Data(0x03);
  152.                 LCD_WR_Data(0x00);

  153.                 LCD_WR_Cmd(0xB3);
  154.                 LCD_WR_Data(0x00);
  155.                 LCD_WR_Data(0x00);
  156.                 LCD_WR_Data(0x00);
  157.                 LCD_WR_Data(0x00);
  158.                 LCD_WR_Data(0x00);
  159.                 LCD_WR_Data(0x00);
  160.                 LCD_WR_Data(0x00);
  161.                 LCD_WR_Data(0x00);
  162.                 LCD_WR_Data(0x00);
  163.                 LCD_WR_Data(0x00);
  164.                 LCD_WR_Data(0x00);
  165.                 LCD_WR_Data(0x00);
  166.                 LCD_WR_Data(0x00);
  167.                 LCD_WR_Data(0x00);
  168.                 LCD_WR_Data(0x00);
  169.                 LCD_WR_Data(0x00);
  170.                 LCD_WR_Data(0x00);
  171.                 LCD_WR_Data(0x00);
  172.                 LCD_WR_Data(0x00);
  173.                 LCD_WR_Data(0x00);
  174.                 LCD_WR_Data(0x00);
  175.                 LCD_WR_Data(0x00);
  176.                 LCD_WR_Data(0x00);
  177.                 LCD_WR_Data(0x00);

  178.                 LCD_WR_Cmd(0xB4);
  179.                 LCD_WR_Data(0x8B);
  180.                 LCD_WR_Data(0x00);
  181.                 LCD_WR_Data(0x96);
  182.                 LCD_WR_Data(0x00);
  183.                 LCD_WR_Data(0xA1);
  184.                 LCD_WR_Data(0x00);

  185.                 LCD_WR_Cmd(0xB5);
  186.                 LCD_WR_Data(0x02);
  187.                 LCD_WR_Data(0x00);
  188.                 LCD_WR_Data(0x03);
  189.                 LCD_WR_Data(0x00);
  190.                 LCD_WR_Data(0x04);
  191.                 LCD_WR_Data(0x00);

  192.                 LCD_WR_Cmd(0xB6);
  193.                 LCD_WR_Data(0x00);
  194.                 LCD_WR_Data(0x00);

  195.                 LCD_WR_Cmd(0xB7);
  196.                 LCD_WR_Data(0x00);
  197.                 LCD_WR_Data(0x00);
  198.                 LCD_WR_Data(0x3F);
  199.                 LCD_WR_Data(0x00);
  200.                 LCD_WR_Data(0x5E);
  201.                 LCD_WR_Data(0x00);
  202.                 LCD_WR_Data(0x64);
  203.                 LCD_WR_Data(0x00);
  204.                 LCD_WR_Data(0x8C);
  205.                 LCD_WR_Data(0x00);
  206.                 LCD_WR_Data(0xAC);
  207.                 LCD_WR_Data(0x00);
  208.                 LCD_WR_Data(0xDC);
  209.                 LCD_WR_Data(0x00);
  210.                 LCD_WR_Data(0x70);
  211.                 LCD_WR_Data(0x00);
  212.                 LCD_WR_Data(0x90);
  213.                 LCD_WR_Data(0x00);
  214.                 LCD_WR_Data(0xEB);
  215.                 LCD_WR_Data(0x00);
  216.                 LCD_WR_Data(0xDC);
  217.                 LCD_WR_Data(0x00);

  218.                 LCD_WR_Cmd(0xB8);
  219.                 LCD_WR_Data(0x00);
  220.                 LCD_WR_Data(0x00);
  221.                 LCD_WR_Data(0x00);
  222.                 LCD_WR_Data(0x00);
  223.                 LCD_WR_Data(0x00);
  224.                 LCD_WR_Data(0x00);
  225.                 LCD_WR_Data(0x00);
  226.                 LCD_WR_Data(0x00);

  227.                 LCD_WR_Cmd(0xBA);
  228.                 LCD_WR_Data(0x24);
  229.                 LCD_WR_Data(0x00);
  230.                 LCD_WR_Data(0x00);
  231.                 LCD_WR_Data(0x00);

  232.                 LCD_WR_Cmd(0xC1);
  233.                 LCD_WR_Data(0x20);
  234.                 LCD_WR_Data(0x00);
  235.                 LCD_WR_Data(0x54);
  236.                 LCD_WR_Data(0x00);
  237.                 LCD_WR_Data(0xFF);
  238.                 LCD_WR_Data(0x00);

  239.                 LCD_WR_Cmd(0xC2);
  240.                 LCD_WR_Data(0x0A);
  241.                 LCD_WR_Data(0x00);
  242.                 LCD_WR_Data(0x04);
  243.                 LCD_WR_Data(0x00);

  244.                 LCD_WR_Cmd(0xC3);
  245.                 LCD_WR_Data(0x3C);
  246.                 LCD_WR_Data(0x00);
  247.                 LCD_WR_Data(0x3A);
  248.                 LCD_WR_Data(0x00);
  249.                 LCD_WR_Data(0x39);
  250.                 LCD_WR_Data(0x00);
  251.                 LCD_WR_Data(0x37);
  252.                 LCD_WR_Data(0x00);
  253.                 LCD_WR_Data(0x3C);
  254.                 LCD_WR_Data(0x00);
  255.                 LCD_WR_Data(0x36);
  256.                 LCD_WR_Data(0x00);
  257.                 LCD_WR_Data(0x32);
  258.                 LCD_WR_Data(0x00);
  259.                 LCD_WR_Data(0x2F);
  260.                 LCD_WR_Data(0x00);
  261.                 LCD_WR_Data(0x2C);
  262.                 LCD_WR_Data(0x00);
  263.                 LCD_WR_Data(0x29);
  264.                 LCD_WR_Data(0x00);
  265.                 LCD_WR_Data(0x26);
  266.                 LCD_WR_Data(0x00);
  267.                 LCD_WR_Data(0x24);
  268.                 LCD_WR_Data(0x00);
  269.                 LCD_WR_Data(0x24);
  270.                 LCD_WR_Data(0x00);
  271.                 LCD_WR_Data(0x23);
  272.                 LCD_WR_Data(0x00);
  273.                 LCD_WR_Data(0x3C);
  274.                 LCD_WR_Data(0x00);
  275.                 LCD_WR_Data(0x36);
  276.                 LCD_WR_Data(0x00);
  277.                 LCD_WR_Data(0x32);
  278.                 LCD_WR_Data(0x00);
  279.                 LCD_WR_Data(0x2F);
  280.                 LCD_WR_Data(0x00);
  281.                 LCD_WR_Data(0x2C);
  282.                 LCD_WR_Data(0x00);
  283.                 LCD_WR_Data(0x29);
  284.                 LCD_WR_Data(0x00);
  285.                 LCD_WR_Data(0x26);
  286.                 LCD_WR_Data(0x00);
  287.                 LCD_WR_Data(0x24);
  288.                 LCD_WR_Data(0x00);
  289.                 LCD_WR_Data(0x24);
  290.                 LCD_WR_Data(0x00);
  291.                 LCD_WR_Data(0x23);
  292.                 LCD_WR_Data(0x00);

  293.                 LCD_WR_Cmd(0xC4);
  294.                 LCD_WR_Data(0x62);
  295.                 LCD_WR_Data(0x00);
  296.                 LCD_WR_Data(0x05);
  297.                 LCD_WR_Data(0x00);
  298.                 LCD_WR_Data(0x84);
  299.                 LCD_WR_Data(0x00);
  300.                 LCD_WR_Data(0xF0);
  301.                 LCD_WR_Data(0x00);
  302.                 LCD_WR_Data(0x18);
  303.                 LCD_WR_Data(0x00);
  304.                 LCD_WR_Data(0xA4);
  305.                 LCD_WR_Data(0x00);
  306.                 LCD_WR_Data(0x18);
  307.                 LCD_WR_Data(0x00);
  308.                 LCD_WR_Data(0x50);
  309.                 LCD_WR_Data(0x00);
  310.                 LCD_WR_Data(0x0C);
  311.                 LCD_WR_Data(0x00);
  312.                 LCD_WR_Data(0x17);
  313.                 LCD_WR_Data(0x00);
  314.                 LCD_WR_Data(0x95);
  315.                 LCD_WR_Data(0x00);
  316.                 LCD_WR_Data(0xF3);
  317.                 LCD_WR_Data(0x00);
  318.                 LCD_WR_Data(0xE6);
  319.                 LCD_WR_Data(0x00);

  320.                 LCD_WR_Cmd(0xC5);
  321.                 LCD_WR_Data(0x32);
  322.                 LCD_WR_Data(0x00);
  323.                 LCD_WR_Data(0x44);
  324.                 LCD_WR_Data(0x00);
  325.                 LCD_WR_Data(0x65);
  326.                 LCD_WR_Data(0x00);
  327.                 LCD_WR_Data(0x76);
  328.                 LCD_WR_Data(0x00);
  329.                 LCD_WR_Data(0x88);
  330.                 LCD_WR_Data(0x00);

  331.                 LCD_WR_Cmd(0xC6);
  332.                 LCD_WR_Data(0x20);
  333.                 LCD_WR_Data(0x00);
  334.                 LCD_WR_Data(0x17);
  335.                 LCD_WR_Data(0x00);
  336.                 LCD_WR_Data(0x01);
  337.                 LCD_WR_Data(0x00);

  338.                 LCD_WR_Cmd(0xC7);
  339.                 LCD_WR_Data(0x00);
  340.                 LCD_WR_Data(0x00);
  341.                 LCD_WR_Data(0x00);
  342.                 LCD_WR_Data(0x00);

  343.                 LCD_WR_Cmd(0xC8);
  344.                 LCD_WR_Data(0x00);
  345.                 LCD_WR_Data(0x00);
  346.                 LCD_WR_Data(0x00);
  347.                 LCD_WR_Data(0x00);

  348.                 LCD_WR_Cmd(0xC9);
  349.                 LCD_WR_Data(0x00);
  350.                 LCD_WR_Data(0x00);
  351.                 LCD_WR_Data(0x00);
  352.                 LCD_WR_Data(0x00);
  353.                 LCD_WR_Data(0x00);
  354.                 LCD_WR_Data(0x00);
  355.                 LCD_WR_Data(0x00);
  356.                 LCD_WR_Data(0x00);
  357.                 LCD_WR_Data(0x00);
  358.                 LCD_WR_Data(0x00);
  359.                 LCD_WR_Data(0x00);
  360.                 LCD_WR_Data(0x00);
  361.                 LCD_WR_Data(0x00);
  362.                 LCD_WR_Data(0x00);
  363.                 LCD_WR_Data(0x00);
  364.                 LCD_WR_Data(0x00);

  365.                 LCD_WR_Cmd(0xE0);
  366.                 LCD_WR_Data(0x16);
  367.                 LCD_WR_Data(0x00);
  368.                 LCD_WR_Data(0x1C);
  369.                 LCD_WR_Data(0x00);
  370.                 LCD_WR_Data(0x21);
  371.                 LCD_WR_Data(0x00);
  372.                 LCD_WR_Data(0x36);
  373.                 LCD_WR_Data(0x00);
  374.                 LCD_WR_Data(0x46);
  375.                 LCD_WR_Data(0x00);
  376.                 LCD_WR_Data(0x52);
  377.                 LCD_WR_Data(0x00);
  378.                 LCD_WR_Data(0x64);
  379.                 LCD_WR_Data(0x00);
  380.                 LCD_WR_Data(0x7A);
  381.                 LCD_WR_Data(0x00);
  382.                 LCD_WR_Data(0x8B);
  383.                 LCD_WR_Data(0x00);
  384.                 LCD_WR_Data(0x99);
  385.                 LCD_WR_Data(0x00);
  386.                 LCD_WR_Data(0xA8);
  387.                 LCD_WR_Data(0x00);
  388.                 LCD_WR_Data(0xB9);
  389.                 LCD_WR_Data(0x00);
  390.                 LCD_WR_Data(0xC4);
  391.                 LCD_WR_Data(0x00);
  392.                 LCD_WR_Data(0xCA);
  393.                 LCD_WR_Data(0x00);
  394.                 LCD_WR_Data(0xD2);
  395.                 LCD_WR_Data(0x00);
  396.                 LCD_WR_Data(0xD9);
  397.                 LCD_WR_Data(0x00);
  398.                 LCD_WR_Data(0xE0);
  399.                 LCD_WR_Data(0x00);
  400.                 LCD_WR_Data(0xF3);
  401.                 LCD_WR_Data(0x00);

  402.                 LCD_WR_Cmd(0xE1);
  403.                 LCD_WR_Data(0x16);
  404.                 LCD_WR_Data(0x00);
  405.                 LCD_WR_Data(0x1C);
  406.                 LCD_WR_Data(0x00);
  407.                 LCD_WR_Data(0x22);
  408.                 LCD_WR_Data(0x00);
  409.                 LCD_WR_Data(0x36);
  410.                 LCD_WR_Data(0x00);
  411.                 LCD_WR_Data(0x45);
  412.                 LCD_WR_Data(0x00);
  413.                 LCD_WR_Data(0x52);
  414.                 LCD_WR_Data(0x00);
  415.                 LCD_WR_Data(0x64);
  416.                 LCD_WR_Data(0x00);
  417.                 LCD_WR_Data(0x7A);
  418.                 LCD_WR_Data(0x00);
  419.                 LCD_WR_Data(0x8B);
  420.                 LCD_WR_Data(0x00);
  421.                 LCD_WR_Data(0x99);
  422.                 LCD_WR_Data(0x00);
  423.                 LCD_WR_Data(0xA8);
  424.                 LCD_WR_Data(0x00);
  425.                 LCD_WR_Data(0xB9);
  426.                 LCD_WR_Data(0x00);
  427.                 LCD_WR_Data(0xC4);
  428.                 LCD_WR_Data(0x00);
  429.                 LCD_WR_Data(0xCA);
  430.                 LCD_WR_Data(0x00);
  431.                 LCD_WR_Data(0xD2);
  432.                 LCD_WR_Data(0x00);
  433.                 LCD_WR_Data(0xD8);
  434.                 LCD_WR_Data(0x00);
  435.                 LCD_WR_Data(0xE0);
  436.                 LCD_WR_Data(0x00);
  437.                 LCD_WR_Data(0xF3);
  438.                 LCD_WR_Data(0x00);

  439.                 LCD_WR_Cmd(0xE2);
  440.                 LCD_WR_Data(0x05);
  441.                 LCD_WR_Data(0x00);
  442.                 LCD_WR_Data(0x0B);
  443.                 LCD_WR_Data(0x00);
  444.                 LCD_WR_Data(0x1B);
  445.                 LCD_WR_Data(0x00);
  446.                 LCD_WR_Data(0x34);
  447.                 LCD_WR_Data(0x00);
  448.                 LCD_WR_Data(0x44);
  449.                 LCD_WR_Data(0x00);
  450.                 LCD_WR_Data(0x4F);
  451.                 LCD_WR_Data(0x00);
  452.                 LCD_WR_Data(0x61);
  453.                 LCD_WR_Data(0x00);
  454.                 LCD_WR_Data(0x79);
  455.                 LCD_WR_Data(0x00);
  456.                 LCD_WR_Data(0x88);
  457.                 LCD_WR_Data(0x00);
  458.                 LCD_WR_Data(0x97);
  459.                 LCD_WR_Data(0x00);
  460.                 LCD_WR_Data(0xA6);
  461.                 LCD_WR_Data(0x00);
  462.                 LCD_WR_Data(0xB7);
  463.                 LCD_WR_Data(0x00);
  464.                 LCD_WR_Data(0xC2);
  465.                 LCD_WR_Data(0x00);
  466.                 LCD_WR_Data(0xC7);
  467.                 LCD_WR_Data(0x00);
  468.                 LCD_WR_Data(0xD1);
  469.                 LCD_WR_Data(0x00);
  470.                 LCD_WR_Data(0xD6);
  471.                 LCD_WR_Data(0x00);
  472.                 LCD_WR_Data(0xDD);
  473.                 LCD_WR_Data(0x00);
  474.                 LCD_WR_Data(0xF3);
  475.                 LCD_WR_Data(0x00);
  476.                 LCD_WR_Cmd(0xE3);
  477.                 LCD_WR_Data(0x05);
  478.                 LCD_WR_Data(0x00);
  479.                 LCD_WR_Data(0xA);
  480.                 LCD_WR_Data(0x00);
  481.                 LCD_WR_Data(0x1C);
  482.                 LCD_WR_Data(0x00);
  483.                 LCD_WR_Data(0x33);
  484.                 LCD_WR_Data(0x00);
  485.                 LCD_WR_Data(0x44);
  486.                 LCD_WR_Data(0x00);
  487.                 LCD_WR_Data(0x50);
  488.                 LCD_WR_Data(0x00);
  489.                 LCD_WR_Data(0x62);
  490.                 LCD_WR_Data(0x00);
  491.                 LCD_WR_Data(0x78);
  492.                 LCD_WR_Data(0x00);
  493.                 LCD_WR_Data(0x88);
  494.                 LCD_WR_Data(0x00);
  495.                 LCD_WR_Data(0x97);
  496.                 LCD_WR_Data(0x00);
  497.                 LCD_WR_Data(0xA6);
  498.                 LCD_WR_Data(0x00);
  499.                 LCD_WR_Data(0xB7);
  500.                 LCD_WR_Data(0x00);
  501.                 LCD_WR_Data(0xC2);
  502.                 LCD_WR_Data(0x00);
  503.                 LCD_WR_Data(0xC7);
  504.                 LCD_WR_Data(0x00);
  505.                 LCD_WR_Data(0xD1);
  506.                 LCD_WR_Data(0x00);
  507.                 LCD_WR_Data(0xD5);
  508.                 LCD_WR_Data(0x00);
  509.                 LCD_WR_Data(0xDD);
  510.                 LCD_WR_Data(0x00);
  511.                 LCD_WR_Data(0xF3);
  512.                 LCD_WR_Data(0x00);

  513.                 LCD_WR_Cmd(0xE4);
  514.                 LCD_WR_Data(0x01);
  515.                 LCD_WR_Data(0x00);
  516.                 LCD_WR_Data(0x01);
  517.                 LCD_WR_Data(0x00);
  518.                 LCD_WR_Data(0x02);
  519.                 LCD_WR_Data(0x00);
  520.                 LCD_WR_Data(0x2A);
  521.                 LCD_WR_Data(0x00);
  522.                 LCD_WR_Data(0x3C);
  523.                 LCD_WR_Data(0x00);
  524.                 LCD_WR_Data(0x4B);
  525.                 LCD_WR_Data(0x00);
  526.                 LCD_WR_Data(0x5D);
  527.                 LCD_WR_Data(0x00);
  528.                 LCD_WR_Data(0x74);
  529.                 LCD_WR_Data(0x00);
  530.                 LCD_WR_Data(0x84);
  531.                 LCD_WR_Data(0x00);
  532.                 LCD_WR_Data(0x93);
  533.                 LCD_WR_Data(0x00);
  534.                 LCD_WR_Data(0xA2);
  535.                 LCD_WR_Data(0x00);
  536.                 LCD_WR_Data(0xB3);
  537.                 LCD_WR_Data(0x00);
  538.                 LCD_WR_Data(0xBE);
  539.                 LCD_WR_Data(0x00);
  540.                 LCD_WR_Data(0xC4);
  541.                 LCD_WR_Data(0x00);
  542.                 LCD_WR_Data(0xCD);
  543.                 LCD_WR_Data(0x00);
  544.                 LCD_WR_Data(0xD3);
  545.                 LCD_WR_Data(0x00);
  546.                 LCD_WR_Data(0xDD);
  547.                 LCD_WR_Data(0x00);
  548.                 LCD_WR_Data(0xF3);
  549.                 LCD_WR_Data(0x00);
  550.                 LCD_WR_Cmd(0xE5);
  551.                 LCD_WR_Data(0x00);
  552.                 LCD_WR_Data(0x00);
  553.                 LCD_WR_Data(0x00);
  554.                 LCD_WR_Data(0x00);
  555.                 LCD_WR_Data(0x02);
  556.                 LCD_WR_Data(0x00);
  557.                 LCD_WR_Data(0x29);
  558.                 LCD_WR_Data(0x00);
  559.                 LCD_WR_Data(0x3C);
  560.                 LCD_WR_Data(0x00);
  561.                 LCD_WR_Data(0x4B);
  562.                 LCD_WR_Data(0x00);
  563.                 LCD_WR_Data(0x5D);
  564.                 LCD_WR_Data(0x00);
  565.                 LCD_WR_Data(0x74);
  566.                 LCD_WR_Data(0x00);
  567.                 LCD_WR_Data(0x84);
  568.                 LCD_WR_Data(0x00);
  569.                 LCD_WR_Data(0x93);
  570.                 LCD_WR_Data(0x00);
  571.                 LCD_WR_Data(0xA2);
  572.                 LCD_WR_Data(0x00);
  573.                 LCD_WR_Data(0xB3);
  574.                 LCD_WR_Data(0x00);
  575.                 LCD_WR_Data(0xBE);
  576.                 LCD_WR_Data(0x00);
  577.                 LCD_WR_Data(0xC4);
  578.                 LCD_WR_Data(0x00);
  579.                 LCD_WR_Data(0xCD);
  580.                 LCD_WR_Data(0x00);
  581.                 LCD_WR_Data(0xD3);
  582.                 LCD_WR_Data(0x00);
  583.                 LCD_WR_Data(0xDC);
  584.                 LCD_WR_Data(0x00);
  585.                 LCD_WR_Data(0xF3);
  586.                 LCD_WR_Data(0x00);

  587.                 LCD_WR_Cmd(0xE6);
  588.                 LCD_WR_Data(0x11);
  589.                 LCD_WR_Data(0x00);
  590.                 LCD_WR_Data(0x34);
  591.                 LCD_WR_Data(0x00);
  592.                 LCD_WR_Data(0x56);
  593.                 LCD_WR_Data(0x00);
  594.                 LCD_WR_Data(0x76);
  595.                 LCD_WR_Data(0x00);
  596.                 LCD_WR_Data(0x77);
  597.                 LCD_WR_Data(0x00);
  598.                 LCD_WR_Data(0x66);
  599.                 LCD_WR_Data(0x00);
  600.                 LCD_WR_Data(0x88);
  601.                 LCD_WR_Data(0x00);
  602.                 LCD_WR_Data(0x99);
  603.                 LCD_WR_Data(0x00);
  604.                 LCD_WR_Data(0xBB);
  605.                 LCD_WR_Data(0x00);
  606.                 LCD_WR_Data(0x99);
  607.                 LCD_WR_Data(0x00);
  608.                 LCD_WR_Data(0x66);
  609.                 LCD_WR_Data(0x00);
  610.                 LCD_WR_Data(0x55);
  611.                 LCD_WR_Data(0x00);
  612.                 LCD_WR_Data(0x55);
  613.                 LCD_WR_Data(0x00);
  614.                 LCD_WR_Data(0x45);
  615.                 LCD_WR_Data(0x00);
  616.                 LCD_WR_Data(0x43);
  617.                 LCD_WR_Data(0x00);
  618.                 LCD_WR_Data(0x44);
  619.                 LCD_WR_Data(0x00);

  620.                 LCD_WR_Cmd(0xE7);
  621.                 LCD_WR_Data(0x32);
  622.                 LCD_WR_Data(0x00);
  623.                 LCD_WR_Data(0x55);
  624.                 LCD_WR_Data(0x00);
  625.                 LCD_WR_Data(0x76);
  626.                 LCD_WR_Data(0x00);
  627.                 LCD_WR_Data(0x66);
  628.                 LCD_WR_Data(0x00);
  629.                 LCD_WR_Data(0x67);
  630.                 LCD_WR_Data(0x00);
  631.                 LCD_WR_Data(0x67);
  632.                 LCD_WR_Data(0x00);
  633.                 LCD_WR_Data(0x87);
  634.                 LCD_WR_Data(0x00);
  635.                 LCD_WR_Data(0x99);
  636.                 LCD_WR_Data(0x00);
  637.                 LCD_WR_Data(0xBB);
  638.                 LCD_WR_Data(0x00);
  639.                 LCD_WR_Data(0x99);
  640.                 LCD_WR_Data(0x00);
  641.                 LCD_WR_Data(0x77);
  642.                 LCD_WR_Data(0x00);
  643.                 LCD_WR_Data(0x44);
  644.                 LCD_WR_Data(0x00);
  645.                 LCD_WR_Data(0x56);
  646.                 LCD_WR_Data(0x00);
  647.                 LCD_WR_Data(0x23);
  648.                 LCD_WR_Data(0x00);
  649.                 LCD_WR_Data(0x33);
  650.                 LCD_WR_Data(0x00);
  651.                 LCD_WR_Data(0x45);
  652.                 LCD_WR_Data(0x00);

  653.                 LCD_WR_Cmd(0xE8);
  654.                 LCD_WR_Data(0x00);
  655.                 LCD_WR_Data(0x00);
  656.                 LCD_WR_Data(0x99);
  657.                 LCD_WR_Data(0x00);
  658.                 LCD_WR_Data(0x87);
  659.                 LCD_WR_Data(0x00);
  660.                 LCD_WR_Data(0x88);
  661.                 LCD_WR_Data(0x00);
  662.                 LCD_WR_Data(0x77);
  663.                 LCD_WR_Data(0x00);
  664.                 LCD_WR_Data(0x66);
  665.                 LCD_WR_Data(0x00);
  666.                 LCD_WR_Data(0x88);
  667.                 LCD_WR_Data(0x00);
  668.                 LCD_WR_Data(0xAA);
  669.                 LCD_WR_Data(0x00);
  670.                 LCD_WR_Data(0xBB);
  671.                 LCD_WR_Data(0x00);
  672.                 LCD_WR_Data(0x99);
  673.                 LCD_WR_Data(0x00);
  674.                 LCD_WR_Data(0x66);
  675.                 LCD_WR_Data(0x00);
  676.                 LCD_WR_Data(0x55);
  677.                 LCD_WR_Data(0x00);
  678.                 LCD_WR_Data(0x55);
  679.                 LCD_WR_Data(0x00);
  680.                 LCD_WR_Data(0x44);
  681.                 LCD_WR_Data(0x00);
  682.                 LCD_WR_Data(0x44);
  683.                 LCD_WR_Data(0x00);
  684.                 LCD_WR_Data(0x55);
  685.                 LCD_WR_Data(0x00);

  686.                 LCD_WR_Cmd(0xE9);
  687.                 LCD_WR_Data(0xAA);
  688.                 LCD_WR_Data(0x00);
  689.                 LCD_WR_Data(0x00);
  690.                 LCD_WR_Data(0x00);

  691.                 LCD_WR_Cmd(0x00);
  692.                 LCD_WR_Data(0xAA);

  693.                 LCD_WR_Cmd(0xCF);
  694.                 LCD_WR_Data(0x00);
  695.                 LCD_WR_Data(0x00);
  696.                 LCD_WR_Data(0x00);
  697.                 LCD_WR_Data(0x00);
  698.                 LCD_WR_Data(0x00);
  699.                 LCD_WR_Data(0x00);
  700.                 LCD_WR_Data(0x00);
  701.                 LCD_WR_Data(0x00);
  702.                 LCD_WR_Data(0x00);
  703.                 LCD_WR_Data(0x00);
  704.                 LCD_WR_Data(0x00);
  705.                 LCD_WR_Data(0x00);
  706.                 LCD_WR_Data(0x00);
  707.                 LCD_WR_Data(0x00);
  708.                 LCD_WR_Data(0x00);
  709.                 LCD_WR_Data(0x00);
  710.                 LCD_WR_Data(0x00);

  711.                 LCD_WR_Cmd(0xF0);
  712.                 LCD_WR_Data(0x00);
  713.                 LCD_WR_Data(0x50);
  714.                 LCD_WR_Data(0x00);
  715.                 LCD_WR_Data(0x00);
  716.                 LCD_WR_Data(0x00);

  717.                 LCD_WR_Cmd(0xF3);
  718.                 LCD_WR_Data(0x00);

  719.                 LCD_WR_Cmd(0xF9);
  720.                 LCD_WR_Data(0x06);
  721.                 LCD_WR_Data(0x10);
  722.                 LCD_WR_Data(0x29);
  723.                 LCD_WR_Data(0x00);

  724.                 LCD_WR_Cmd(0x3A);
  725.                 LCD_WR_Data(0x55);        //66

  726.                 LCD_WR_Cmd(0x11);
  727.                 for(i=0; i<0xFFFFFFFF; i--);
  728.                 LCD_WR_Cmd(0x29);
  729.                 LCD_WR_Cmd(0x35);
  730.                 LCD_WR_Data(0x00);

  731.                 LCD_WR_Cmd(0x51);
  732.                 LCD_WR_Data(0xFF);
  733.                 LCD_WR_Cmd(0x53);
  734.                 LCD_WR_Data(0x2C);
  735.                 LCD_WR_Cmd(0x55);
  736.                 LCD_WR_Data(0x82);
  737.                 LCD_WR_Cmd(0x2c);
  738.                
  739.                 LCD_BL(ON);
  740.                 LCD_Clear(WHITE);
  741.                 Set_RW_Direction(L2R_U2D);
  742. }
  743. //-----------------------------------------------------------------------------------------------------------------






  744. // 读液晶驱动 ID (基于 5310 驱动芯片)
  745. //-----------------------------------
  746. u16        RD_ID(void)
  747. {
  748.                 u16 tmp=0;
  749.        
  750.                 LCD_WR_Cmd(0XD4);                                  
  751.                 tmp=LCD_RD_Data();  //dummy read  
  752.                 tmp=LCD_RD_Data();  //读回0X01         
  753.                 tmp=LCD_RD_Data();  //读回0X53       
  754.                 tmp<<=8;         
  755.                 tmp|=LCD_RD_Data();        //这里读回0X10                 

  756.                 // 加入此句可通过串口打印出驱动 ID
  757.                 //printf(" LCD ID:%x\r\n",tmp); //打印LCD ID   
  758.        
  759.                 return tmp;
  760. }
  761. //-----------------------------------------------------------------------------------------------------------------





  762. // 开窗函数
  763. //-----------------------------------------------------------------------------------------------------------------
  764. void        Open_Window(u16 Xpos, u16 Ypos, u16 Width, u16 Hight)
  765. {
  766.                 // 设置坐标
  767.                 LCD_WR_Cmd(0x2A);
  768.                 LCD_WR_Data(Xpos>>8);
  769.                 LCD_WR_Data(Xpos&0xFF);
  770.                 LCD_WR_Data( (Xpos+Width)>>8 );
  771.                 LCD_WR_Data( (Xpos+Width)&0xFF );
  772.        
  773.                 LCD_WR_Cmd(0x2B);
  774.                 LCD_WR_Data(Ypos>>8);
  775.                 LCD_WR_Data(Ypos&0xFF);
  776.                 LCD_WR_Data( (Ypos+Hight)>>8 );
  777.                 LCD_WR_Data( (Ypos+Hight)&0xFF );
  778. }
  779. //-----------------------------------------------------------------------------------------------------------------





  780. //设置光标位置
  781. //Xpos:横坐标
  782. //Ypos:纵坐标
  783. //-----------------------------------------------------------------------------------------------------------------
  784. void LCD_SetCursor(u16 Xpos, u16 Ypos)
  785. {         
  786.                 LCD_WR_Cmd(0X2A);                 // 设置x光标
  787.                 LCD_WR_Data(Xpos>>8);
  788.                 LCD_WR_Data(Xpos&0XFF);                          
  789.                 LCD_WR_Cmd(0X2B);                 // 设置y光标
  790.                 LCD_WR_Data(Ypos>>8);
  791.                 LCD_WR_Data(Ypos&0XFF);                
  792. }
  793. //-----------------------------------------------------------------------------------------------------------------







  794. //画点
  795. //x,y:坐标
  796. //POINT_COLOR:此点的颜色
  797. //-----------------------------------------------------------------------------------------------------------------
  798. void LCD_DrawPoint(u16 x,u16 y,u16 color)
  799. {
  800.         LCD_SetCursor(x,y);                //设置光标位置
  801.         LCD_WR_GRAM_Cmd();                //开始写入GRAM
  802.         LCD_WR_Data(color);
  803. }
  804. //-----------------------------------------------------------------------------------------------------------------



  805. //快速画点
  806. //x,y:坐标
  807. //color:颜色
  808. void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
  809. {          
  810.         LCD_WR_Cmd(Set_X_Pos);
  811.         LCD_WR_Data(x>>8);LCD_WR_Data(x&0XFF);                           
  812.         LCD_WR_Cmd(Set_Y_Pos);
  813.         LCD_WR_Data(y>>8);LCD_WR_Data(y&0XFF);                            
  814.         LCD_WR_GRAM_Cmd();
  815.         LCD_WR_Data(color);
  816. }         









  817. //当mdk -O1时间优化时需要设置
  818. //延时i
  819. void opt_delay(u8 i)
  820. {
  821.         while(i--);
  822. }



  823. // 读点
  824. // x,y:坐标点
  825. //-----------------------------------------------------------------------------------------------------------------
  826. u16  LCD_ReadPoint(u16 x,u16 y)
  827. {
  828.         u16 r=0,g=0,b=0;
  829.        
  830.         if(x>=LCD_WIDTH||y>=LCD_HIGHT)
  831.                 return 0;                             //超过了范围,直接返回                  
  832.         LCD_SetCursor(x,y);
  833.        
  834.         LCD_WR_Cmd(RD_GRAM);
  835.        
  836.         opt_delay(2);          
  837.         b=LCD_RD_Data();
  838.         g=r&0XFF;                //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位
  839.         g<<=8;
  840.        
  841.         return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));
  842. }
  843. //-----------------------------------------------------------------------------------------------------------------





  844. // 在指定位置画一个指定大小的圆
  845. // (x,y):中心点
  846. // r    :半径
  847. //-----------------------------------------------------------------------------------------------------------------
  848. void LCD_Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
  849. {
  850.         int a,b;
  851.         int di;
  852.         a=0;b=r;          
  853.         di=3-(r<<1);                                  //判断下个点位置的标志
  854.         while(a<=b)
  855.         {
  856.                 LCD_DrawPoint(x0+a,y0-b,color);             //5
  857.                 LCD_DrawPoint(x0+b,y0-a,color);             //0           
  858.                 LCD_DrawPoint(x0+b,y0+a,color);             //4               
  859.                 LCD_DrawPoint(x0+a,y0+b,color);             //6
  860.                 LCD_DrawPoint(x0-a,y0+b,color);             //1      
  861.                 LCD_DrawPoint(x0-b,y0+a,color);            
  862.                 LCD_DrawPoint(x0-a,y0-b,color);             //2            
  863.           LCD_DrawPoint(x0-b,y0-a,color);             //7                     
  864.                 a++;
  865.                 //使用Bresenham算法画圆     
  866.                 if(di<0)di +=4*a+6;          
  867.                 else
  868.                 {
  869.                         di+=10+4*(a-b);   
  870.                         b--;
  871.                 }                                                     
  872.         }
  873. }
  874. //-----------------------------------------------------------------------------------------------------------------




  875. // 画线
  876. // x1,y1:起点坐标
  877. // x2,y2:终点坐标
  878. //-----------------------------------------------------------------------------------------------------------------
  879. void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2, u16 color)
  880. {
  881.         u16 t;
  882.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  883.         int incx,incy,uRow,uCol;
  884.         delta_x=x2-x1;                               // 计算坐标增量
  885.         delta_y=y2-y1;
  886.         uRow=x1;
  887.         uCol=y1;
  888.         if(delta_x>0)incx=1;                         // 设置单步方向
  889.         else if(delta_x==0)incx=0;                   // 垂直线
  890.         else {incx=-1;delta_x=-delta_x;}
  891.         if(delta_y>0)incy=1;
  892.         else if(delta_y==0)incy=0;                   // 水平线
  893.         else{incy=-1;delta_y=-delta_y;}
  894.         if( delta_x>delta_y)distance=delta_x;        // 选取基本增量坐标轴
  895.         else distance=delta_y;
  896.         for(t=0;t<=distance+1;t++ )                  // 画线输出
  897.         {  
  898.                 LCD_DrawPoint(uRow,uCol,color);            // 画点
  899.                 xerr+=delta_x ;
  900.                 yerr+=delta_y ;
  901.                 if(xerr>distance)
  902.                 {
  903.                         xerr-=distance;
  904.                         uRow+=incx;
  905.                 }
  906.                 if(yerr>distance)
  907.                 {
  908.                         yerr-=distance;
  909.                         uCol+=incy;
  910.                 }
  911.         }  
  912. }
  913. //-----------------------------------------------------------------------------------------------------------------





  914. // 画矩形          
  915. // (x1,y1),(x2,y2):矩形的对角坐标
  916. //-----------------------------------------------------------------------------------------------------------------
  917. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2, u16 color)
  918. {
  919.         LCD_DrawLine(x1,y1,x2,y1,color);
  920.         LCD_DrawLine(x1,y1,x1,y2,color);
  921.         LCD_DrawLine(x1,y2,x2,y2,color);
  922.         LCD_DrawLine(x2,y1,x2,y2,color);
  923. }
  924. //-----------------------------------------------------------------------------------------------------------------






  925. // 在指定区域内填充单个颜色
  926. // (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
  927. // color:要填充的颜色
  928. //-----------------------------------------------------------------------------------------------------------------
  929. void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
  930. {         
  931.         u16 i,j;
  932.         u16 xlen=0;

  933.         xlen=ex-sx+1;         
  934.         for(i=sy;i<=ey;i++)
  935.         {
  936.                 LCD_SetCursor(sx,i);                    // 设置光标位置
  937.                 LCD_WR_GRAM_Cmd();                      // 开始写入GRAM          
  938.                 for(j=0;j<xlen;j++)LCD_WR_Data(color);  // 显示颜色             
  939.         }
  940. }  
  941. //-----------------------------------------------------------------------------------------------------------------






  942. // 在指定区域内填充指定颜色块                         
  943. // (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
  944. // color:要填充的颜色
  945. //-----------------------------------------------------------------------------------------------------------------
  946. void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
  947. {  
  948.         u16 height,width;
  949.         u16 i,j;
  950.         width=ex-sx+1;                                      // 得到填充的宽度
  951.         height=ey-sy+1;                                     // 高度
  952.         for(i=0;i<height;i++)
  953.         {
  954.                 LCD_SetCursor(sx,sy+i);                           // 设置光标位置
  955.                 LCD_WR_GRAM_Cmd();                                // 开始写入GRAM
  956.                 for(j=0;j<width;j++)LCD_WR_Data(color[i*width+j]);// 写入数据
  957.         }                  
  958. }  
  959. //-----------------------------------------------------------------------------------------------------------------






  960. // 在指定位置显示一个字符
  961. // x,y:起始坐标
  962. // num:要显示的字符:" "--->"~"
  963. // size:字体大小 12/16/24
  964. // mode:叠加方式(1)还是非叠加方式(0)
  965. //-----------------------------------------------------------------------------------------------------------------
  966. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
  967. {                                                            
  968.   u8 temp,t1,t;
  969.         u16 y0=y;
  970.         u8 csize=(size/8+((size%8)?1:0))*(size/2);    // 得到字体一个字符对应点阵集所占的字节数       
  971.        
  972.         num=num-' ';                                  // 得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
  973.         for(t=0;t<csize;t++)
  974.         {   
  975.                 if(size==12)temp=asc2_1206[num][t];         // 调用1206字体
  976.                 else if(size==16)temp=asc2_1608[num][t];    // 调用1608字体
  977.                 else if(size==24)temp=asc2_2412[num][t];    // 调用2412字体
  978.                 else return;                                // 没有的字库
  979.                 for(t1=0;t1<8;t1++)
  980.                 {                            
  981.                         if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
  982.                         else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
  983.                         temp<<=1;
  984.                         y++;
  985.                         if(y>=LCD_HIGHT)return;               // 超区域了
  986.                         if((y-y0)==size)
  987.                         {
  988.                                 y=y0;
  989.                                 x++;
  990.                                 if(x>=LCD_WIDTH)return;              // 超区域了
  991.                                 break;
  992.                         }
  993.                 }           
  994.         }                                            
  995. }   
  996. //-----------------------------------------------------------------------------------------------------------------







  997. //m^n函数
  998. //返回值:m^n次方.
  999. //-----------------------------------------------------------------------------------------------------------------
  1000. u32 LCD_Pow(u8 m,u8 n)
  1001. {
  1002.         u32 result=1;         
  1003.         while(n--)result*=m;   
  1004.         return result;
  1005. }       
  1006. //-----------------------------------------------------------------------------------------------------------------







  1007. //显示数字,高位为0,则不显示
  1008. //x,y :起点坐标         
  1009. //len :数字的位数
  1010. //size:字体大小
  1011. //color:颜色
  1012. //num:数值(0~4294967295);         
  1013. //-----------------------------------------------------------------------------------------------------------------
  1014. void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
  1015. {                
  1016.         u8 t,temp;
  1017.         u8 enshow=0;                                                  
  1018.         for(t=0;t<len;t++)
  1019.         {
  1020.                 temp=(num/LCD_Pow(10,len-t-1))%10;
  1021.                 if(enshow==0&&t<(len-1))
  1022.                 {
  1023.                         if(temp==0)
  1024.                         {
  1025.                                 LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
  1026.                                 continue;
  1027.                         }else enshow=1;
  1028.                           
  1029.                 }
  1030.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
  1031.         }
  1032. }
  1033. //-----------------------------------------------------------------------------------------------------------------








  1034. //显示数字,高位为0,还是显示
  1035. //x,y:起点坐标
  1036. //num:数值(0~999999999);         
  1037. //len:长度(即要显示的位数)
  1038. //size:字体大小
  1039. //mode:
  1040. //[7]:0,不填充;1,填充0.
  1041. //[6:1]:保留
  1042. //[0]:0,非叠加显示;1,叠加显示.
  1043. //-----------------------------------------------------------------------------------------------------------------
  1044. void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
  1045. {  
  1046.         u8 t,temp;
  1047.         u8 enshow=0;                                                  
  1048.         for(t=0;t<len;t++)
  1049.         {
  1050.                 temp=(num/LCD_Pow(10,len-t-1))%10;
  1051.                 if(enshow==0&&t<(len-1))
  1052.                 {
  1053.                         if(temp==0)
  1054.                         {
  1055.                                 if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,'0',size,mode&0X01);  
  1056.                                 else LCD_ShowChar(x+(size/2)*t,y,' ',size,mode&0X01);  
  1057.                                 continue;
  1058.                         }else enshow=1;
  1059.                           
  1060.                 }
  1061.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode&0X01);
  1062.         }
  1063. }
  1064. //-----------------------------------------------------------------------------------------------------------------






  1065. //显示字符串
  1066. //x,y:起点坐标
  1067. //width,height:区域大小  
  1068. //size:字体大小
  1069. //*p:字符串起始地址                  
  1070. //-----------------------------------------------------------------------------------------------------------------
  1071. void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
  1072. {         
  1073.         u8 x0=x;
  1074.         width+=x;
  1075.         height+=y;
  1076.     while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
  1077.     {      
  1078.         if(x>=width){x=x0;y+=size;}
  1079.         if(y>=height)break;//退出
  1080.         LCD_ShowChar(x,y,*p,size,0);
  1081.         x+=size/2;
  1082.         p++;
  1083.     }  
  1084. }
  1085. //-----------------------------------------------------------------------------------------------------------------
 楼主| kqh11a 发表于 2022-12-31 23:59 | 显示全部楼层
以上便完成了对LCD驱动及功能函数的一个移植。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

554

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部