bsp_ili9341_lcd.h

  1. #ifndef __BSP_ILI9341_LCD_H
  2. #define __BSP_ILI9341_LCD_H
  3. #include "stm32f10x.h"
  4. #include "./font/fonts.h"
  5. /*****************************************************************************
  6. 2^26 =0X0400 0000 = 64MB,每个 BANK 有4*64MB = 256MB
  7. 64MB:FSMC_Bank1_NORSRAM1:0X6000 0000 ~ 0X63FF FFFF
  8. 64MB:FSMC_Bank1_NORSRAM2:0X6400 0000 ~ 0X67FF FFFF
  9. 64MB:FSMC_Bank1_NORSRAM3:0X6800 0000 ~ 0X6BFF FFFF
  10. 64MB:FSMC_Bank1_NORSRAM4:0X6C00 0000 ~ 0X6FFF FFFF
  11. 选择BANK1-BORSRAM4 连接 TFT,地址范围为0X6C00 0000 ~ 0X6FFF FFFF
  12. FSMC_A23 接LCD的DC(寄存器/数据选择)脚
  13. 寄存器基地址 = 0X6C00 0000
  14. RAM基地址 = 0X6D00 0000 = 0X6C00 0000+2^23*2 = 0X6C00 0000 + 0X100 0000 = 0X6D00 0000
  15. 当选择不同的地址线时,地址要重新计算
  16. *******************************************************************************/
  17. /*************************** ILI9341 显示屏的 FSMC 参数定义 ********************/
  18. //FSMC_Bank1_NORSRAM用于LCD命令操作的地址
  19. #define FSMC_Addr_ILI9341_CMD ( ( uint32_t ) 0x6C000000 )
  20. //FSMC_Bank1_NORSRAM用于LCD数据操作的地址
  21. #define FSMC_Addr_ILI9341_DATA ( ( uint32_t ) 0x6D000000 )
  22. //由片选引脚决定的NOR/SRAM块
  23. #define FSMC_Bank1_NORSRAMx FSMC_Bank1_NORSRAM4
  24. /************************* ILI9341 显示屏8080通讯引脚定义 **********************/
  25. /******控制信号线******/
  26. //片选,选择NOR/SRAM块
  27. #define ILI9341_CS_CLK RCC_APB2Periph_GPIOG
  28. #define ILI9341_CS_PORT GPIOG
  29. #define ILI9341_CS_PIN GPIO_Pin_12
  30. //DC引脚,使用FSMC的地址信号控制,本引脚决定了访问LCD时使用的地址
  31. //PE2为FSMC_A23
  32. #define ILI9341_DC_CLK RCC_APB2Periph_GPIOE
  33. #define ILI9341_DC_PORT GPIOE
  34. #define ILI9341_DC_PIN GPIO_Pin_2
  35. //写使能
  36. #define ILI9341_WR_CLK RCC_APB2Periph_GPIOD
  37. #define ILI9341_WR_PORT GPIOD
  38. #define ILI9341_WR_PIN GPIO_Pin_5
  39. //读使能
  40. #define ILI9341_RD_CLK RCC_APB2Periph_GPIOD
  41. #define ILI9341_RD_PORT GPIOD
  42. #define ILI9341_RD_PIN GPIO_Pin_4
  43. //复位引脚
  44. #define ILI9341_RST_CLK RCC_APB2Periph_GPIOG
  45. #define ILI9341_RST_PORT GPIOG
  46. #define ILI9341_RST_PIN GPIO_Pin_11
  47. //背光引脚
  48. #define ILI9341_BK_CLK RCC_APB2Periph_GPIOG
  49. #define ILI9341_BK_PORT GPIOG
  50. #define ILI9341_BK_PIN GPIO_Pin_6
  51. /********数据信号线***************/
  52. #define ILI9341_D0_CLK RCC_APB2Periph_GPIOD
  53. #define ILI9341_D0_PORT GPIOD
  54. #define ILI9341_D0_PIN GPIO_Pin_14
  55. #define ILI9341_D1_CLK RCC_APB2Periph_GPIOD
  56. #define ILI9341_D1_PORT GPIOD
  57. #define ILI9341_D1_PIN GPIO_Pin_15
  58. #define ILI9341_D2_CLK RCC_APB2Periph_GPIOD
  59. #define ILI9341_D2_PORT GPIOD
  60. #define ILI9341_D2_PIN GPIO_Pin_0
  61. #define ILI9341_D3_CLK RCC_APB2Periph_GPIOD
  62. #define ILI9341_D3_PORT GPIOD
  63. #define ILI9341_D3_PIN GPIO_Pin_1
  64. #define ILI9341_D4_CLK RCC_APB2Periph_GPIOE
  65. #define ILI9341_D4_PORT GPIOE
  66. #define ILI9341_D4_PIN GPIO_Pin_7
  67. #define ILI9341_D5_CLK RCC_APB2Periph_GPIOE
  68. #define ILI9341_D5_PORT GPIOE
  69. #define ILI9341_D5_PIN GPIO_Pin_8
  70. #define ILI9341_D6_CLK RCC_APB2Periph_GPIOE
  71. #define ILI9341_D6_PORT GPIOE
  72. #define ILI9341_D6_PIN GPIO_Pin_9
  73. #define ILI9341_D7_CLK RCC_APB2Periph_GPIOE
  74. #define ILI9341_D7_PORT GPIOE
  75. #define ILI9341_D7_PIN GPIO_Pin_10
  76. #define ILI9341_D8_CLK RCC_APB2Periph_GPIOE
  77. #define ILI9341_D8_PORT GPIOE
  78. #define ILI9341_D8_PIN GPIO_Pin_11
  79. #define ILI9341_D9_CLK RCC_APB2Periph_GPIOE
  80. #define ILI9341_D9_PORT GPIOE
  81. #define ILI9341_D9_PIN GPIO_Pin_12
  82. #define ILI9341_D10_CLK RCC_APB2Periph_GPIOE
  83. #define ILI9341_D10_PORT GPIOE
  84. #define ILI9341_D10_PIN GPIO_Pin_13
  85. #define ILI9341_D11_CLK RCC_APB2Periph_GPIOE
  86. #define ILI9341_D11_PORT GPIOE
  87. #define ILI9341_D11_PIN GPIO_Pin_14
  88. #define ILI9341_D12_CLK RCC_APB2Periph_GPIOE
  89. #define ILI9341_D12_PORT GPIOE
  90. #define ILI9341_D12_PIN GPIO_Pin_15
  91. #define ILI9341_D13_CLK RCC_APB2Periph_GPIOD
  92. #define ILI9341_D13_PORT GPIOD
  93. #define ILI9341_D13_PIN GPIO_Pin_8
  94. #define ILI9341_D14_CLK RCC_APB2Periph_GPIOD
  95. #define ILI9341_D14_PORT GPIOD
  96. #define ILI9341_D14_PIN GPIO_Pin_9
  97. #define ILI9341_D15_CLK RCC_APB2Periph_GPIOD
  98. #define ILI9341_D15_PORT GPIOD
  99. #define ILI9341_D15_PIN GPIO_Pin_10
  100. /************************************ 调试预用 ***********************************/
  101. #define DEBUG_DELAY()
  102. /*********************** ILI934 显示区域的起始坐标和总行列数 *********************/
  103. #define ILI9341_DispWindow_X_Star 0 //起始点的X坐标
  104. #define ILI9341_DispWindow_Y_Star 0 //起始点的Y坐标
  105. #define ILI9341_LESS_PIXEL 240 //液晶屏较短方向的像素宽度
  106. #define ILI9341_MORE_PIXEL 320 //液晶屏较长方向的像素宽度
  107. //根据液晶扫描方向而变化的XY像素宽度
  108. //调用ILI9341_GramScan函数设置方向时会自动更改
  109. extern uint16_t LCD_X_LENGTH,LCD_Y_LENGTH;
  110. //液晶屏扫描模式
  111. //参数可选值为0-7
  112. extern uint8_t LCD_SCAN_MODE;
  113. /******************* 定义 ILI934 显示屏常用颜色 ********************************/
  114. #define BACKGROUND BLACK //默认背景颜色
  115. #define WHITE 0xFFFF //白色
  116. #define BLACK 0x0000 //黑色
  117. #define GREY 0xF7DE //灰色
  118. #define BLUE 0x001F //蓝色
  119. #define BLUE2 0x051F //浅蓝色
  120. #define RED 0xF800 //红色
  121. #define MAGENTA 0xF81F //红紫色,洋红色
  122. #define GREEN 0x07E0 //绿色
  123. #define CYAN 0x7FFF //蓝绿色,青色
  124. #define YELLOW 0xFFE0 //黄色
  125. #define BRED 0xF81F
  126. #define GRED 0xFFE0
  127. #define GBLUE 0x07FF
  128. /************************ 定义 ILI934 常用命令 ********************************/
  129. #define CMD_SetCoordinateX 0x2A //设置X坐标
  130. #define CMD_SetCoordinateY 0x2B //设置Y坐标
  131. #define CMD_SetPixel 0x2C //填充像素
  132. /***************** 声明 ILI934 函数 ***********************************/
  133. void ILI9341_Init( void );
  134. void ILI9341_Rst( void );
  135. void ILI9341_BackLed_Control( FunctionalState enumState );
  136. void ILI9341_GramScan( uint8_t ucOtion );
  137. void ILI9341_OpenWindow( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight );
  138. void ILI9341_Clear( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight );
  139. void ILI9341_SetPointPixel( uint16_t usX, uint16_t usY );
  140. uint16_t ILI9341_GetPointPixel( uint16_t usX , uint16_t usY );
  141. void ILI9341_DrawLine( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 );
  142. void ILI9341_DrawRectangle( uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight,uint8_t ucFilled );
  143. void ILI9341_DrawCircle( uint16_t usX_Center, uint16_t usY_Center, uint16_t usRadius, uint8_t ucFilled );
  144. void ILI9341_DispChar_EN( uint16_t usX, uint16_t usY, const char cChar );
  145. void ILI9341_DispStringLine_EN( uint16_t line, char * pStr );
  146. void ILI9341_DispString_EN( uint16_t usX, uint16_t usY, char * pStr );
  147. void ILI9341_DispString_EN_YDir( uint16_t usX,uint16_t usY , char * pStr );
  148. void LCD_SetFont(sFONT *fonts);
  149. sFONT *LCD_GetFont(void);
  150. void LCD_ClearLine(uint16_t Line);
  151. void LCD_SetBackColor(uint16_t Color);
  152. void LCD_SetTextColor(uint16_t Color) ;
  153. void LCD_SetColors(uint16_t TextColor, uint16_t BackColor);
  154. void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor);
  155. #endif /* __BSP_ILI9341_ILI9341_H */

