1 /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
\r
3 * Author : MCD Application Team
\r
6 * Description : This file includes the LCD driver for AM-240320L8TNQW00H
\r
7 * (LCD_ILI9320) Liquid Crystal Display Module of STM3210D-EVAL
\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
18 /* Includes ------------------------------------------------------------------*/
\r
19 #include "FreeRTOS.h"
\r
28 #include <stm32f10x_conf.h>
\r
29 #include <stm32f10x_lib.h>
\r
31 #include "STM3210D_lcd.h"
\r
34 extern void timerDly(unsigned int);
\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
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
49 /* Private function prototypes -----------------------------------------------*/
\r
50 /* Private functions ---------------------------------------------------------*/
\r
52 #define timerDly( x ) vTaskDelay( ( x * 10 ) / portTICK_RATE_MS );
\r
53 #define vBlockToWait( x )
\r
55 /*******************************************************************************
\r
56 * Function Name : LCD_Setup
\r
57 * Description : Setups the LCD.
\r
61 *******************************************************************************/
\r
62 void LCD_Setup(void)
\r
64 /* Configure the LCD Control pins --------------------------------------------*/
\r
65 LCD_CtrlLinesConfig();
\r
67 /* Configure the SPI3 interface ----------------------------------------------*/
\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
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
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
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
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
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
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
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
145 LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */
\r
148 /*******************************************************************************
\r
149 * Function Name : STM3210D_LCD_Init
\r
150 * Description : Initializes the LCD.
\r
154 *******************************************************************************/
\r
155 void STM3210D_LCD_Init(void)
\r
157 /* Setups the LCD */
\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
168 *******************************************************************************/
\r
169 void LCD_SetTextColor(vu16 Color)
\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
181 *******************************************************************************/
\r
182 void LCD_SetBackColor(vu16 Color)
\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
195 *******************************************************************************/
\r
196 void LCD_ClearLine(u8 Line)
\r
198 LCD_DisplayStringLine(Line, ( unsigned char * ) " ");
\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
207 *******************************************************************************/
\r
208 void LCD_Clear(u16 Color)
\r
212 LCD_SetCursor(0x00, 0x013F);
\r
214 LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
\r
216 for(index = 0; index < 76800; index++)
\r
218 LCD_WriteRAM(Color);
\r
221 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\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
232 *******************************************************************************/
\r
233 void LCD_SetCursor(u8 Xpos, u16 Ypos)
\r
235 LCD_WriteReg(R32, Xpos);
\r
236 LCD_WriteReg(R33, Ypos);
\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
249 *******************************************************************************/
\r
250 void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c)
\r
252 vu32 index = 0, i = 0;
\r
257 LCD_SetCursor(Xaddress, Ypos);
\r
259 for(index = 0; index < 24; index++)
\r
261 LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
\r
263 for(i = 0; i < 16; i++)
\r
265 if((c[index] & (1 << i)) == 0x00)
\r
267 LCD_WriteRAM(BackColor);
\r
271 LCD_WriteRAM(TextColor);
\r
274 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\r
276 LCD_SetCursor(Xaddress, Ypos);
\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
290 *******************************************************************************/
\r
291 void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii)
\r
294 LCD_DrawChar(Line, Column, &ASCII_Table[Ascii * 24]);
\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
306 *******************************************************************************/
\r
307 void LCD_DisplayStringLine(u8 Line, u8 *ptr)
\r
310 vu16 refcolumn = 319;
\r
312 /* Send the string character by character on lCD */
\r
313 while ((*ptr != 0) & (i < 20))
\r
315 /* Display one character on LCD */
\r
316 LCD_DisplayChar(Line, refcolumn, *ptr);
\r
317 /* Decrement the column position by 16 */
\r
319 /* Point on the next character */
\r
321 /* Increment the character counter */
\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
335 *******************************************************************************/
\r
336 void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
\r
338 /* Horizontal GRAM Start Address */
\r
341 LCD_WriteReg(R80, (Xpos - Height + 1));
\r
345 LCD_WriteReg(R80, 0);
\r
347 /* Horizontal GRAM End Address */
\r
348 LCD_WriteReg(R81, Xpos);
\r
349 /* Vertical GRAM Start Address */
\r
352 LCD_WriteReg(R82, (Ypos - Width + 1));
\r
356 LCD_WriteReg(R82, 0);
\r
358 /* Vertical GRAM End Address */
\r
359 LCD_WriteReg(R83, Ypos);
\r
360 LCD_SetCursor(Xpos, Ypos);
\r
363 /*******************************************************************************
\r
364 * Function Name : LCD_WindowModeDisable
\r
365 * Description : Disables LCD Window mode.
\r
369 *******************************************************************************/
\r
370 void LCD_WindowModeDisable(void)
\r
372 LCD_SetDisplayWindow(239, 0x13F, 240, 320);
\r
373 LCD_WriteReg(R3, 0x1018);
\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
386 *******************************************************************************/
\r
387 void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction)
\r
391 LCD_SetCursor(Xpos, Ypos);
\r
393 if(Direction == Horizontal)
\r
395 LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
\r
397 for(i = 0; i < Length; i++)
\r
399 LCD_WriteRAM(TextColor);
\r
401 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\r
405 for(i = 0; i < Length; i++)
\r
407 LCD_WriteRAMWord(TextColor);
\r
409 LCD_SetCursor(Xpos, Ypos);
\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
423 *******************************************************************************/
\r
424 void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
\r
426 LCD_DrawLine(Xpos, Ypos, Width, Horizontal);
\r
427 LCD_DrawLine((Xpos + Height), Ypos, Width, Horizontal);
\r
429 LCD_DrawLine(Xpos, Ypos, Height, Vertical);
\r
430 LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, Vertical);
\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
442 *******************************************************************************/
\r
443 void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius)
\r
445 s32 D;/* Decision Variable */
\r
446 u32 CurX;/* Current X Value */
\r
447 u32 CurY;/* Current Y Value */
\r
449 D = 3 - (Radius << 1);
\r
453 while (CurX <= CurY)
\r
455 LCD_SetCursor(Xpos + CurX, Ypos + CurY);
\r
456 LCD_WriteRAMWord(TextColor);
\r
458 LCD_SetCursor(Xpos + CurX, Ypos - CurY);
\r
459 LCD_WriteRAMWord(TextColor);
\r
461 LCD_SetCursor(Xpos - CurX, Ypos + CurY);
\r
462 LCD_WriteRAMWord(TextColor);
\r
464 LCD_SetCursor(Xpos - CurX, Ypos - CurY);
\r
465 LCD_WriteRAMWord(TextColor);
\r
467 LCD_SetCursor(Xpos + CurY, Ypos + CurX);
\r
468 LCD_WriteRAMWord(TextColor);
\r
470 LCD_SetCursor(Xpos + CurY, Ypos - CurX);
\r
471 LCD_WriteRAMWord(TextColor);
\r
473 LCD_SetCursor(Xpos - CurY, Ypos + CurX);
\r
474 LCD_WriteRAMWord(TextColor);
\r
476 LCD_SetCursor(Xpos - CurY, Ypos - CurX);
\r
477 LCD_WriteRAMWord(TextColor);
\r
481 D += (CurX << 2) + 6;
\r
485 D += ((CurX - CurY) << 2) + 10;
\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
498 *******************************************************************************/
\r
499 void LCD_DrawMonoPict(uc32 *Pict)
\r
501 u32 index = 0, i = 0;
\r
503 LCD_SetCursor(0, 319);
\r
504 LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
\r
506 for(index = 0; index < 2400; index++)
\r
508 for(i = 0; i < 32; i++)
\r
510 if((Pict[index] & (1 << i)) == 0x00)
\r
512 LCD_WriteRAM(BackColor);
\r
516 LCD_WriteRAM(TextColor);
\r
520 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\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
530 //*******************************************************************************/
\r
531 //void LCD_DrawBMP(u32 BmpAddress)
\r
533 // u32 i = 0, size = 0;
\r
535 // /* Read bitmap size */
\r
536 // SPI_FLASH_BufferRead((u8*)&size, BmpAddress + 2, 4);
\r
538 // /* get bitmap data address offset */
\r
539 // SPI_FLASH_BufferRead((u8*)&i, BmpAddress + 10, 4);
\r
541 // size = (size - i)/2;
\r
543 // SPI_FLASH_StartReadSequence(BmpAddress + i);
\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
550 // /* Enable SPI1 */
\r
551 // SPI_Cmd(SPI1, ENABLE);
\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
558 // LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
\r
560 // /* Read bitmap data from SPI Flash and send them to LCD */
\r
561 // for(i = 0; i < size; i++)
\r
563 // LCD_WriteRAM(__REV_HalfWord(SPI_FLASH_SendHalfWord(0xA5A5)));
\r
566 // LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\r
568 // /* Deselect the FLASH: Chip Select high */
\r
569 // SPI_FLASH_CS_HIGH();
\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
576 // /* Enable SPI1 */
\r
577 // SPI_Cmd(SPI1, ENABLE);
\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
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
591 *******************************************************************************/
\r
592 void LCD_DrawBMP(uc16 *BmpAddress)
\r
594 u32 i = 0, size = 0;
\r
596 /* Read bitmap size */
\r
597 size = BmpAddress[1] | (BmpAddress[2] << 16);
\r
599 /* get bitmap data address offset */
\r
600 i = BmpAddress[5] | (BmpAddress[6] << 16);
\r
602 size = (size - 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
610 LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
\r
612 /* Read bitmap data from SPI Flash and send them to LCD */
\r
613 for(i = 0; i < size; i++)
\r
615 LCD_WriteRAM(BmpAddress[i]);
\r
618 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\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
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
632 *******************************************************************************/
\r
633 void LCD_nCS_StartByte(u8 Start_Byte)
\r
635 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_RESET);
\r
637 SPI_I2S_SendData(SPI3, Start_Byte);
\r
638 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\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
650 *******************************************************************************/
\r
651 void LCD_WriteRegIndex(u8 LCD_Reg)
\r
653 /* Reset LCD control line(/CS) and Send Start-Byte */
\r
654 LCD_nCS_StartByte(START_BYTE | SET_INDEX);
\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
662 SPI_I2S_SendData(SPI3, LCD_Reg);
\r
663 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\r
668 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\r
671 /*******************************************************************************
\r
672 * Function Name : LCD_ReadReg
\r
673 * Description : Reads the selected LCD Register.
\r
676 * Return : LCD Register Value.
\r
677 *******************************************************************************/
\r
678 u16 LCD_ReadReg(u8 LCD_Reg)
\r
683 /* SPI3 prescaler: 4 */
\r
684 SPI3->CR1 &= 0xFFC7;
\r
685 SPI3->CR1 |= 0x0008;
\r
687 /* Write 16-bit Index (then Read Reg) */
\r
688 LCD_WriteRegIndex(LCD_Reg);
\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
694 for(i = 0; i < 5; i++)
\r
696 SPI_I2S_SendData(SPI3, 0xFF);
\r
698 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\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
707 SPI_I2S_ReceiveData(SPI3);
\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
716 /* Read lower byte */
\r
717 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)
\r
721 tmp = SPI_I2S_ReceiveData(SPI3);
\r
724 SPI_I2S_SendData(SPI3, 0xFF);
\r
725 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\r
729 /* Read lower byte */
\r
730 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)
\r
734 tmp = ((tmp & 0xFF) << 8) | SPI_I2S_ReceiveData(SPI3);
\r
736 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\r
738 /* SPI3 prescaler: 2 */
\r
739 SPI3->CR1 &= 0xFFC7;
\r
744 /*******************************************************************************
\r
745 * Function Name : LCD_WriteRAM_Prepare
\r
746 * Description : Prepare to write to the LCD RAM.
\r
750 *******************************************************************************/
\r
751 void LCD_WriteRAM_Prepare(void)
\r
753 LCD_WriteRegIndex(R34); /* Select GRAM Reg */
\r
755 /* Reset LCD control line(/CS) and Send Start-Byte */
\r
756 LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG);
\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
765 *******************************************************************************/
\r
766 void LCD_WriteRAMWord(u16 RGB_Code)
\r
768 LCD_WriteRAM_Prepare();
\r
770 LCD_WriteRAM(RGB_Code);
\r
772 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\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
782 *******************************************************************************/
\r
783 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
\r
785 /* Write 16-bit Index (then Write Reg) */
\r
786 LCD_WriteRegIndex(LCD_Reg);
\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
792 SPI_I2S_SendData(SPI3, LCD_RegValue>>8);
\r
793 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\r
797 SPI_I2S_SendData(SPI3, (LCD_RegValue & 0xFF));
\r
798 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\r
803 LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
\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
813 *******************************************************************************/
\r
814 void LCD_WriteRAM(u16 RGB_Code)
\r
816 SPI_I2S_SendData(SPI3, RGB_Code >> 8);
\r
817 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\r
821 SPI_I2S_SendData(SPI3, RGB_Code & 0xFF);
\r
823 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) != RESET)
\r
829 /*******************************************************************************
\r
830 * Function Name : LCD_PowerOn
\r
831 * Description : Power on the LCD.
\r
835 *******************************************************************************/
\r
836 void LCD_PowerOn(void)
\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
855 /*******************************************************************************
\r
856 * Function Name : LCD_DisplayOn
\r
857 * Description : Enables the Display.
\r
861 *******************************************************************************/
\r
862 void LCD_DisplayOn(void)
\r
865 LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */
\r
869 /*******************************************************************************
\r
870 * Function Name : LCD_DisplayOff
\r
871 * Description : Disables the Display.
\r
875 *******************************************************************************/
\r
876 void LCD_DisplayOff(void)
\r
879 LCD_WriteReg(R7, 0x0);
\r
882 /*******************************************************************************
\r
883 * Function Name : LCD_CtrlLinesConfig
\r
884 * Description : Configures LCD control lines in Output Push-Pull mode.
\r
888 *******************************************************************************/
\r
889 void LCD_CtrlLinesConfig(void)
\r
891 GPIO_InitTypeDef GPIO_InitStructure;
\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
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
903 // LCD_CtrlLinesWrite(GPIOD, CtrlPin_NWR, Bit_SET);
\r
904 // LCD_CtrlLinesWrite(GPIOD, CtrlPin_RS, Bit_SET);
\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
921 *******************************************************************************/
\r
922 void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, u16 CtrlPins, BitAction BitVal)
\r
924 /* Set or Reset the control line */
\r
925 GPIO_WriteBit(GPIOx, CtrlPins, BitVal);
\r
928 /*******************************************************************************
\r
929 * Function Name : LCD_SPIConfig
\r
930 * Description : Configures the SPI3 interface.
\r
934 *******************************************************************************/
\r
935 void LCD_SPIConfig(void)
\r
937 SPI_InitTypeDef SPI_InitStructure;
\r
938 GPIO_InitTypeDef GPIO_InitStructure;
\r
940 /* Enable GPIOC clock */
\r
941 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
\r
943 //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);
\r
944 AFIO->MAPR |= GPIO_Remap_SPI3;
\r
946 /* Enable SPI3 clock */
\r
947 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
\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
955 SPI_I2S_DeInit(SPI3);
\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
969 SPI_Cmd(SPI3, ENABLE);
\r
972 /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
\r