]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley/LCD/lcd.c
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / CORTEX_STM32F107_GCC_Rowley / LCD / lcd.c
1 /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************\r
2 * File Name          : lcd.c\r
3 * Author             : MCD Application Team\r
4 * Version            : VX.Y.Z\r
5 * Date               : mm/dd/yyyy\r
6 * Description        : This file includes the LCD driver for AM-240320L8TNQW00H\r
7 *                      (LCD_ILI9320) Liquid Crystal Display Module of STM3210D-EVAL\r
8 *                      board.\r
9 ********************************************************************************\r
10 * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
11 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.\r
12 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,\r
13 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE\r
14 * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING\r
15 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
16 *******************************************************************************/\r
17 \r
18 /* Includes ------------------------------------------------------------------*/\r
19 #include "FreeRTOS.h"\r
20 #include "task.h"\r
21 \r
22 #include    <stdio.h>\r
23 #include    <string.h>\r
24 #include    <ctype.h>\r
25 #include    <stdlib.h>\r
26 #include    <stdarg.h>\r
27 \r
28 #include    <stm32f10x_conf.h>\r
29 #include    <stm32f10x_lib.h>\r
30 \r
31 #include    "STM3210D_lcd.h"\r
32 #include        "fonts.h"\r
33 \r
34 extern void timerDly(unsigned int);\r
35 \r
36 /* Private typedef -----------------------------------------------------------*/\r
37 /* Private define ------------------------------------------------------------*/\r
38 #define START_BYTE      0x70\r
39 #define SET_INDEX       0x00\r
40 #define READ_STATUS     0x01\r
41 #define LCD_WRITE_REG   0x02\r
42 #define LCD_READ_REG    0x03\r
43 \r
44 /* Private macro -------------------------------------------------------------*/\r
45 /* Private variables ---------------------------------------------------------*/\r
46   /* Global variables to set the written text color */\r
47 static  vu16 TextColor = 0x0000, BackColor = 0xFFFF;\r
48 \r
49 /* Private function prototypes -----------------------------------------------*/\r
50 /* Private functions ---------------------------------------------------------*/\r
51 \r
52 #define timerDly( x )   vTaskDelay( ( x * 10 ) / portTICK_RATE_MS );\r
53 #define vBlockToWait( x )\r
54 \r
55 /*******************************************************************************\r
56 * Function Name  : LCD_Setup\r
57 * Description    : Setups the LCD.\r
58 * Input          : None\r
59 * Output         : None\r
60 * Return         : None\r
61 *******************************************************************************/\r
62 void LCD_Setup(void)\r
63 {\r
64 /* Configure the LCD Control pins --------------------------------------------*/\r
65   LCD_CtrlLinesConfig();\r
66 \r
67 /* Configure the SPI3 interface ----------------------------------------------*/\r
68   LCD_SPIConfig();\r
69 \r
70   timerDly(5); /* Delay 50 ms */\r
71   /* Start Initial Sequence ------------------------------------------------*/\r
72   LCD_WriteReg(R229, 0x8000); /* Set the internal vcore voltage */\r
73   LCD_WriteReg(R0,  0x0001); /* Start internal OSC. */\r
74   LCD_WriteReg(R1,  0x0100); /* set SS and SM bit */\r
75   LCD_WriteReg(R2,  0x0700); /* set 1 line inversion */\r
76   LCD_WriteReg(R3,  0x1030); /* set GRAM write direction and BGR=1. */\r
77   LCD_WriteReg(R4,  0x0000); /* Resize register */\r
78   LCD_WriteReg(R8,  0x0202); /* set the back porch and front porch */\r
79   LCD_WriteReg(R9,  0x0000); /* set non-display area refresh cycle ISC[3:0] */\r
80   LCD_WriteReg(R10, 0x0000); /* FMARK function */\r
81   LCD_WriteReg(R12, 0x0000); /* RGB interface setting */\r
82   LCD_WriteReg(R13, 0x0000); /* Frame marker Position */\r
83   LCD_WriteReg(R15, 0x0000); /* RGB interface polarity */\r
84 \r
85   /* Power On sequence -----------------------------------------------------*/\r
86   LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */\r
87   LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */\r
88   LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */\r
89   LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */\r
90   timerDly(20);                 /* Dis-charge capacitor power voltage (200ms) */\r
91   LCD_WriteReg(R16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */\r
92   LCD_WriteReg(R17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */\r
93   timerDly(5);                  /* Delay 50 ms */\r
94   LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */\r
95   timerDly(5);                  /* Delay 50 ms */\r
96   LCD_WriteReg(R19, 0x1d00); /* VDV[4:0] for VCOM amplitude */\r
97   LCD_WriteReg(R41, 0x0013); /* VCM[4:0] for VCOMH */\r
98   timerDly(5);                  /* Delay 50 ms */\r
99   LCD_WriteReg(R32, 0x0000); /* GRAM horizontal Address */\r
100   LCD_WriteReg(R33, 0x0000); /* GRAM Vertical Address */\r
101 \r
102   /* Adjust the Gamma Curve ------------------------------------------------*/\r
103   LCD_WriteReg(R48, 0x0006);\r
104   LCD_WriteReg(R49, 0x0101);\r
105   LCD_WriteReg(R50, 0x0003);\r
106   LCD_WriteReg(R53, 0x0106);\r
107   LCD_WriteReg(R54, 0x0b02);\r
108   LCD_WriteReg(R55, 0x0302);\r
109   LCD_WriteReg(R56, 0x0707);\r
110   LCD_WriteReg(R57, 0x0007);\r
111   LCD_WriteReg(R60, 0x0600);\r
112   LCD_WriteReg(R61, 0x020b);\r
113 \r
114   /* Set GRAM area ---------------------------------------------------------*/\r
115   LCD_WriteReg(R80, 0x0000); /* Horizontal GRAM Start Address */\r
116   LCD_WriteReg(R81, 0x00EF); /* Horizontal GRAM End Address */\r
117   LCD_WriteReg(R82, 0x0000); /* Vertical GRAM Start Address */\r
118   LCD_WriteReg(R83, 0x013F); /* Vertical GRAM End Address */\r
119 \r
120   LCD_WriteReg(R96,  0x2700); /* Gate Scan Line */\r
121   LCD_WriteReg(R97,  0x0001); /* NDL,VLE, REV */\r
122   LCD_WriteReg(R106, 0x0000); /* set scrolling line */\r
123 \r
124   /* Partial Display Control -----------------------------------------------*/\r
125   LCD_WriteReg(R128, 0x0000);\r
126   LCD_WriteReg(R129, 0x0000);\r
127   LCD_WriteReg(R130, 0x0000);\r
128   LCD_WriteReg(R131, 0x0000);\r
129   LCD_WriteReg(R132, 0x0000);\r
130   LCD_WriteReg(R133, 0x0000);\r
131 \r
132   /* Panel Control ---------------------------------------------------------*/\r
133   LCD_WriteReg(R144, 0x0010);\r
134   LCD_WriteReg(R146, 0x0000);\r
135   LCD_WriteReg(R147, 0x0003);\r
136   LCD_WriteReg(R149, 0x0110);\r
137   LCD_WriteReg(R151, 0x0000);\r
138   LCD_WriteReg(R152, 0x0000);\r
139 \r
140   /* Set GRAM write direction and BGR = 1 */\r
141   /* I/D=01 (Horizontal : increment, Vertical : decrement) */\r
142   /* AM=1 (address is updated in vertical writing direction) */\r
143   LCD_WriteReg(R3, 0x1018);\r
144 \r
145   LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */\r
146 }\r
147 \r
148 /*******************************************************************************\r
149 * Function Name  : STM3210D_LCD_Init\r
150 * Description    : Initializes the LCD.\r
151 * Input          : None\r
152 * Output         : None\r
153 * Return         : None\r
154 *******************************************************************************/\r
155 void STM3210D_LCD_Init(void)\r
156 {\r
157   /* Setups the LCD */\r
158   LCD_Setup();\r
159 }\r
160 \r
161 /*******************************************************************************\r
162 * Function Name  : LCD_SetTextColor\r
163 * Description    : Sets the Text color.\r
164 * Input          : - Color: specifies the Text color code RGB(5-6-5).\r
165 * Output         : - TextColor: Text color global variable used by LCD_DrawChar\r
166 *                  and LCD_DrawPicture functions.\r
167 * Return         : None\r
168 *******************************************************************************/\r
169 void LCD_SetTextColor(vu16 Color)\r
170 {\r
171   TextColor = Color;\r
172 }\r
173 \r
174 /*******************************************************************************\r
175 * Function Name  : LCD_SetBackColor\r
176 * Description    : Sets the Background color.\r
177 * Input          : - Color: specifies the Background color code RGB(5-6-5).\r
178 * Output         : - BackColor: Background color global variable used by\r
179 *                  LCD_DrawChar and LCD_DrawPicture functions.\r
180 * Return         : None\r
181 *******************************************************************************/\r
182 void LCD_SetBackColor(vu16 Color)\r
183 {\r
184   BackColor = Color;\r
185 }\r
186 \r
187 /*******************************************************************************\r
188 * Function Name  : LCD_ClearLine\r
189 * Description    : Clears the selected line.\r
190 * Input          : - Line: the Line to be cleared.\r
191 *                    This parameter can be one of the following values:\r
192 *                       - Linex: where x can be 0..9\r
193 * Output         : None\r
194 * Return         : None\r
195 *******************************************************************************/\r
196 void LCD_ClearLine(u8 Line)\r
197 {\r
198   LCD_DisplayStringLine(Line, ( unsigned char * ) "                    ");\r
199 }\r
200 \r
201 /*******************************************************************************\r
202 * Function Name  : LCD_Clear\r
203 * Description    : Clears the hole LCD.\r
204 * Input          : Color: the color of the background.\r
205 * Output         : None\r
206 * Return         : None\r
207 *******************************************************************************/\r
208 void LCD_Clear(u16 Color)\r
209 {\r
210   vu32 index = 0;\r
211 \r
212   LCD_SetCursor(0x00, 0x013F);\r
213 \r
214   LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */\r
215 \r
216   for(index = 0; index < 76800; index++)\r
217   {\r
218     LCD_WriteRAM(Color);\r
219   }\r
220 \r
221   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
222 \r
223 }\r
224 \r
225 /*******************************************************************************\r
226 * Function Name  : LCD_SetCursor\r
227 * Description    : Sets the cursor position.\r
228 * Input          : - Xpos: specifies the X position.\r
229 *                  - Ypos: specifies the Y position.\r
230 * Output         : None\r
231 * Return         : None\r
232 *******************************************************************************/\r
233 void LCD_SetCursor(u8 Xpos, u16 Ypos)\r
234 {\r
235  LCD_WriteReg(R32, Xpos);\r
236  LCD_WriteReg(R33, Ypos);\r
237 }\r
238 \r
239 /*******************************************************************************\r
240 * Function Name  : LCD_DrawChar\r
241 * Description    : Draws a character on LCD.\r
242 * Input          : - Xpos: the Line where to display the character shape.\r
243 *                    This parameter can be one of the following values:\r
244 *                       - Linex: where x can be 0..9\r
245 *                  - Ypos: start column address.\r
246 *                  - c: pointer to the character data.\r
247 * Output         : None\r
248 * Return         : None\r
249 *******************************************************************************/\r
250 void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c)\r
251 {\r
252   vu32 index = 0, i = 0;\r
253   vu8 Xaddress = 0;\r
254 \r
255   Xaddress = Xpos;\r
256 \r
257   LCD_SetCursor(Xaddress, Ypos);\r
258 \r
259   for(index = 0; index < 24; index++)\r
260   {\r
261     LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */\r
262 \r
263     for(i = 0; i < 16; i++)\r
264     {\r
265       if((c[index] & (1 << i)) == 0x00)\r
266       {\r
267         LCD_WriteRAM(BackColor);\r
268       }\r
269       else\r
270       {\r
271         LCD_WriteRAM(TextColor);\r
272       }\r
273     }\r
274     LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
275     Xaddress++;\r
276     LCD_SetCursor(Xaddress, Ypos);\r
277   }\r
278 }\r
279 \r
280 /*******************************************************************************\r
281 * Function Name  : LCD_DisplayChar\r
282 * Description    : Displays one character (16dots width, 24dots height).\r
283 * Input          : - Line: the Line where to display the character shape .\r
284 *                    This parameter can be one of the following values:\r
285 *                       - Linex: where x can be 0..9\r
286 *                  - Column: start column address.\r
287 *                  - Ascii: character ascii code, must be between 0x20 and 0x7E.\r
288 * Output         : None\r
289 * Return         : None\r
290 *******************************************************************************/\r
291 void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii)\r
292 {\r
293   Ascii -= 32;\r
294   LCD_DrawChar(Line, Column, &ASCII_Table[Ascii * 24]);\r
295 }\r
296 \r
297 /*******************************************************************************\r
298 * Function Name  : LCD_DisplayStringLine\r
299 * Description    : Displays a maximum of 20 char on the LCD.\r
300 * Input          : - Line: the Line where to display the character shape .\r
301 *                    This parameter can be one of the following values:\r
302 *                       - Linex: where x can be 0..9\r
303 *                  - *ptr: pointer to string to display on LCD.\r
304 * Output         : None\r
305 * Return         : None\r
306 *******************************************************************************/\r
307 void LCD_DisplayStringLine(u8 Line, u8 *ptr)\r
308 {\r
309   vu32 i = 0;\r
310   vu16 refcolumn = 319;\r
311 \r
312   /* Send the string character by character on lCD */\r
313   while ((*ptr != 0) & (i < 20))\r
314   {\r
315     /* Display one character on LCD */\r
316     LCD_DisplayChar(Line, refcolumn, *ptr);\r
317     /* Decrement the column position by 16 */\r
318     refcolumn -= 16;\r
319     /* Point on the next character */\r
320     ptr++;\r
321     /* Increment the character counter */\r
322     i++;\r
323   }\r
324 }\r
325 \r
326 /*******************************************************************************\r
327 * Function Name  : LCD_SetDisplayWindow\r
328 * Description    : Sets a display window\r
329 * Input          : - Xpos: specifies the X buttom left position.\r
330 *                  - Ypos: specifies the Y buttom left position.\r
331 *                  - Height: display window height.\r
332 *                  - Width: display window width.\r
333 * Output         : None\r
334 * Return         : None\r
335 *******************************************************************************/\r
336 void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width)\r
337 {\r
338   /* Horizontal GRAM Start Address */\r
339   if(Xpos >= Height)\r
340   {\r
341     LCD_WriteReg(R80, (Xpos - Height + 1));\r
342   }\r
343   else\r
344   {\r
345     LCD_WriteReg(R80, 0);\r
346   }\r
347   /* Horizontal GRAM End Address */\r
348   LCD_WriteReg(R81, Xpos);\r
349   /* Vertical GRAM Start Address */\r
350   if(Ypos >= Width)\r
351   {\r
352     LCD_WriteReg(R82, (Ypos - Width + 1));\r
353   }\r
354   else\r
355   {\r
356     LCD_WriteReg(R82, 0);\r
357   }\r
358   /* Vertical GRAM End Address */\r
359   LCD_WriteReg(R83, Ypos);\r
360   LCD_SetCursor(Xpos, Ypos);\r
361 }\r
362 \r
363 /*******************************************************************************\r
364 * Function Name  : LCD_WindowModeDisable\r
365 * Description    : Disables LCD Window mode.\r
366 * Input          : None\r
367 * Output         : None\r
368 * Return         : None\r
369 *******************************************************************************/\r
370 void LCD_WindowModeDisable(void)\r
371 {\r
372   LCD_SetDisplayWindow(239, 0x13F, 240, 320);\r
373   LCD_WriteReg(R3, 0x1018);\r
374 }\r
375 /*******************************************************************************\r
376 * Function Name  : LCD_DrawLine\r
377 * Description    : Displays a line.\r
378 * Input          : - Xpos: specifies the X position.\r
379 *                  - Ypos: specifies the Y position.\r
380 *                  - Length: line length.\r
381 *                  - Direction: line direction.\r
382 *                    This parameter can be one of the following values: Vertical\r
383 *                    or Horizontal.\r
384 * Output         : None\r
385 * Return         : None\r
386 *******************************************************************************/\r
387 void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction)\r
388 {\r
389   u32 i = 0;\r
390 \r
391   LCD_SetCursor(Xpos, Ypos);\r
392 \r
393   if(Direction == Horizontal)\r
394   {\r
395     LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */\r
396 \r
397     for(i = 0; i < Length; i++)\r
398     {\r
399       LCD_WriteRAM(TextColor);\r
400     }\r
401     LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
402   }\r
403   else\r
404   {\r
405     for(i = 0; i < Length; i++)\r
406     {\r
407       LCD_WriteRAMWord(TextColor);\r
408       Xpos++;\r
409       LCD_SetCursor(Xpos, Ypos);\r
410     }\r
411   }\r
412 }\r
413 \r
414 /*******************************************************************************\r
415 * Function Name  : LCD_DrawRect\r
416 * Description    : Displays a rectangle.\r
417 * Input          : - Xpos: specifies the X position.\r
418 *                  - Ypos: specifies the Y position.\r
419 *                  - Height: display rectangle height.\r
420 *                  - Width: display rectangle width.\r
421 * Output         : None\r
422 * Return         : None\r
423 *******************************************************************************/\r
424 void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width)\r
425 {\r
426   LCD_DrawLine(Xpos, Ypos, Width, Horizontal);\r
427   LCD_DrawLine((Xpos + Height), Ypos, Width, Horizontal);\r
428 \r
429   LCD_DrawLine(Xpos, Ypos, Height, Vertical);\r
430   LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, Vertical);\r
431 }\r
432 \r
433 /*******************************************************************************\r
434 * Function Name  : LCD_DrawCircle\r
435 * Description    : Displays a circle.\r
436 * Input          : - Xpos: specifies the X position.\r
437 *                  - Ypos: specifies the Y position.\r
438 *                  - Height: display rectangle height.\r
439 *                  - Width: display rectangle width.\r
440 * Output         : None\r
441 * Return         : None\r
442 *******************************************************************************/\r
443 void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius)\r
444 {\r
445   s32  D;/* Decision Variable */\r
446   u32  CurX;/* Current X Value */\r
447   u32  CurY;/* Current Y Value */\r
448 \r
449   D = 3 - (Radius << 1);\r
450   CurX = 0;\r
451   CurY = Radius;\r
452 \r
453   while (CurX <= CurY)\r
454   {\r
455     LCD_SetCursor(Xpos + CurX, Ypos + CurY);\r
456     LCD_WriteRAMWord(TextColor);\r
457 \r
458     LCD_SetCursor(Xpos + CurX, Ypos - CurY);\r
459     LCD_WriteRAMWord(TextColor);\r
460 \r
461     LCD_SetCursor(Xpos - CurX, Ypos + CurY);\r
462     LCD_WriteRAMWord(TextColor);\r
463 \r
464     LCD_SetCursor(Xpos - CurX, Ypos - CurY);\r
465     LCD_WriteRAMWord(TextColor);\r
466 \r
467     LCD_SetCursor(Xpos + CurY, Ypos + CurX);\r
468     LCD_WriteRAMWord(TextColor);\r
469 \r
470     LCD_SetCursor(Xpos + CurY, Ypos - CurX);\r
471     LCD_WriteRAMWord(TextColor);\r
472 \r
473     LCD_SetCursor(Xpos - CurY, Ypos + CurX);\r
474     LCD_WriteRAMWord(TextColor);\r
475 \r
476     LCD_SetCursor(Xpos - CurY, Ypos - CurX);\r
477     LCD_WriteRAMWord(TextColor);\r
478 \r
479     if (D < 0)\r
480     {\r
481       D += (CurX << 2) + 6;\r
482     }\r
483     else\r
484     {\r
485       D += ((CurX - CurY) << 2) + 10;\r
486       CurY--;\r
487     }\r
488     CurX++;\r
489   }\r
490 }\r
491 \r
492 /*******************************************************************************\r
493 * Function Name  : LCD_DrawMonoPict\r
494 * Description    : Displays a monocolor picture.\r
495 * Input          : - Pict: pointer to the picture array.\r
496 * Output         : None\r
497 * Return         : None\r
498 *******************************************************************************/\r
499 void LCD_DrawMonoPict(uc32 *Pict)\r
500 {\r
501   u32 index = 0, i = 0;\r
502 \r
503   LCD_SetCursor(0, 319);\r
504   LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */\r
505 \r
506   for(index = 0; index < 2400; index++)\r
507   {\r
508     for(i = 0; i < 32; i++)\r
509     {\r
510       if((Pict[index] & (1 << i)) == 0x00)\r
511       {\r
512         LCD_WriteRAM(BackColor);\r
513       }\r
514       else\r
515       {\r
516         LCD_WriteRAM(TextColor);\r
517       }\r
518     }\r
519   }\r
520   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
521 \r
522 }\r
523 \r
524 ///*******************************************************************************\r
525 //* Function Name  : LCD_DrawBMP\r
526 //* Description    : Displays a bitmap picture loaded in the SPI Flash.\r
527 //* Input          : - BmpAddress: Bmp picture address in the SPI Flash.\r
528 //* Output         : None\r
529 //* Return         : None\r
530 //*******************************************************************************/\r
531 //void LCD_DrawBMP(u32 BmpAddress)\r
532 //{\r
533 //  u32 i = 0, size = 0;\r
534 //\r
535 //  /* Read bitmap size */\r
536 //  SPI_FLASH_BufferRead((u8*)&size, BmpAddress + 2, 4);\r
537 //\r
538 //  /* get bitmap data address offset */\r
539 //  SPI_FLASH_BufferRead((u8*)&i, BmpAddress + 10, 4);\r
540 //\r
541 //  size = (size - i)/2;\r
542 //\r
543 //  SPI_FLASH_StartReadSequence(BmpAddress + i);\r
544 //\r
545 //  /* Disable SPI1  */\r
546 //  SPI_Cmd(SPI1, DISABLE);\r
547 //  /* SPI in 16-bit mode */\r
548 //  SPI_DataSizeConfig(SPI1, SPI_DataSize_16b);\r
549 //\r
550 //  /* Enable SPI1  */\r
551 //  SPI_Cmd(SPI1, ENABLE);\r
552 //\r
553 //  /* Set GRAM write direction and BGR = 1 */\r
554 //  /* I/D=00 (Horizontal : decrement, Vertical : decrement) */\r
555 //  /* AM=1 (address is updated in vertical writing direction) */\r
556 //  LCD_WriteReg(R3, 0x1008);\r
557 //\r
558 //  LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */\r
559 //\r
560 //  /* Read bitmap data from SPI Flash and send them to LCD */\r
561 //  for(i = 0; i < size; i++)\r
562 //  {\r
563 //    LCD_WriteRAM(__REV_HalfWord(SPI_FLASH_SendHalfWord(0xA5A5)));\r
564 //  }\r
565 //\r
566 //  LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
567 //\r
568 //  /* Deselect the FLASH: Chip Select high */\r
569 //  SPI_FLASH_CS_HIGH();\r
570 //\r
571 //  /* Disable SPI1  */\r
572 //  SPI_Cmd(SPI1, DISABLE);\r
573 //  /* SPI in 8-bit mode */\r
574 //  SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);\r
575 //\r
576 //  /* Enable SPI1  */\r
577 //  SPI_Cmd(SPI1, ENABLE);\r
578 //\r
579 //  /* Set GRAM write direction and BGR = 1 */\r
580 //  /* I/D = 01 (Horizontal : increment, Vertical : decrement) */\r
581 //  /* AM = 1 (address is updated in vertical writing direction) */\r
582 //  LCD_WriteReg(R3, 0x1018);\r
583 //}\r
584 \r
585 /*******************************************************************************\r
586 * Function Name  : LCD_DrawBMP\r
587 * Description    : Displays a bitmap picture loaded in the SPI Flash.\r
588 * Input          : - BmpAddress: Bmp picture address in the SPI Flash.\r
589 * Output         : None\r
590 * Return         : None\r
591 *******************************************************************************/\r
592 void LCD_DrawBMP(uc16 *BmpAddress)\r
593 {\r
594   u32 i = 0, size = 0;\r
595 \r
596   /* Read bitmap size */\r
597   size = BmpAddress[1] | (BmpAddress[2] << 16);\r
598 \r
599   /* get bitmap data address offset */\r
600   i = BmpAddress[5] | (BmpAddress[6] << 16);\r
601 \r
602   size = (size - i)/2;\r
603 \r
604   BmpAddress += i/2;\r
605   /* Set GRAM write direction and BGR = 1 */\r
606   /* I/D=00 (Horizontal : decrement, Vertical : decrement) */\r
607   /* AM=1 (address is updated in vertical writing direction) */\r
608   LCD_WriteReg(R3, 0x1008);\r
609 \r
610   LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */\r
611 \r
612   /* Read bitmap data from SPI Flash and send them to LCD */\r
613   for(i = 0; i < size; i++)\r
614   {\r
615     LCD_WriteRAM(BmpAddress[i]);\r
616   }\r
617 \r
618   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
619 \r
620   /* Set GRAM write direction and BGR = 1 */\r
621   /* I/D = 01 (Horizontal : increment, Vertical : decrement) */\r
622   /* AM = 1 (address is updated in vertical writing direction) */\r
623   LCD_WriteReg(R3, 0x1018);\r
624 }\r
625 \r
626 /*******************************************************************************\r
627 * Function Name  : LCD_nCS_StartByte\r
628 * Description    : Reset LCD control line(/CS) and Send Start-Byte\r
629 * Input          : - Start_Byte: the Start-Byte to be sent\r
630 * Output         : None\r
631 * Return         : None\r
632 *******************************************************************************/\r
633 void LCD_nCS_StartByte(u8 Start_Byte)\r
634 {\r
635   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_RESET);\r
636 \r
637   SPI_I2S_SendData(SPI3, Start_Byte);\r
638   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
639   {\r
640         vBlockToWait( 1 );\r
641   }\r
642 }\r
643 \r
644 /*******************************************************************************\r
645 * Function Name  : LCD_WriteRegIndex\r
646 * Description    : Writes index to select the LCD register.\r
647 * Input          : - LCD_Reg: address of the selected register.\r
648 * Output         : None\r
649 * Return         : None\r
650 *******************************************************************************/\r
651 void LCD_WriteRegIndex(u8 LCD_Reg)\r
652 {\r
653   /* Reset LCD control line(/CS) and Send Start-Byte */\r
654   LCD_nCS_StartByte(START_BYTE | SET_INDEX);\r
655 \r
656   /* Write 16-bit Reg Index (High Byte is 0) */\r
657   SPI_I2S_SendData(SPI3, 0x00);\r
658   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
659   {\r
660         vBlockToWait( 1 );\r
661   }\r
662   SPI_I2S_SendData(SPI3, LCD_Reg);\r
663   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
664   {\r
665         vBlockToWait( 1 );\r
666   }\r
667 \r
668   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
669 }\r
670 \r
671 /*******************************************************************************\r
672 * Function Name  : LCD_ReadReg\r
673 * Description    : Reads the selected LCD Register.\r
674 * Input          : None\r
675 * Output         : None\r
676 * Return         : LCD Register Value.\r
677 *******************************************************************************/\r
678 u16 LCD_ReadReg(u8 LCD_Reg)\r
679 {\r
680   vu16 tmp = 0;\r
681   vu8 i = 0;\r
682 \r
683   /* SPI3 prescaler: 4 */\r
684   SPI3->CR1 &= 0xFFC7;\r
685   SPI3->CR1 |= 0x0008;\r
686 \r
687   /* Write 16-bit Index (then Read Reg) */\r
688   LCD_WriteRegIndex(LCD_Reg);\r
689 \r
690   /* Read 16-bit Reg */\r
691   /* Reset LCD control line(/CS) and Send Start-Byte */\r
692   LCD_nCS_StartByte(START_BYTE | LCD_READ_REG);\r
693 \r
694   for(i = 0; i < 5; i++)\r
695   {\r
696     SPI_I2S_SendData(SPI3, 0xFF);\r
697 \r
698     while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
699     {\r
700                 vBlockToWait( 1 );\r
701     }\r
702     /* One byte of invalid dummy data read after the start byte */\r
703     while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)\r
704     {\r
705                 vBlockToWait( 1 );\r
706     }\r
707     SPI_I2S_ReceiveData(SPI3);\r
708   }\r
709 \r
710   SPI_I2S_SendData(SPI3, 0xFF);\r
711   /* Read upper byte */\r
712   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
713   {\r
714         vBlockToWait( 1 );\r
715   }\r
716   /* Read lower byte */\r
717   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)\r
718   {\r
719         vBlockToWait( 1 );\r
720   }\r
721   tmp = SPI_I2S_ReceiveData(SPI3);\r
722 \r
723 \r
724   SPI_I2S_SendData(SPI3, 0xFF);\r
725   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
726   {\r
727         vBlockToWait( 1 );\r
728   }\r
729   /* Read lower byte */\r
730   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)\r
731   {\r
732         vBlockToWait( 1 );\r
733   }\r
734   tmp = ((tmp & 0xFF) << 8) | SPI_I2S_ReceiveData(SPI3);\r
735 \r
736   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
737 \r
738   /* SPI3 prescaler: 2 */\r
739   SPI3->CR1 &= 0xFFC7;\r
740 \r
741   return tmp;\r
742 }\r
743 \r
744 /*******************************************************************************\r
745 * Function Name  : LCD_WriteRAM_Prepare\r
746 * Description    : Prepare to write to the LCD RAM.\r
747 * Input          : None\r
748 * Output         : None\r
749 * Return         : None\r
750 *******************************************************************************/\r
751 void LCD_WriteRAM_Prepare(void)\r
752 {\r
753   LCD_WriteRegIndex(R34); /* Select GRAM Reg */\r
754 \r
755   /* Reset LCD control line(/CS) and Send Start-Byte */\r
756   LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG);\r
757 }\r
758 \r
759 /*******************************************************************************\r
760 * Function Name  : LCD_WriteRAMWord\r
761 * Description    : Writes 1 word to the LCD RAM.\r
762 * Input          : - RGB_Code: the pixel color in RGB mode (5-6-5).\r
763 * Output         : None\r
764 * Return         : None\r
765 *******************************************************************************/\r
766 void LCD_WriteRAMWord(u16 RGB_Code)\r
767 {\r
768   LCD_WriteRAM_Prepare();\r
769 \r
770   LCD_WriteRAM(RGB_Code);\r
771 \r
772   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
773 }\r
774 \r
775 /*******************************************************************************\r
776 * Function Name  : LCD_WriteReg\r
777 * Description    : Writes to the selected LCD register.\r
778 * Input          : - LCD_Reg: address of the selected register.\r
779 *                  - LCD_RegValue: value to write to the selected register.\r
780 * Output         : None\r
781 * Return         : None\r
782 *******************************************************************************/\r
783 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)\r
784 {\r
785   /* Write 16-bit Index (then Write Reg) */\r
786   LCD_WriteRegIndex(LCD_Reg);\r
787 \r
788   /* Write 16-bit Reg */\r
789   /* Reset LCD control line(/CS) and Send Start-Byte */\r
790   LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG);\r
791 \r
792   SPI_I2S_SendData(SPI3, LCD_RegValue>>8);\r
793   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
794   {\r
795         vBlockToWait( 1 );\r
796   }\r
797   SPI_I2S_SendData(SPI3, (LCD_RegValue & 0xFF));\r
798   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
799   {\r
800         vBlockToWait( 1 );\r
801   }\r
802 \r
803   LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);\r
804 }\r
805 \r
806 \r
807 /*******************************************************************************\r
808 * Function Name  : LCD_WriteRAM\r
809 * Description    : Writes to the LCD RAM.\r
810 * Input          : - RGB_Code: the pixel color in RGB mode (5-6-5).\r
811 * Output         : None\r
812 * Return         : None\r
813 *******************************************************************************/\r
814 void LCD_WriteRAM(u16 RGB_Code)\r
815 {\r
816   SPI_I2S_SendData(SPI3, RGB_Code >> 8);\r
817   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
818   {\r
819         vBlockToWait( 1 );\r
820   }\r
821   SPI_I2S_SendData(SPI3, RGB_Code & 0xFF);\r
822 \r
823   while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)\r
824   {\r
825         vBlockToWait( 1 );\r
826   }\r
827 }\r
828 \r
829 /*******************************************************************************\r
830 * Function Name  : LCD_PowerOn\r
831 * Description    : Power on the LCD.\r
832 * Input          : None\r
833 * Output         : None\r
834 * Return         : None\r
835 *******************************************************************************/\r
836 void LCD_PowerOn(void)\r
837 {\r
838   /* Power On sequence ---------------------------------------------------------*/\r
839   LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */\r
840   LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */\r
841   LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */\r
842   LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */\r
843   timerDly(20);                 /* Dis-charge capacitor power voltage (200ms) */\r
844   LCD_WriteReg(R16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */\r
845   LCD_WriteReg(R17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */\r
846   timerDly(5);                  /* delay 50 ms */\r
847   LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */\r
848   timerDly(5);                  /* delay 50 ms */\r
849   LCD_WriteReg(R19, 0x1d00); /* VDV[4:0] for VCOM amplitude */\r
850   LCD_WriteReg(R41, 0x0013); /* VCM[4:0] for VCOMH */\r
851   timerDly(5);                  /* delay 50 ms */\r
852   LCD_WriteReg(R7, 0x0173);  /* 262K color and display ON */\r
853 }\r
854 \r
855 /*******************************************************************************\r
856 * Function Name  : LCD_DisplayOn\r
857 * Description    : Enables the Display.\r
858 * Input          : None\r
859 * Output         : None\r
860 * Return         : None\r
861 *******************************************************************************/\r
862 void LCD_DisplayOn(void)\r
863 {\r
864   /* Display On */\r
865   LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */\r
866 \r
867 }\r
868 \r
869 /*******************************************************************************\r
870 * Function Name  : LCD_DisplayOff\r
871 * Description    : Disables the Display.\r
872 * Input          : None\r
873 * Output         : None\r
874 * Return         : None\r
875 *******************************************************************************/\r
876 void LCD_DisplayOff(void)\r
877 {\r
878   /* Display Off */\r
879   LCD_WriteReg(R7, 0x0);\r
880 }\r
881 \r
882 /*******************************************************************************\r
883 * Function Name  : LCD_CtrlLinesConfig\r
884 * Description    : Configures LCD control lines in Output Push-Pull mode.\r
885 * Input          : None\r
886 * Output         : None\r
887 * Return         : None\r
888 *******************************************************************************/\r
889 void LCD_CtrlLinesConfig(void)\r
890 {\r
891   GPIO_InitTypeDef GPIO_InitStructure;\r
892 \r
893   /* Configure NCS (PB.02) in Output Push-Pull mode */\r
894   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;\r
895   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
896   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;\r
897   GPIO_Init(GPIOB, &GPIO_InitStructure);\r
898 \r
899   /* Configure NWR(RNW), RS (PD.15, PD.07) in Output Push-Pull mode */\r
900 //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_15;\r
901 //  GPIO_Init(GPIOD, &GPIO_InitStructure);\r
902 \r
903 //  LCD_CtrlLinesWrite(GPIOD, CtrlPin_NWR, Bit_SET);\r
904 //  LCD_CtrlLinesWrite(GPIOD, CtrlPin_RS, Bit_SET);\r
905 }\r
906 \r
907 /*******************************************************************************\r
908 * Function Name  : LCD_CtrlLinesWrite\r
909 * Description    : Sets or reset LCD control lines.\r
910 * Input          : - GPIOx: where x can be B or D to select the GPIO peripheral.\r
911 *                  - CtrlPins: the Control line. This parameter can be:\r
912 *                       - CtrlPin_NCS: Chip Select pin (PB.02)\r
913 *                       - CtrlPin_NWR: Read/Write Selection pin (PD.15)\r
914 *                       - CtrlPin_RS: Register/RAM Selection pin (PD.07)\r
915 *                  - BitVal: specifies the value to be written to the selected bit.\r
916 *                    This parameter can be:\r
917 *                       - Bit_RESET: to clear the port pin\r
918 *                       - Bit_SET: to set the port pin\r
919 * Output         : None\r
920 * Return         : None\r
921 *******************************************************************************/\r
922 void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, u16 CtrlPins, BitAction BitVal)\r
923 {\r
924   /* Set or Reset the control line */\r
925   GPIO_WriteBit(GPIOx, CtrlPins, BitVal);\r
926 }\r
927 \r
928 /*******************************************************************************\r
929 * Function Name  : LCD_SPIConfig\r
930 * Description    : Configures the SPI3 interface.\r
931 * Input          : None\r
932 * Output         : None\r
933 * Return         : None\r
934 *******************************************************************************/\r
935 void LCD_SPIConfig(void)\r
936 {\r
937   SPI_InitTypeDef    SPI_InitStructure;\r
938   GPIO_InitTypeDef   GPIO_InitStructure;\r
939 \r
940   /* Enable GPIOC clock */\r
941   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);\r
942 \r
943   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);\r
944   AFIO->MAPR |= GPIO_Remap_SPI3;\r
945 \r
946   /* Enable SPI3 clock  */\r
947   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);\r
948 \r
949   /* Configure SPI3 pins: SCK, MISO and MOSI */\r
950   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;\r
951   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
952   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;\r
953   GPIO_Init(GPIOC, &GPIO_InitStructure);\r
954 \r
955   SPI_I2S_DeInit(SPI3);\r
956 \r
957   /* SPI3 Config */\r
958   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;\r
959   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;\r
960   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;\r
961   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;\r
962   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;\r
963   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;\r
964   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;\r
965   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;\r
966   SPI_Init(SPI3, &SPI_InitStructure);\r
967 \r
968   /* SPI3 enable */\r
969   SPI_Cmd(SPI3, ENABLE);\r
970 }\r
971 \r
972 /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/\r