bsp_ili9341_lcd.c

  1. /**
  2. ******************************************************************************
  3. * @file bsp_ili9341_lcd.c
  4. * @version V1.0
  5. * @date 2013-xx-xx
  6. * @brief ili9341液晶屏驱动
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * 实验平台:野火 F103-霸道 STM32 开发板
  11. * 论坛 :http://www.firebbs.cn
  12. * 淘宝 :https://fire-stm32.taobao.com
  13. *
  14. ******************************************************************************
  15. */
  16. #include "./lcd/bsp_ili9341_lcd.h"
  17. #include "./font/fonts.h"
  18. //根据液晶扫描方向而变化的XY像素宽度
  19. //调用ILI9341_GramScan函数设置方向时会自动更改
  20. uint16_t LCD_X_LENGTH = ILI9341_LESS_PIXEL;
  21. uint16_t LCD_Y_LENGTH = ILI9341_MORE_PIXEL;
  22. //液晶屏扫描模式,本变量主要用于方便选择触摸屏的计算参数
  23. //参数可选值为0-7
  24. //调用ILI9341_GramScan函数设置方向时会自动更改
  25. //LCD刚初始化完成时会使用本默认值
  26. uint8_t LCD_SCAN_MODE = 6;
  27. static sFONT *LCD_Currentfonts = &Font8x16; //英文字体
  28. static uint16_t CurrentTextColor = BLACK;//前景色
  29. static uint16_t CurrentBackColor = WHITE;//背景色
  30. __inline void ILI9341_Write_Cmd ( uint16_t usCmd );
  31. __inline void ILI9341_Write_Data ( uint16_t usData );
  32. __inline uint16_t ILI9341_Read_Data ( void );
  33. static void ILI9341_Delay ( __IO uint32_t nCount );
  34. static void ILI9341_GPIO_Config ( void );
  35. static void ILI9341_FSMC_Config ( void );
  36. static void ILI9341_REG_Config ( void );
  37. static void ILI9341_SetCursor ( uint16_t usX, uint16_t usY );
  38. static __inline void ILI9341_FillColor ( uint32_t ulAmout_Point, uint16_t usColor );
  39. static uint16_t ILI9341_Read_PixelData ( void );
  40. /**
  41. * @brief 向ILI9341写入命令
  42. * @param usCmd :要写入的命令(表寄存器地址)
  43. * @retval 无
  44. */
  45. __inline void ILI9341_Write_Cmd ( uint16_t usCmd )
  46. {
  47. * ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_CMD ) = usCmd;
  48. }
  49. /**
  50. * @brief 向ILI9341写入数据
  51. * @param usData :要写入的数据
  52. * @retval 无
  53. */
  54. __inline void ILI9341_Write_Data ( uint16_t usData )
  55. {
  56. * ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA ) = usData;
  57. }
  58. /**
  59. * @brief 从ILI9341读取数据
  60. * @param 无
  61. * @retval 读取到的数据
  62. */
  63. __inline uint16_t ILI9341_Read_Data ( void )
  64. {
  65. return ( * ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA ) );
  66. }
  67. /**
  68. * @brief 用于 ILI9341 简单延时函数
  69. * @param nCount :延时计数值
  70. * @retval 无
  71. */
  72. static void ILI9341_Delay ( __IO uint32_t nCount )
  73. {
  74. for ( ; nCount != 0; nCount -- );
  75. }
  76. /**
  77. * @brief 初始化ILI9341的IO引脚
  78. * @param 无
  79. * @retval 无
  80. */
  81. static void ILI9341_GPIO_Config ( void )
  82. {
  83. GPIO_InitTypeDef GPIO_InitStructure;
  84. /* 使能FSMC对应相应管脚时钟*/
  85. RCC_APB2PeriphClockCmd (
  86. /*控制信号*/
  87. ILI9341_CS_CLK|ILI9341_DC_CLK|ILI9341_WR_CLK|
  88. ILI9341_RD_CLK |ILI9341_BK_CLK|ILI9341_RST_CLK|
  89. /*数据信号*/
  90. ILI9341_D0_CLK|ILI9341_D1_CLK| ILI9341_D2_CLK |
  91. ILI9341_D3_CLK | ILI9341_D4_CLK|ILI9341_D5_CLK|
  92. ILI9341_D6_CLK | ILI9341_D7_CLK|ILI9341_D8_CLK|
  93. ILI9341_D9_CLK | ILI9341_D10_CLK|ILI9341_D11_CLK|
  94. ILI9341_D12_CLK | ILI9341_D13_CLK|ILI9341_D14_CLK|
  95. ILI9341_D15_CLK , ENABLE );
  96. /* 配置FSMC相对应的数据线,FSMC-D0~D15 */
  97. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  98. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  99. GPIO_InitStructure.GPIO_Pin = ILI9341_D0_PIN;
  100. GPIO_Init ( ILI9341_D0_PORT, & GPIO_InitStructure );
  101. GPIO_InitStructure.GPIO_Pin = ILI9341_D1_PIN;
  102. GPIO_Init ( ILI9341_D1_PORT, & GPIO_InitStructure );
  103. GPIO_InitStructure.GPIO_Pin = ILI9341_D2_PIN;
  104. GPIO_Init ( ILI9341_D2_PORT, & GPIO_InitStructure );
  105. GPIO_InitStructure.GPIO_Pin = ILI9341_D3_PIN;
  106. GPIO_Init ( ILI9341_D3_PORT, & GPIO_InitStructure );
  107. GPIO_InitStructure.GPIO_Pin = ILI9341_D4_PIN;
  108. GPIO_Init ( ILI9341_D4_PORT, & GPIO_InitStructure );
  109. GPIO_InitStructure.GPIO_Pin = ILI9341_D5_PIN;
  110. GPIO_Init ( ILI9341_D5_PORT, & GPIO_InitStructure );
  111. GPIO_InitStructure.GPIO_Pin = ILI9341_D6_PIN;
  112. GPIO_Init ( ILI9341_D6_PORT, & GPIO_InitStructure );
  113. GPIO_InitStructure.GPIO_Pin = ILI9341_D7_PIN;
  114. GPIO_Init ( ILI9341_D7_PORT, & GPIO_InitStructure );
  115. GPIO_InitStructure.GPIO_Pin = ILI9341_D8_PIN;
  116. GPIO_Init ( ILI9341_D8_PORT, & GPIO_InitStructure );
  117. GPIO_InitStructure.GPIO_Pin = ILI9341_D9_PIN;
  118. GPIO_Init ( ILI9341_D9_PORT, & GPIO_InitStructure );
  119. GPIO_InitStructure.GPIO_Pin = ILI9341_D10_PIN;
  120. GPIO_Init ( ILI9341_D10_PORT, & GPIO_InitStructure );
  121. GPIO_InitStructure.GPIO_Pin = ILI9341_D11_PIN;
  122. GPIO_Init ( ILI9341_D11_PORT, & GPIO_InitStructure );
  123. GPIO_InitStructure.GPIO_Pin = ILI9341_D12_PIN;
  124. GPIO_Init ( ILI9341_D12_PORT, & GPIO_InitStructure );
  125. GPIO_InitStructure.GPIO_Pin = ILI9341_D13_PIN;
  126. GPIO_Init ( ILI9341_D13_PORT, & GPIO_InitStructure );
  127. GPIO_InitStructure.GPIO_Pin = ILI9341_D14_PIN;
  128. GPIO_Init ( ILI9341_D14_PORT, & GPIO_InitStructure );
  129. GPIO_InitStructure.GPIO_Pin = ILI9341_D15_PIN;
  130. GPIO_Init ( ILI9341_D15_PORT, & GPIO_InitStructure );
  131. /* 配置FSMC相对应的控制线
  132. * FSMC_NOE :LCD-RD
  133. * FSMC_NWE :LCD-WR
  134. * FSMC_NE1 :LCD-CS
  135. * FSMC_A16 :LCD-DC
  136. */
  137. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  138. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  139. GPIO_InitStructure.GPIO_Pin = ILI9341_RD_PIN;
  140. GPIO_Init (ILI9341_RD_PORT, & GPIO_InitStructure );
  141. GPIO_InitStructure.GPIO_Pin = ILI9341_WR_PIN;
  142. GPIO_Init (ILI9341_WR_PORT, & GPIO_InitStructure );
  143. GPIO_InitStructure.GPIO_Pin = ILI9341_CS_PIN;
  144. GPIO_Init ( ILI9341_CS_PORT, & GPIO_InitStructure );
  145. GPIO_InitStructure.GPIO_Pin = ILI9341_DC_PIN;
  146. GPIO_Init ( ILI9341_DC_PORT, & GPIO_InitStructure );
  147. /* 配置LCD复位RST控制管脚*/
  148. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  149. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  150. GPIO_InitStructure.GPIO_Pin = ILI9341_RST_PIN;
  151. GPIO_Init ( ILI9341_RST_PORT, & GPIO_InitStructure );
  152. /* 配置LCD背光控制管脚BK*/
  153. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  154. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  155. GPIO_InitStructure.GPIO_Pin = ILI9341_BK_PIN;
  156. GPIO_Init ( ILI9341_BK_PORT, & GPIO_InitStructure );
  157. }
  158. /**
  159. * @brief LCD FSMC 模式配置
  160. * @param 无
  161. * @retval 无
  162. */
  163. static void ILI9341_FSMC_Config ( void )
  164. {
  165. FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
  166. FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
  167. /* 使能FSMC时钟*/
  168. RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE );
  169. //地址建立时间(ADDSET)为1个HCLK 2/72M=28ns
  170. readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间
  171. //数据保持时间(DATAST)+ 1个HCLK = 5/72M=70ns
  172. readWriteTiming.FSMC_DataSetupTime = 0x04; //数据建立时间
  173. //选择控制的模式
  174. //模式B,异步NOR FLASH模式,与ILI9341的8080时序匹配
  175. readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_B;
  176. /*以下配置与模式B无关*/
  177. //地址保持时间(ADDHLD)模式A未用到
  178. readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间
  179. //设置总线转换周期,仅用于复用模式的NOR操作
  180. readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  181. //设置时钟分频,仅用于同步类型的存储器
  182. readWriteTiming.FSMC_CLKDivision = 0x00;
  183. //数据保持时间,仅用于同步型的NOR
  184. readWriteTiming.FSMC_DataLatency = 0x00;
  185. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAMx;
  186. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  187. FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
  188. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  189. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  190. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  191. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  192. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  193. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  194. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  195. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  196. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  197. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
  198. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;
  199. FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure );
  200. /* 使能 FSMC_Bank1_NORSRAM4 */
  201. FSMC_NORSRAMCmd ( FSMC_Bank1_NORSRAMx, ENABLE );
  202. }
  203. /**
  204. * @brief 初始化ILI9341寄存器
  205. * @param 无
  206. * @retval 无
  207. */
  208. static void ILI9341_REG_Config ( void )
  209. {
  210. /* Power control B (CFh) */
  211. DEBUG_DELAY ();
  212. ILI9341_Write_Cmd ( 0xCF );
  213. ILI9341_Write_Data ( 0x00 );
  214. ILI9341_Write_Data ( 0x81 );
  215. ILI9341_Write_Data ( 0x30 );
  216. /* Power on sequence control (EDh) */
  217. DEBUG_DELAY ();
  218. ILI9341_Write_Cmd ( 0xED );
  219. ILI9341_Write_Data ( 0x64 );
  220. ILI9341_Write_Data ( 0x03 );
  221. ILI9341_Write_Data ( 0x12 );
  222. ILI9341_Write_Data ( 0x81 );
  223. /* Driver timing control A (E8h) */
  224. DEBUG_DELAY ();
  225. ILI9341_Write_Cmd ( 0xE8 );
  226. ILI9341_Write_Data ( 0x85 );
  227. ILI9341_Write_Data ( 0x10 );
  228. ILI9341_Write_Data ( 0x78 );
  229. /* Power control A (CBh) */
  230. DEBUG_DELAY ();
  231. ILI9341_Write_Cmd ( 0xCB );
  232. ILI9341_Write_Data ( 0x39 );
  233. ILI9341_Write_Data ( 0x2C );
  234. ILI9341_Write_Data ( 0x00 );
  235. ILI9341_Write_Data ( 0x34 );
  236. ILI9341_Write_Data ( 0x02 );
  237. /* Pump ratio control (F7h) */
  238. DEBUG_DELAY ();
  239. ILI9341_Write_Cmd ( 0xF7 );
  240. ILI9341_Write_Data ( 0x20 );
  241. /* Driver timing control B */
  242. DEBUG_DELAY ();
  243. ILI9341_Write_Cmd ( 0xEA );
  244. ILI9341_Write_Data ( 0x00 );
  245. ILI9341_Write_Data ( 0x00 );
  246. /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
  247. DEBUG_DELAY ();
  248. ILI9341_Write_Cmd ( 0xB1 );
  249. ILI9341_Write_Data ( 0x00 );
  250. ILI9341_Write_Data ( 0x1B );
  251. /* Display Function Control (B6h) */
  252. DEBUG_DELAY ();
  253. ILI9341_Write_Cmd ( 0xB6 );
  254. ILI9341_Write_Data ( 0x0A );
  255. ILI9341_Write_Data ( 0xA2 );
  256. /* Power Control 1 (C0h) */
  257. DEBUG_DELAY ();
  258. ILI9341_Write_Cmd ( 0xC0 );
  259. ILI9341_Write_Data ( 0x35 );
  260. /* Power Control 2 (C1h) */
  261. DEBUG_DELAY ();
  262. ILI9341_Write_Cmd ( 0xC1 );
  263. ILI9341_Write_Data ( 0x11 );
  264. /* VCOM Control 1 (C5h) */
  265. ILI9341_Write_Cmd ( 0xC5 );
  266. ILI9341_Write_Data ( 0x45 );
  267. ILI9341_Write_Data ( 0x45 );
  268. /* VCOM Control 2 (C7h) */
  269. ILI9341_Write_Cmd ( 0xC7 );
  270. ILI9341_Write_Data ( 0xA2 );
  271. /* Enable 3G (F2h) */
  272. ILI9341_Write_Cmd ( 0xF2 );
  273. ILI9341_Write_Data ( 0x00 );
  274. /* Gamma Set (26h) */
  275. ILI9341_Write_Cmd ( 0x26 );
  276. ILI9341_Write_Data ( 0x01 );
  277. DEBUG_DELAY ();
  278. /* Positive Gamma Correction */
  279. ILI9341_Write_Cmd ( 0xE0 ); //Set Gamma
  280. ILI9341_Write_Data ( 0x0F );
  281. ILI9341_Write_Data ( 0x26 );
  282. ILI9341_Write_Data ( 0x24 );
  283. ILI9341_Write_Data ( 0x0B );
  284. ILI9341_Write_Data ( 0x0E );
  285. ILI9341_Write_Data ( 0x09 );
  286. ILI9341_Write_Data ( 0x54 );
  287. ILI9341_Write_Data ( 0xA8 );
  288. ILI9341_Write_Data ( 0x46 );
  289. ILI9341_Write_Data ( 0x0C );
  290. ILI9341_Write_Data ( 0x17 );
  291. ILI9341_Write_Data ( 0x09 );
  292. ILI9341_Write_Data ( 0x0F );
  293. ILI9341_Write_Data ( 0x07 );
  294. ILI9341_Write_Data ( 0x00 );
  295. /* Negative Gamma Correction (E1h) */
  296. ILI9341_Write_Cmd ( 0XE1 ); //Set Gamma
  297. ILI9341_Write_Data ( 0x00 );
  298. ILI9341_Write_Data ( 0x19 );
  299. ILI9341_Write_Data ( 0x1B );
  300. ILI9341_Write_Data ( 0x04 );
  301. ILI9341_Write_Data ( 0x10 );
  302. ILI9341_Write_Data ( 0x07 );
  303. ILI9341_Write_Data ( 0x2A );
  304. ILI9341_Write_Data ( 0x47 );
  305. ILI9341_Write_Data ( 0x39 );
  306. ILI9341_Write_Data ( 0x03 );
  307. ILI9341_Write_Data ( 0x06 );
  308. ILI9341_Write_Data ( 0x06 );
  309. ILI9341_Write_Data ( 0x30 );
  310. ILI9341_Write_Data ( 0x38 );
  311. ILI9341_Write_Data ( 0x0F );
  312. /* memory access control set */
  313. DEBUG_DELAY ();
  314. ILI9341_Write_Cmd ( 0x36 );
  315. ILI9341_Write_Data ( 0xC8 ); /*竖屏 左上角到 (起点)到右下角 (终点)扫描方式*/
  316. DEBUG_DELAY ();
  317. /* column address control set */
  318. ILI9341_Write_Cmd ( CMD_SetCoordinateX );
  319. ILI9341_Write_Data ( 0x00 );
  320. ILI9341_Write_Data ( 0x00 );
  321. ILI9341_Write_Data ( 0x00 );
  322. ILI9341_Write_Data ( 0xEF );
  323. /* page address control set */
  324. DEBUG_DELAY ();
  325. ILI9341_Write_Cmd ( CMD_SetCoordinateY );
  326. ILI9341_Write_Data ( 0x00 );
  327. ILI9341_Write_Data ( 0x00 );
  328. ILI9341_Write_Data ( 0x01 );
  329. ILI9341_Write_Data ( 0x3F );
  330. /* Pixel Format Set (3Ah) */
  331. DEBUG_DELAY ();
  332. ILI9341_Write_Cmd ( 0x3a );
  333. ILI9341_Write_Data ( 0x55 );
  334. /* Sleep Out (11h) */
  335. ILI9341_Write_Cmd ( 0x11 );
  336. ILI9341_Delay ( 0xAFFf<<2 );
  337. DEBUG_DELAY ();
  338. /* Display ON (29h) */
  339. ILI9341_Write_Cmd ( 0x29 );
  340. }
  341. /**
  342. * @brief ILI9341初始化函数,如果要用到lcd,一定要调用这个函数
  343. * @param 无
  344. * @retval 无
  345. */
  346. void ILI9341_Init ( void )
  347. {
  348. ILI9341_GPIO_Config ();
  349. ILI9341_FSMC_Config ();
  350. ILI9341_BackLed_Control ( ENABLE ); //点亮LCD背光灯
  351. ILI9341_Rst ();
  352. ILI9341_REG_Config ();
  353. //设置默认扫描方向,其中 6 模式为大部分液晶例程的默认显示方向
  354. ILI9341_GramScan(LCD_SCAN_MODE);
  355. }
  356. /**
  357. * @brief ILI9341背光LED控制
  358. * @param enumState :决定是否使能背光LED
  359. * 该参数为以下值之一:
  360. * @arg ENABLE :使能背光LED
  361. * @arg DISABLE :禁用背光LED
  362. * @retval 无
  363. */
  364. void ILI9341_BackLed_Control ( FunctionalState enumState )
  365. {
  366. if ( enumState )
  367. GPIO_ResetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
  368. else
  369. GPIO_SetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
  370. }
  371. /**
  372. * @brief ILI9341 软件复位
  373. * @param 无
  374. * @retval 无
  375. */
  376. void ILI9341_Rst ( void )
  377. {
  378. GPIO_ResetBits ( ILI9341_RST_PORT, ILI9341_RST_PIN ); //低电平复位
  379. ILI9341_Delay ( 0xAFF );
  380. GPIO_SetBits ( ILI9341_RST_PORT, ILI9341_RST_PIN );
  381. ILI9341_Delay ( 0xAFF );
  382. }
  383. /**
  384. * @brief 设置ILI9341的GRAM的扫描方向
  385. * @param ucOption :选择GRAM的扫描方向
  386. * @arg 0-7 :参数可选值为0-7这八个方向
  387. *
  388. * !!!其中0、3、5、6 模式适合从左至右显示文字,
  389. * 不推荐使用其它模式显示文字 其它模式显示文字会有镜像效果
  390. *
  391. * 其中0、2、4、6 模式的X方向像素为240,Y方向像素为320
  392. * 其中1、3、5、7 模式下X方向像素为320,Y方向像素为240
  393. *
  394. * 其中 6 模式为大部分液晶例程的默认显示方向
  395. * 其中 3 模式为摄像头例程使用的方向
  396. * 其中 0 模式为BMP图片显示例程使用的方向
  397. *
  398. * @retval 无
  399. * @note 坐标图例:A表示向上,V表示向下,<表示向左,>表示向右
  400. X表示X轴,Y表示Y轴
  401. ------------------------------------------------------------
  402. 模式0: . 模式1: . 模式2: . 模式3:
  403. A . A . A . A
  404. | . | . | . |
  405. Y . X . Y . X
  406. 0 . 1 . 2 . 3
  407. <--- X0 o . <----Y1 o . o 2X---> . o 3Y--->
  408. ------------------------------------------------------------
  409. 模式4: . 模式5: . 模式6: . 模式7:
  410. <--- X4 o . <--- Y5 o . o 6X---> . o 7Y--->
  411. 4 . 5 . 6 . 7
  412. Y . X . Y . X
  413. | . | . | . |
  414. V . V . V . V
  415. ---------------------------------------------------------
  416. LCD屏示例
  417. |-----------------|
  418. | 野火Logo |
  419. | |
  420. | |
  421. | |
  422. | |
  423. | |
  424. | |
  425. | |
  426. | |
  427. |-----------------|
  428. 屏幕正面(宽240,高320)
  429. *******************************************************/
  430. void ILI9341_GramScan ( uint8_t ucOption )
  431. {
  432. //参数检查,只可输入0-7
  433. if(ucOption >7 )
  434. return;
  435. //根据模式更新LCD_SCAN_MODE的值,主要用于触摸屏选择计算参数
  436. LCD_SCAN_MODE = ucOption;
  437. //根据模式更新XY方向的像素宽度
  438. if(ucOption%2 == 0)
  439. {
  440. //0 2 4 6模式下X方向像素宽度为240,Y方向为320
  441. LCD_X_LENGTH = ILI9341_LESS_PIXEL;
  442. LCD_Y_LENGTH = ILI9341_MORE_PIXEL;
  443. }
  444. else
  445. {
  446. //1 3 5 7模式下X方向像素宽度为320,Y方向为240
  447. LCD_X_LENGTH = ILI9341_MORE_PIXEL;
  448. LCD_Y_LENGTH = ILI9341_LESS_PIXEL;
  449. }
  450. //0x36命令参数的高3位可用于设置GRAM扫描方向
  451. ILI9341_Write_Cmd ( 0x36 );
  452. ILI9341_Write_Data ( 0x08 |(ucOption<<5));//根据ucOption的值设置LCD参数,共0-7种模式
  453. ILI9341_Write_Cmd ( CMD_SetCoordinateX );
  454. ILI9341_Write_Data ( 0x00 ); /* x 起始坐标高8位 */
  455. ILI9341_Write_Data ( 0x00 ); /* x 起始坐标低8位 */
  456. ILI9341_Write_Data ( ((LCD_X_LENGTH-1)>>8)&0xFF ); /* x 结束坐标高8位 */
  457. ILI9341_Write_Data ( (LCD_X_LENGTH-1)&0xFF ); /* x 结束坐标低8位 */
  458. ILI9341_Write_Cmd ( CMD_SetCoordinateY );
  459. ILI9341_Write_Data ( 0x00 ); /* y 起始坐标高8位 */
  460. ILI9341_Write_Data ( 0x00 ); /* y 起始坐标低8位 */
  461. ILI9341_Write_Data ( ((LCD_Y_LENGTH-1)>>8)&0xFF ); /* y 结束坐标高8位 */
  462. ILI9341_Write_Data ( (LCD_Y_LENGTH-1)&0xFF ); /* y 结束坐标低8位 */
  463. /* write gram start */
  464. ILI9341_Write_Cmd ( CMD_SetPixel );
  465. }
  466. /**
  467. * @brief 在ILI9341显示器上开辟一个窗口
  468. * @param usX :在特定扫描方向下窗口的起点X坐标
  469. * @param usY :在特定扫描方向下窗口的起点Y坐标
  470. * @param usWidth :窗口的宽度
  471. * @param usHeight :窗口的高度
  472. * @retval 无
  473. */
  474. void ILI9341_OpenWindow ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight )
  475. {
  476. ILI9341_Write_Cmd ( CMD_SetCoordinateX ); /* 设置X坐标 */
  477. ILI9341_Write_Data ( usX >> 8 ); /* 先高8位,然后低8位 */
  478. ILI9341_Write_Data ( usX & 0xff ); /* 设置起始点和结束点*/
  479. ILI9341_Write_Data ( ( usX + usWidth - 1 ) >> 8 );
  480. ILI9341_Write_Data ( ( usX + usWidth - 1 ) & 0xff );
  481. ILI9341_Write_Cmd ( CMD_SetCoordinateY ); /* 设置Y坐标*/
  482. ILI9341_Write_Data ( usY >> 8 );
  483. ILI9341_Write_Data ( usY & 0xff );
  484. ILI9341_Write_Data ( ( usY + usHeight - 1 ) >> 8 );
  485. ILI9341_Write_Data ( ( usY + usHeight - 1) & 0xff );
  486. }
  487. /**
  488. * @brief 设定ILI9341的光标坐标
  489. * @param usX :在特定扫描方向下光标的X坐标
  490. * @param usY :在特定扫描方向下光标的Y坐标
  491. * @retval 无
  492. */
  493. static void ILI9341_SetCursor ( uint16_t usX, uint16_t usY )
  494. {
  495. ILI9341_OpenWindow ( usX, usY, 1, 1 );
  496. }
  497. /**
  498. * @brief 在ILI9341显示器上以某一颜色填充像素点
  499. * @param ulAmout_Point :要填充颜色的像素点的总数目
  500. * @param usColor :颜色
  501. * @retval 无
  502. */
  503. static __inline void ILI9341_FillColor ( uint32_t ulAmout_Point, uint16_t usColor )
  504. {
  505. uint32_t i = 0;
  506. /* memory write */
  507. ILI9341_Write_Cmd ( CMD_SetPixel );
  508. for ( i = 0; i < ulAmout_Point; i ++ )
  509. ILI9341_Write_Data ( usColor );
  510. }
  511. /**
  512. * @brief 对ILI9341显示器的某一窗口以某种颜色进行清屏
  513. * @param usX :在特定扫描方向下窗口的起点X坐标
  514. * @param usY :在特定扫描方向下窗口的起点Y坐标
  515. * @param usWidth :窗口的宽度
  516. * @param usHeight :窗口的高度
  517. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  518. * @retval 无
  519. */
  520. void ILI9341_Clear ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight )
  521. {
  522. ILI9341_OpenWindow ( usX, usY, usWidth, usHeight );
  523. ILI9341_FillColor ( usWidth * usHeight, CurrentBackColor );
  524. }
  525. /**
  526. * @brief 对ILI9341显示器的某一点以某种颜色进行填充
  527. * @param usX :在特定扫描方向下该点的X坐标
  528. * @param usY :在特定扫描方向下该点的Y坐标
  529. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  530. * @retval 无
  531. */
  532. void ILI9341_SetPointPixel ( uint16_t usX, uint16_t usY )
  533. {
  534. if ( ( usX < LCD_X_LENGTH ) && ( usY < LCD_Y_LENGTH ) )
  535. {
  536. ILI9341_SetCursor ( usX, usY );
  537. ILI9341_FillColor ( 1, CurrentTextColor );
  538. }
  539. }
  540. /**
  541. * @brief 读取ILI9341 GRAN 的一个像素数据
  542. * @param 无
  543. * @retval 像素数据
  544. */
  545. static uint16_t ILI9341_Read_PixelData ( void )
  546. {
  547. uint16_t usR=0, usG=0, usB=0 ;
  548. ILI9341_Write_Cmd ( 0x2E ); /* 读数据 */
  549. usR = ILI9341_Read_Data (); /*FIRST READ OUT DUMMY DATA*/
  550. usR = ILI9341_Read_Data (); /*READ OUT RED DATA */
  551. usB = ILI9341_Read_Data (); /*READ OUT BLUE DATA*/
  552. usG = ILI9341_Read_Data (); /*READ OUT GREEN DATA*/
  553. return ( ( ( usR >> 11 ) << 11 ) | ( ( usG >> 10 ) << 5 ) | ( usB >> 11 ) );
  554. }
  555. /**
  556. * @brief 获取 ILI9341 显示器上某一个坐标点的像素数据
  557. * @param usX :在特定扫描方向下该点的X坐标
  558. * @param usY :在特定扫描方向下该点的Y坐标
  559. * @retval 像素数据
  560. */
  561. uint16_t ILI9341_GetPointPixel ( uint16_t usX, uint16_t usY )
  562. {
  563. uint16_t usPixelData;
  564. ILI9341_SetCursor ( usX, usY );
  565. usPixelData = ILI9341_Read_PixelData ();
  566. return usPixelData;
  567. }
  568. /**
  569. * @brief 在 ILI9341 显示器上使用 Bresenham 算法画线段
  570. * @param usX1 :在特定扫描方向下线段的一个端点X坐标
  571. * @param usY1 :在特定扫描方向下线段的一个端点Y坐标
  572. * @param usX2 :在特定扫描方向下线段的另一个端点X坐标
  573. * @param usY2 :在特定扫描方向下线段的另一个端点Y坐标
  574. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  575. * @retval 无
  576. */
  577. void ILI9341_DrawLine ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 )
  578. {
  579. uint16_t us;
  580. uint16_t usX_Current, usY_Current;
  581. int32_t lError_X = 0, lError_Y = 0, lDelta_X, lDelta_Y, lDistance;
  582. int32_t lIncrease_X, lIncrease_Y;
  583. lDelta_X = usX2 - usX1; //计算坐标增量
  584. lDelta_Y = usY2 - usY1;
  585. usX_Current = usX1;
  586. usY_Current = usY1;
  587. if ( lDelta_X > 0 )
  588. lIncrease_X = 1; //设置单步方向
  589. else if ( lDelta_X == 0 )
  590. lIncrease_X = 0;//垂直线
  591. else
  592. {
  593. lIncrease_X = -1;
  594. lDelta_X = - lDelta_X;
  595. }
  596. if ( lDelta_Y > 0 )
  597. lIncrease_Y = 1;
  598. else if ( lDelta_Y == 0 )
  599. lIncrease_Y = 0;//水平线
  600. else
  601. {
  602. lIncrease_Y = -1;
  603. lDelta_Y = - lDelta_Y;
  604. }
  605. if ( lDelta_X > lDelta_Y )
  606. lDistance = lDelta_X; //选取基本增量坐标轴
  607. else
  608. lDistance = lDelta_Y;
  609. for ( us = 0; us <= lDistance + 1; us ++ )//画线输出
  610. {
  611. ILI9341_SetPointPixel ( usX_Current, usY_Current );//画点
  612. lError_X += lDelta_X ;
  613. lError_Y += lDelta_Y ;
  614. if ( lError_X > lDistance )
  615. {
  616. lError_X -= lDistance;
  617. usX_Current += lIncrease_X;
  618. }
  619. if ( lError_Y > lDistance )
  620. {
  621. lError_Y -= lDistance;
  622. usY_Current += lIncrease_Y;
  623. }
  624. }
  625. }
  626. /**
  627. * @brief 在 ILI9341 显示器上画一个矩形
  628. * @param usX_Start :在特定扫描方向下矩形的起始点X坐标
  629. * @param usY_Start :在特定扫描方向下矩形的起始点Y坐标
  630. * @param usWidth:矩形的宽度(单位:像素)
  631. * @param usHeight:矩形的高度(单位:像素)
  632. * @param ucFilled :选择是否填充该矩形
  633. * 该参数为以下值之一:
  634. * @arg 0 :空心矩形
  635. * @arg 1 :实心矩形
  636. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  637. * @retval 无
  638. */
  639. void ILI9341_DrawRectangle ( uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight, uint8_t ucFilled )
  640. {
  641. if ( ucFilled )
  642. {
  643. ILI9341_OpenWindow ( usX_Start, usY_Start, usWidth, usHeight );
  644. ILI9341_FillColor ( usWidth * usHeight ,CurrentTextColor);
  645. }
  646. else
  647. {
  648. ILI9341_DrawLine ( usX_Start, usY_Start, usX_Start + usWidth - 1, usY_Start );
  649. ILI9341_DrawLine ( usX_Start, usY_Start + usHeight - 1, usX_Start + usWidth - 1, usY_Start + usHeight - 1 );
  650. ILI9341_DrawLine ( usX_Start, usY_Start, usX_Start, usY_Start + usHeight - 1 );
  651. ILI9341_DrawLine ( usX_Start + usWidth - 1, usY_Start, usX_Start + usWidth - 1, usY_Start + usHeight - 1 );
  652. }
  653. }
  654. /**
  655. * @brief 在 ILI9341 显示器上使用 Bresenham 算法画圆
  656. * @param usX_Center :在特定扫描方向下圆心的X坐标
  657. * @param usY_Center :在特定扫描方向下圆心的Y坐标
  658. * @param usRadius:圆的半径(单位:像素)
  659. * @param ucFilled :选择是否填充该圆
  660. * 该参数为以下值之一:
  661. * @arg 0 :空心圆
  662. * @arg 1 :实心圆
  663. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  664. * @retval 无
  665. */
  666. void ILI9341_DrawCircle ( uint16_t usX_Center, uint16_t usY_Center, uint16_t usRadius, uint8_t ucFilled )
  667. {
  668. int16_t sCurrentX, sCurrentY;
  669. int16_t sError;
  670. sCurrentX = 0; sCurrentY = usRadius;
  671. sError = 3 - ( usRadius << 1 ); //判断下个点位置的标志
  672. while ( sCurrentX <= sCurrentY )
  673. {
  674. int16_t sCountY;
  675. if ( ucFilled )
  676. for ( sCountY = sCurrentX; sCountY <= sCurrentY; sCountY ++ )
  677. {
  678. ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center + sCountY ); //1,研究对象
  679. ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center + sCountY ); //2
  680. ILI9341_SetPointPixel ( usX_Center - sCountY, usY_Center + sCurrentX ); //3
  681. ILI9341_SetPointPixel ( usX_Center - sCountY, usY_Center - sCurrentX ); //4
  682. ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center - sCountY ); //5
  683. ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center - sCountY ); //6
  684. ILI9341_SetPointPixel ( usX_Center + sCountY, usY_Center - sCurrentX ); //7
  685. ILI9341_SetPointPixel ( usX_Center + sCountY, usY_Center + sCurrentX ); //0
  686. }
  687. else
  688. {
  689. ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center + sCurrentY ); //1,研究对象
  690. ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center + sCurrentY ); //2
  691. ILI9341_SetPointPixel ( usX_Center - sCurrentY, usY_Center + sCurrentX ); //3
  692. ILI9341_SetPointPixel ( usX_Center - sCurrentY, usY_Center - sCurrentX ); //4
  693. ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center - sCurrentY ); //5
  694. ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center - sCurrentY ); //6
  695. ILI9341_SetPointPixel ( usX_Center + sCurrentY, usY_Center - sCurrentX ); //7
  696. ILI9341_SetPointPixel ( usX_Center + sCurrentY, usY_Center + sCurrentX ); //0
  697. }
  698. sCurrentX ++;
  699. if ( sError < 0 )
  700. sError += 4 * sCurrentX + 6;
  701. else
  702. {
  703. sError += 10 + 4 * ( sCurrentX - sCurrentY );
  704. sCurrentY --;
  705. }
  706. }
  707. }
  708. /**
  709. * @brief 在 ILI9341 显示器上显示一个英文字符
  710. * @param usX :在特定扫描方向下字符的起始X坐标
  711. * @param usY :在特定扫描方向下该点的起始Y坐标
  712. * @param cChar :要显示的英文字符
  713. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  714. * @retval 无
  715. */
  716. void ILI9341_DispChar_EN ( uint16_t usX, uint16_t usY, const char cChar )
  717. {
  718. uint8_t byteCount, bitCount,fontLength;
  719. uint16_t ucRelativePositon;
  720. uint8_t *Pfont;
  721. //对ascii码表偏移(字模表不包含ASCII表的前32个非图形符号)
  722. ucRelativePositon = cChar - ' ';
  723. //每个字模的字节数
  724. fontLength = (LCD_Currentfonts->Width*LCD_Currentfonts->Height)/8;
  725. //字模首地址
  726. /*ascii码表偏移值乘以每个字模的字节数,求出字模的偏移位置*/
  727. Pfont = (uint8_t *)&LCD_Currentfonts->table[ucRelativePositon * fontLength];
  728. //设置显示窗口
  729. ILI9341_OpenWindow ( usX, usY, LCD_Currentfonts->Width, LCD_Currentfonts->Height);
  730. ILI9341_Write_Cmd ( CMD_SetPixel );
  731. //按字节读取字模数据
  732. //由于前面直接设置了显示窗口,显示数据会自动换行
  733. for ( byteCount = 0; byteCount < fontLength; byteCount++ )
  734. {
  735. //一位一位处理要显示的颜色
  736. for ( bitCount = 0; bitCount < 8; bitCount++ )
  737. {
  738. if ( Pfont[byteCount] & (0x80>>bitCount) )
  739. ILI9341_Write_Data ( CurrentTextColor );
  740. else
  741. ILI9341_Write_Data ( CurrentBackColor );
  742. }
  743. }
  744. }
  745. /**
  746. * @brief 在 ILI9341 显示器上显示英文字符串
  747. * @param line :在特定扫描方向下字符串的起始Y坐标
  748. * 本参数可使用宏LINE(0)、LINE(1)等方式指定文字坐标,
  749. * 宏LINE(x)会根据当前选择的字体来计算Y坐标值。
  750. * 显示中文且使用LINE宏时,需要把英文字体设置成Font8x16
  751. * @param pStr :要显示的英文字符串的首地址
  752. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  753. * @retval 无
  754. */
  755. void ILI9341_DispStringLine_EN ( uint16_t line, char * pStr )
  756. {
  757. uint16_t usX = 0;
  758. while ( * pStr != '\0' )
  759. {
  760. if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) > LCD_X_LENGTH )
  761. {
  762. usX = ILI9341_DispWindow_X_Star;
  763. line += LCD_Currentfonts->Height;
  764. }
  765. if ( ( line - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) > LCD_Y_LENGTH )
  766. {
  767. usX = ILI9341_DispWindow_X_Star;
  768. line = ILI9341_DispWindow_Y_Star;
  769. }
  770. ILI9341_DispChar_EN ( usX, line, * pStr);
  771. pStr ++;
  772. usX += LCD_Currentfonts->Width;
  773. }
  774. }
  775. /**
  776. * @brief 在 ILI9341 显示器上显示英文字符串
  777. * @param usX :在特定扫描方向下字符的起始X坐标
  778. * @param usY :在特定扫描方向下字符的起始Y坐标
  779. * @param pStr :要显示的英文字符串的首地址
  780. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  781. * @retval 无
  782. */
  783. void ILI9341_DispString_EN ( uint16_t usX ,uint16_t usY, char * pStr )
  784. {
  785. while ( * pStr != '\0' )
  786. {
  787. if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) > LCD_X_LENGTH )
  788. {
  789. usX = ILI9341_DispWindow_X_Star;
  790. usY += LCD_Currentfonts->Height;
  791. }
  792. if ( ( usY - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) > LCD_Y_LENGTH )
  793. {
  794. usX = ILI9341_DispWindow_X_Star;
  795. usY = ILI9341_DispWindow_Y_Star;
  796. }
  797. ILI9341_DispChar_EN ( usX, usY, * pStr);
  798. pStr ++;
  799. usX += LCD_Currentfonts->Width;
  800. }
  801. }
  802. /**
  803. * @brief 在 ILI9341 显示器上显示英文字符串(沿Y轴方向)
  804. * @param usX :在特定扫描方向下字符的起始X坐标
  805. * @param usY :在特定扫描方向下字符的起始Y坐标
  806. * @param pStr :要显示的英文字符串的首地址
  807. * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
  808. * @retval 无
  809. */
  810. void ILI9341_DispString_EN_YDir ( uint16_t usX,uint16_t usY , char * pStr )
  811. {
  812. while ( * pStr != '\0' )
  813. {
  814. if ( ( usY - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) >LCD_Y_LENGTH )
  815. {
  816. usY = ILI9341_DispWindow_Y_Star;
  817. usX += LCD_Currentfonts->Width;
  818. }
  819. if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) > LCD_X_LENGTH)
  820. {
  821. usX = ILI9341_DispWindow_X_Star;
  822. usY = ILI9341_DispWindow_Y_Star;
  823. }
  824. ILI9341_DispChar_EN ( usX, usY, * pStr);
  825. pStr ++;
  826. usY += LCD_Currentfonts->Height;
  827. }
  828. }
  829. /**
  830. * @brief 设置英文字体类型
  831. * @param fonts: 指定要选择的字体
  832. * 参数为以下值之一
  833. * @arg:Font24x32;
  834. * @arg:Font16x24;
  835. * @arg:Font8x16;
  836. * @retval None
  837. */
  838. void LCD_SetFont(sFONT *fonts)
  839. {
  840. LCD_Currentfonts = fonts;
  841. }
  842. /**
  843. * @brief 获取当前字体类型
  844. * @param None.
  845. * @retval 返回当前字体类型
  846. */
  847. sFONT *LCD_GetFont(void)
  848. {
  849. return LCD_Currentfonts;
  850. }
  851. /**
  852. * @brief 设置LCD的前景(字体)及背景颜色,RGB565
  853. * @param TextColor: 指定前景(字体)颜色
  854. * @param BackColor: 指定背景颜色
  855. * @retval None
  856. */
  857. void LCD_SetColors(uint16_t TextColor, uint16_t BackColor)
  858. {
  859. CurrentTextColor = TextColor;
  860. CurrentBackColor = BackColor;
  861. }
  862. /**
  863. * @brief 获取LCD的前景(字体)及背景颜色,RGB565
  864. * @param TextColor: 用来存储前景(字体)颜色的指针变量
  865. * @param BackColor: 用来存储背景颜色的指针变量
  866. * @retval None
  867. */
  868. void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor)
  869. {
  870. *TextColor = CurrentTextColor;
  871. *BackColor = CurrentBackColor;
  872. }
  873. /**
  874. * @brief 设置LCD的前景(字体)颜色,RGB565
  875. * @param Color: 指定前景(字体)颜色
  876. * @retval None
  877. */
  878. void LCD_SetTextColor(uint16_t Color)
  879. {
  880. CurrentTextColor = Color;
  881. }
  882. /**
  883. * @brief 设置LCD的背景颜色,RGB565
  884. * @param Color: 指定背景颜色
  885. * @retval None
  886. */
  887. void LCD_SetBackColor(uint16_t Color)
  888. {
  889. CurrentBackColor = Color;
  890. }
  891. /**
  892. * @brief 清除某行文字
  893. * @param Line: 指定要删除的行
  894. * 本参数可使用宏LINE(0)、LINE(1)等方式指定要删除的行,
  895. * 宏LINE(x)会根据当前选择的字体来计算Y坐标值,并删除当前字体高度的第x行。
  896. * @retval None
  897. */
  898. void LCD_ClearLine(uint16_t Line)
  899. {
  900. ILI9341_Clear(0,Line,LCD_X_LENGTH,((sFONT *)LCD_GetFont())->Height); /* 清屏,显示全黑 */
  901. }
  902. /*********************end of file*************************/

