LCD.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. #include "includes.h"
  2. static u16 susLcdBackColor; //背景颜色
  3. static u16 susLcdForeColor; //画笔颜色
  4. extern const unsigned char g_apucLetter16[];
  5. extern const unsigned char g_apucCLetter16[];
  6. extern const unsigned char g_apucLetter24[];
  7. extern const unsigned char g_apucCLetter24[];
  8. extern const unsigned char g_apucFonts16[];
  9. extern const unsigned char g_apucCFonts16[];
  10. extern const unsigned char g_apucFonts24[];
  11. extern const unsigned char g_apucCFonts24[];
  12. unsigned char showApn=1;
  13. unsigned char LastKeyLight=0;//熄屏首次电量屏幕
  14. unsigned char KeyLightFlag=-1;
  15. /***************************************************************************
  16. *LcdSetColor 设置画笔颜色和背景颜色
  17. ****************************************************************************/
  18. static void LcdPortInit(void)
  19. {
  20. GPIO_InitTypeDef GPIO_InitStructure;
  21. #if(LCD_BUS_TYPE==LCD_BUS_IO)
  22. /* Enable GPIOD and GPIOE clocks */
  23. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
  24. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  26. LCD_CS_HIGH;
  27. LCD_BL_HIGH;
  28. GPIO_InitStructure.GPIO_Pin = (LCD_CS_PIN|LCD_SCK_PIN|LCD_DCX_PIN|LCD_SDA_PIN);
  29. GPIO_Init(GPIOB, &GPIO_InitStructure);
  30. LCD_CS_HIGH;
  31. LCD_SCK_HIGH;
  32. LCD_DCX_HIGH;
  33. LCD_SDA_HIGH;
  34. LCD_RESET_HIGH;
  35. LCD_BL_HIGH;
  36. GPIO_InitStructure.GPIO_Pin = (LCD_RESET_PIN|LCD_BL_PIN);
  37. GPIO_Init(GPIOA, &GPIO_InitStructure);
  38. LCD_RESET_HIGH;
  39. LCD_BL_HIGH;
  40. #elif(LCD_BUS_TYPE==LCD_BUS_SPI)
  41. SPI_InitTypeDef SPI_InitStructure;
  42. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
  43. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  44. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  45. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
  46. GPIO_InitStructure.GPIO_Pin = LCD_DCX_PIN;
  47. GPIO_Init(LCD_DCX_PORT, &GPIO_InitStructure);
  48. LCD_DCX_HIGH;
  49. /* NS */
  50. GPIO_InitStructure.GPIO_Pin = LCD_SPI_NSS_PIN;
  51. GPIO_Init(LCD_SPI_PORT, &GPIO_InitStructure);
  52. /*SCK */
  53. GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;
  54. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  55. GPIO_Init(LCD_SPI_PORT, &GPIO_InitStructure);
  56. /*MOSI */
  57. GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN;
  58. GPIO_Init(LCD_SPI_PORT, &GPIO_InitStructure);
  59. LCD_SPI_NSS_HIGH;
  60. SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;//半双工,只发不读
  61. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  62. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  63. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  64. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  65. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  66. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //2分频
  67. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  68. SPI_InitStructure.SPI_CRCPolynomial = 7;
  69. SPI_Init(LCD_SPI_HANDLE, &SPI_InitStructure);
  70. SPI_Cmd(LCD_SPI_HANDLE, ENABLE);
  71. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  72. GPIO_InitStructure.GPIO_Pin = (LCD_RESET_PIN|LCD_BL_PIN);
  73. GPIO_Init(GPIOA, &GPIO_InitStructure);
  74. LCD_RESET_HIGH;
  75. LCD_BL_HIGH;
  76. #endif
  77. }
  78. #if(LCD_BUS_TYPE==LCD_BUS_IO)
  79. void LcdSendCommand(unsigned char Cmd)
  80. {
  81. unsigned char i,j;
  82. LCD_CS_LOW;
  83. LCD_DCX_LOW;
  84. for(i=0;i<8;i++){
  85. j=0x80>>i;
  86. LCD_SCK_LOW;
  87. if(Cmd&j)LCD_SDA_HIGH;
  88. else LCD_SDA_LOW;
  89. LCD_SCK_HIGH;
  90. }
  91. LCD_CS_HIGH;
  92. }
  93. void LcdSendData(unsigned char Data)
  94. {
  95. unsigned char i,j;
  96. unsigned char ret;
  97. LCD_CS_LOW;
  98. LCD_DCX_HIGH;
  99. for(i=0;i<8;i++){
  100. j=0x80>>i;
  101. LCD_SCK_LOW;
  102. if(Data & j)LCD_SDA_HIGH;
  103. else LCD_SDA_LOW;
  104. LCD_SCK_HIGH;
  105. }
  106. LCD_CS_HIGH;
  107. }
  108. #elif(LCD_BUS_TYPE==LCD_BUS_SPI)
  109. void LCD_SPIx_ReadWriteByte(unsigned char byte)
  110. {
  111. SPI_I2S_SendData(LCD_SPI_HANDLE, byte);
  112. while (SPI_I2S_GetFlagStatus(LCD_SPI_HANDLE, SPI_I2S_FLAG_BSY) == SET);
  113. }
  114. void LcdSendCommand(unsigned char Cmd)
  115. {
  116. LCD_DCX_LOW;
  117. LCD_SPI_NSS_LOW;
  118. LCD_SPIx_ReadWriteByte(Cmd);
  119. LCD_SPI_NSS_HIGH;
  120. }
  121. void LcdSendData(unsigned char Data)
  122. {
  123. LCD_DCX_HIGH;
  124. LCD_SPI_NSS_LOW;
  125. LCD_SPIx_ReadWriteByte(Data);
  126. LCD_SPI_NSS_HIGH;
  127. }
  128. #endif
  129. /***************************************************************************
  130. *LcdSetColor 设置画笔颜色和背景颜色
  131. ****************************************************************************/
  132. void LcdSetColor(u16 BrushColor,u16 BackColor)
  133. {
  134. susLcdForeColor=BrushColor; //画笔颜色
  135. susLcdBackColor=BackColor; //背景颜色
  136. }
  137. void LcdInit(void)
  138. {
  139. LcdPortInit();
  140. LCD_BL_LOW;//用户体验
  141. //reset
  142. LCD_RESET_HIGH;
  143. DelayMs(1);
  144. LCD_RESET_LOW;
  145. DelayMs(1);
  146. LCD_RESET_HIGH;
  147. DelayMs(120);
  148. //-----------------------------------ST7735S Set REG---------------------------------------------//
  149. LcdSendCommand(0x11); //Sleep out
  150. DelayMs(120); //Delay 120ms
  151. //------------------------------------ST7735S Frame Rate-----------------------------------------//
  152. LcdSendCommand(0xB1);
  153. LcdSendData(0x05);
  154. LcdSendData(0x3C);
  155. LcdSendData(0x3C);
  156. LcdSendCommand(0xB2);
  157. LcdSendData(0x05);
  158. LcdSendData(0x3C);
  159. LcdSendData(0x3C);
  160. LcdSendCommand(0xB3);
  161. LcdSendData(0x05);
  162. LcdSendData(0x3C);
  163. LcdSendData(0x3C);
  164. LcdSendData(0x05);
  165. LcdSendData(0x3C);
  166. LcdSendData(0x3C);
  167. //------------------------------------End ST7735S Frame Rate-----------------------------------------//
  168. LcdSendCommand(0xB4); //Dot inversion
  169. LcdSendData(0x03);
  170. //------------------------------------ST7735S Power Sequence-----------------------------------------//
  171. LcdSendCommand(0xC0);
  172. LcdSendData(0x28);
  173. LcdSendData(0x08);
  174. LcdSendData(0x04);
  175. LcdSendCommand(0xC1);
  176. LcdSendData(0XC0);
  177. LcdSendCommand(0xC2);
  178. LcdSendData(0x0D);
  179. LcdSendData(0x00);
  180. LcdSendCommand(0xC3);
  181. LcdSendData(0x8D);
  182. LcdSendData(0x2A);
  183. LcdSendCommand(0xC4);
  184. LcdSendData(0x8D);
  185. LcdSendData(0xEE);
  186. //---------------------------------End ST7735S Power Sequence------------------------000-------------//
  187. LcdSendCommand(0xC5); //VCOM
  188. LcdSendData(0x1A);
  189. LcdSendCommand(0x36); //MX, MY, RGB mode
  190. LcdSendData(0x60);//-----------这个值非常重要,决定了内部显存和显示区域的关系,以及RGB颜色顺序//60
  191. //LcdSendData(0xA0);
  192. //------------------------------------ST7735S Gamma Sequence-----------------------------------------//
  193. LcdSendCommand(0xE0);
  194. LcdSendData(0x04);
  195. LcdSendData(0x22);
  196. LcdSendData(0x07);
  197. LcdSendData(0x0A);
  198. LcdSendData(0x2E);
  199. LcdSendData(0x30);
  200. LcdSendData(0x25);
  201. LcdSendData(0x2A);
  202. LcdSendData(0x28);
  203. LcdSendData(0x26);
  204. LcdSendData(0x2E);
  205. LcdSendData(0x3A);
  206. LcdSendData(0x00);
  207. LcdSendData(0x01);
  208. LcdSendData(0x03);
  209. LcdSendData(0x13);
  210. LcdSendCommand(0xE1);
  211. LcdSendData(0x04);
  212. LcdSendData(0x16);
  213. LcdSendData(0x06);
  214. LcdSendData(0x0D);
  215. LcdSendData(0x2D);
  216. LcdSendData(0x26);
  217. LcdSendData(0x23);
  218. LcdSendData(0x27);
  219. LcdSendData(0x27);
  220. LcdSendData(0x25);
  221. LcdSendData(0x2D);
  222. LcdSendData(0x3B);
  223. LcdSendData(0x00);
  224. LcdSendData(0x01);
  225. LcdSendData(0x04);
  226. LcdSendData(0x13);
  227. //------------------------------------End ST7735S Gamma Sequence-----------------------------------------//
  228. LcdSendCommand(0x3A); //65k mode
  229. LcdSendData(0x05);
  230. LcdSendCommand(0x29); //Display on
  231. //设置前景色和背景色
  232. LcdSetColor(0x0000,0xffff);
  233. //清屏
  234. LcdClrAll();
  235. LCD_BL_HIGH;
  236. }
  237. void LCDBackLight(char Ct)
  238. {
  239. LastKeyLight=KeyLightFlag;
  240. if(Ct==0){
  241. KeyLightFlag=Ct;
  242. LCD_BL_LOW;
  243. LcdSendCommand(0x28);
  244. if(GPS_TimeTable[newPara.gpsTimeIndex]>=30||GPS_TimeTable[newPara.gpsTimeIndex]==0)QueryTime=60;
  245. else QueryTime=GPS_TimeTable[newPara.gpsTimeIndex]*2;
  246. }else{
  247. QueryTime=10;
  248. KeyLightFlag=Ct;
  249. LCD_BL_HIGH;
  250. LcdSendCommand(0x29);
  251. }
  252. }
  253. /**********************************************************************************************
  254. 设置一个写地址区域
  255. ************************************************************************************************/
  256. void LcdBlockWrite(u16 x1,u16 y1,u16 x2,u16 y2)
  257. {
  258. u16 Xstart,Xend,Ystart,Yend;
  259. #if(LCD_TYPE==0)
  260. //旧屏
  261. Xstart=x1+1;
  262. Xend=x2+1;
  263. Ystart=y1+2;
  264. Yend=y2+2;
  265. #else
  266. //新屏
  267. Xstart=x1;
  268. Xend=x2;
  269. Ystart=y1;
  270. Yend=y2;
  271. #endif
  272. LcdSendCommand(0x2a);
  273. LcdSendData(Xstart>>8);
  274. LcdSendData(Xstart&0xff);
  275. LcdSendData(Xend>>8);
  276. LcdSendData(Xend&0xff);
  277. LcdSendCommand(0x2b);
  278. LcdSendData(Ystart>>8);
  279. LcdSendData(Ystart&0xff);
  280. LcdSendData(Yend>>8);
  281. LcdSendData(Yend&0xff);
  282. LcdSendCommand(0x2c);
  283. }
  284. void LcdClrAll(void)
  285. {
  286. int i,j;
  287. unsigned char colorH,colorL;
  288. colorH=susLcdBackColor>>8;
  289. colorL=susLcdBackColor&0xff;
  290. LcdBlockWrite(0,0,159,127);
  291. for(i=0;i<LCD_HEIGHT;i++)
  292. {
  293. for(j=0;j<LCD_WIDTH;j++)
  294. {
  295. LcdSendData(colorH);
  296. LcdSendData(colorL);
  297. }
  298. }
  299. }