main.c

  1. /**
  2. ******************************************************************************
  3. * @file main.c
  4. * @author fire
  5. * @version V1.0
  6. * @date 2013-xx-xx
  7. * @brief LCD显示英文
  8. ******************************************************************************
  9. * @attention
  10. *
  11. * 实验平台:野火 F103-霸道 STM32 开发板
  12. * 论坛 :http://www.firebbs.cn
  13. * 淘宝 :https://fire-stm32.taobao.com
  14. *
  15. ******************************************************************************
  16. */
  17. #include "stm32f10x.h"
  18. #include "./lcd/bsp_ili9341_lcd.h"
  19. #include "./usart/bsp_usart.h"
  20. #include <stdio.h>
  21. static void LCD_Test(void);
  22. static void Delay ( __IO uint32_t nCount );
  23. void Printf_Charater(void) ;
  24. /**
  25. * @brief 主函数
  26. * @param 无
  27. * @retval 无
  28. */
  29. int main ( void )
  30. {
  31. ILI9341_Init (); //LCD 初始化
  32. USART_Config();
  33. printf("\r\n ********** 液晶屏英文显示程序*********** \r\n");
  34. printf("\r\n 本程序不支持中文,显示中文的程序请学习下一章 \r\n");
  35. //其中0、3、5、6 模式适合从左至右显示文字,
  36. //不推荐使用其它模式显示文字 其它模式显示文字会有镜像效果
  37. //其中 6 模式为大部分液晶例程的默认显示方向
  38. ILI9341_GramScan ( 6 );
  39. while ( 1 )
  40. {
  41. LCD_Test();
  42. }
  43. }
  44. /*用于测试各种液晶的函数*/
  45. void LCD_Test(void)
  46. {
  47. /*演示显示变量*/
  48. static uint8_t testCNT = 0;
  49. char dispBuff[100];
  50. testCNT++;
  51. LCD_SetFont(&Font8x16);
  52. LCD_SetColors(RED,BLACK);
  53. ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH); /* 清屏,显示全黑 */
  54. /********显示字符串示例*******/
  55. ILI9341_DispStringLine_EN(LINE(0),"BH 3.2 inch LCD para:");
  56. ILI9341_DispStringLine_EN(LINE(1),"Image resolution:240x320 px");
  57. ILI9341_DispStringLine_EN(LINE(2),"ILI9341 LCD driver");
  58. ILI9341_DispStringLine_EN(LINE(3),"XPT2046 Touch Pad driver");
  59. /********显示变量示例*******/
  60. LCD_SetFont(&Font16x24);
  61. LCD_SetTextColor(GREEN);
  62. /*使用c标准库把变量转化成字符串*/
  63. sprintf(dispBuff,"Count : %d ",testCNT);
  64. LCD_ClearLine(LINE(4)); /* 清除单行文字 */
  65. /*然后显示该字符串即可,其它变量也是这样处理*/
  66. ILI9341_DispStringLine_EN(LINE(4),dispBuff);
  67. /*******显示图形示例******/
  68. LCD_SetFont(&Font24x32);
  69. /* 画直线 */
  70. LCD_ClearLine(LINE(4));/* 清除单行文字 */
  71. LCD_SetTextColor(BLUE);
  72. ILI9341_DispStringLine_EN(LINE(4),"Draw line:");
  73. LCD_SetTextColor(RED);
  74. ILI9341_DrawLine(50,170,210,230);
  75. ILI9341_DrawLine(50,200,210,240);
  76. LCD_SetTextColor(GREEN);
  77. ILI9341_DrawLine(100,170,200,230);
  78. ILI9341_DrawLine(200,200,220,240);
  79. LCD_SetTextColor(BLUE);
  80. ILI9341_DrawLine(110,170,110,230);
  81. ILI9341_DrawLine(130,200,220,240);
  82. Delay(0xFFFFFF);
  83. ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8); /* 清屏,显示全黑 */
  84. /*画矩形*/
  85. LCD_ClearLine(LINE(4)); /* 清除单行文字 */
  86. LCD_SetTextColor(BLUE);
  87. ILI9341_DispStringLine_EN(LINE(4),"Draw Rect:");
  88. LCD_SetTextColor(RED);
  89. ILI9341_DrawRectangle(50,200,100,30,1);
  90. LCD_SetTextColor(GREEN);
  91. ILI9341_DrawRectangle(160,200,20,40,0);
  92. LCD_SetTextColor(BLUE);
  93. ILI9341_DrawRectangle(170,200,50,20,1);
  94. Delay(0xFFFFFF);
  95. ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8); /* 清屏,显示全黑 */
  96. /* 画圆 */
  97. LCD_ClearLine(LINE(4)); /* 清除单行文字 */
  98. LCD_SetTextColor(BLUE);
  99. ILI9341_DispStringLine_EN(LINE(4),"Draw Cir:");
  100. LCD_SetTextColor(RED);
  101. ILI9341_DrawCircle(100,200,20,0);
  102. LCD_SetTextColor(GREEN);
  103. ILI9341_DrawCircle(100,200,10,1);
  104. LCD_SetTextColor(BLUE);
  105. ILI9341_DrawCircle(140,200,20,0);
  106. Delay(0xFFFFFF);
  107. ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8); /* 清屏,显示全黑 */
  108. }
  109. /**
  110. * @brief 简单延时函数
  111. * @param nCount :延时计数值
  112. * @retval 无
  113. */
  114. static void Delay ( __IO uint32_t nCount )
  115. {
  116. for ( ; nCount != 0; nCount -- );
  117. }
  118. /* ------------------------------end of file--------------------------------- */

1-液晶显示.zip

2-液晶坐标方向演示.zip