]> git.sur5r.net Git - freertos/blob - Demo/ARM9_STR91X_IAR/STCode/lcd.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / ARM9_STR91X_IAR / STCode / lcd.c
1 /******************** (C) COPYRIGHT 2006 STMicroelectronics ********************\r
2 * File Name          : lcd.c\r
3 * Author             : MCD Application Team\r
4 * Date First Issued  : 05/18/2006 : Version 1.0\r
5 * Description        : This file includes the LCD driver for GXM12232-2SL liquid\r
6 *                      Crystal Display Module of STR75x-EVAL.\r
7 ********************************************************************************\r
8 * History:\r
9 * 05/24/2006 : Version 1.1\r
10 * 05/18/2006 : Version 1.0\r
11 ********************************************************************************\r
12 * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
13 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.\r
14 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,\r
15 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE\r
16 * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING\r
17 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
18 *******************************************************************************/\r
19 \r
20 /* Includes ------------------------------------------------------------------*/\r
21 #include "91x_lib.h"\r
22 #include "lcd.h"\r
23 #include "FreeRTOS.h"\r
24 #include "task.h"\r
25 \r
26 /* Private typedef -----------------------------------------------------------*/\r
27 static GPIO_InitTypeDef GPIO_InitStructure;\r
28 \r
29 /* Private define ------------------------------------------------------------*/\r
30 /* Private macro -------------------------------------------------------------*/\r
31 /* Private variables ---------------------------------------------------------*/\r
32   /* Global variable to set the written text color: used for LCD_Printf */\r
33   TextColorMode_TypeDef TextMode=BlackText;\r
34 \r
35   /* ASCII Table: each character is 7 column (7dots large) on two pages (16dots high)  */\r
36   /* 7 column character: Two 8bit data to display one column*/\r
37   u8 AsciiDotsTable[1778] = {\r
38   /* ASCII 0   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
39   /* ASCII 1   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
40   /* ASCII 2   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
41   /* ASCII 3   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
42   /* ASCII 4   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
43   /* ASCII 5   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
44   /* ASCII 6   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
45   /* ASCII 7   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
46   /* ASCII 8   */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
47   /* ASCII 9   */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
48   /* ASCII 10  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
49   /* ASCII 11  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
50   /* ASCII 12  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
51   /* ASCII 13  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
52   /* ASCII 14  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
53   /* ASCII 15  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
54   /* ASCII 16  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
55   /* ASCII 17  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
56   /* ASCII 18  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
57   /* ASCII 19  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
58   /* ASCII 20  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
59   /* ASCII 21  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
60   /* ASCII 22  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
61   /* ASCII 23  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
62   /* ASCII 24  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
63   /* ASCII 25  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
64   /* ASCII 26  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
65   /* ASCII 27  */  0x1f,0xe0,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x1f,0xe0,0x00,0x00,\r
66   /* ASCII 28  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
67   /* ASCII 29  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
68   /* ASCII 30  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
69   /* ASCII 31  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
70   /* ASCII 32  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
71   /* ASCII 33  */  0x00,0x00,0x00,0x00,0x00,0x00,0x13,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,\r
72   /* ASCII 34  */  0x00,0x00,0x00,0xe0,0x00,0x20,0x00,0x00,0x00,0xe0,0x00,0x20,0x00,0x00,\r
73   /* ASCII 35  */  0x00,0x00,0x35,0x00,0x0f,0x80,0x35,0x60,0x0f,0x80,0x05,0x60,0x00,0x00,\r
74   /* ASCII 36  */  0x00,0x00,0x0d,0x80,0x0a,0x40,0x3a,0x60,0x06,0x40,0x00,0x00,0x00,0x00,\r
75   /* ASCII 37  */  0x00,0x00,0x02,0x40,0x02,0xa0,0x0a,0x40,0x15,0x00,0x09,0x00,0x00,0x00,\r
76   /* ASCII 38  */  0x00,0x00,0x0c,0x00,0x13,0x00,0x14,0x80,0x08,0x80,0x14,0x00,0x00,0x00,\r
77   /* ASCII 39  */  0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,\r
78   /* ASCII 40  */  0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x80,0x60,0x60,0x00,0x00,0x00,0x00,\r
79   /* ASCII 41  */  0x00,0x00,0x00,0x00,0x60,0x60,0x1f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,\r
80   /* ASCII 42  */  0x00,0x00,0x00,0x40,0x03,0x40,0x00,0xe0,0x03,0x40,0x00,0x40,0x00,0x00,\r
81   /* ASCII 43  */  0x02,0x00,0x02,0x00,0x02,0x00,0x1f,0xc0,0x02,0x00,0x02,0x00,0x02,0x00,\r
82   /* ASCII 44  */  0x00,0x00,0x00,0x00,0x60,0x00,0x38,0x00,0x08,0x00,0x00,0x00,0x00,0x00,\r
83   /* ASCII 45  */  0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,\r
84   /* ASCII 46  */  0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
85   /* ASCII 47  */  0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x00,\r
86   /* ASCII 48  */  0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x0f,0xc0,0x00,0x00,\r
87   /* ASCII 49  */  0x00,0x00,0x10,0x00,0x10,0x20,0x1f,0xe0,0x10,0x00,0x10,0x00,0x00,0x00,\r
88   /* ASCII 50  */  0x00,0x00,0x18,0x40,0x14,0x20,0x12,0x20,0x11,0x20,0x18,0xc0,0x00,0x00,\r
89   /* ASCII 51  */  0x00,0x00,0x08,0x40,0x10,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,\r
90   /* ASCII 52  */  0x00,0x00,0x06,0x00,0x05,0x00,0x04,0xc0,0x14,0x20,0x1f,0xe0,0x14,0x00,\r
91   /* ASCII 53  */  0x00,0x00,0x08,0x00,0x11,0xe0,0x11,0x20,0x11,0x20,0x0e,0x20,0x00,0x00,\r
92   /* ASCII 54  */  0x00,0x00,0x0f,0x80,0x11,0x40,0x11,0x20,0x11,0x20,0x0e,0x20,0x00,0x00,\r
93   /* ASCII 55  */  0x00,0x00,0x00,0x60,0x00,0x20,0x18,0x20,0x07,0x20,0x00,0xe0,0x00,0x00,\r
94   /* ASCII 56  */  0x00,0x00,0x0e,0xc0,0x11,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,\r
95   /* ASCII 57  */  0x00,0x00,0x11,0xc0,0x12,0x20,0x12,0x20,0x0a,0x20,0x07,0xc0,0x00,0x00,\r
96   /* ASCII 58  */  0x00,0x00,0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,\r
97   /* ASCII 59  */  0x00,0x00,0x00,0x00,0x30,0x00,0x19,0x80,0x09,0x80,0x00,0x00,0x00,0x00,\r
98   /* ASCII 60  */  0x02,0x00,0x05,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x10,0x40,0x00,0x00,\r
99   /* ASCII 61  */  0x00,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x00,0x00,\r
100   /* ASCII 62  */  0x10,0x40,0x10,0x40,0x08,0x80,0x05,0x00,0x05,0x00,0x02,0x00,0x00,0x00,\r
101   /* ASCII 63  */  0x00,0x00,0x00,0x00,0x10,0x80,0x14,0x40,0x02,0x40,0x01,0x80,0x00,0x00,\r
102   /* ASCII 64  */  0x00,0x00,0x1f,0xe0,0x20,0x10,0x23,0x10,0x24,0x90,0x17,0xe0,0x00,0x00,\r
103   /* ASCII 65  */  0x10,0x00,0x1c,0x00,0x17,0xa0,0x04,0x60,0x17,0x80,0x1c,0x00,0x10,0x00,\r
104   /* ASCII 66  */  0x10,0x20,0x1f,0xe0,0x11,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,\r
105   /* ASCII 67  */  0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x08,0x60,0x00,0x00,\r
106   /* ASCII 68  */  0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x20,0x08,0x40,0x07,0x80,0x00,0x00,\r
107   /* ASCII 69  */  0x10,0x20,0x1f,0xe0,0x11,0x20,0x13,0xa0,0x10,0x20,0x18,0x60,0x00,0x00,\r
108   /* ASCII 70  */  0x00,0x00,0x10,0x20,0x1f,0xe0,0x11,0x20,0x03,0xa0,0x00,0x20,0x00,0x60,\r
109   /* ASCII 71  */  0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x12,0x20,0x0e,0x60,0x02,0x00,\r
110   /* ASCII 72  */  0x10,0x20,0x1f,0xe0,0x11,0x20,0x01,0x00,0x11,0x20,0x1f,0xe0,0x10,0x20,\r
111   /* ASCII 73  */  0x00,0x00,0x10,0x20,0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x20,0x00,0x00,\r
112   /* ASCII 74  */  0x00,0x00,0x0e,0x00,0x10,0x20,0x10,0x20,0x0f,0xe0,0x00,0x20,0x00,0x00,\r
113   /* ASCII 75  */  0x10,0x20,0x1f,0xe0,0x12,0x20,0x03,0x00,0x04,0xa0,0x18,0x60,0x10,0x20,\r
114   /* ASCII 76  */  0x00,0x00,0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x00,0x1c,0x00,0x00,0x00,\r
115   /* ASCII 77  */  0x10,0x20,0x1f,0xe0,0x10,0xe0,0x03,0x00,0x10,0xe0,0x1f,0xe0,0x10,0x20,\r
116   /* ASCII 78  */  0x10,0x20,0x1f,0xe0,0x10,0xe0,0x07,0x00,0x18,0x20,0x1f,0xe0,0x00,0x20,\r
117   /* ASCII 79  */  0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x0f,0xc0,0x00,0x00,\r
118   /* ASCII 80  */  0x00,0x00,0x10,0x20,0x1f,0xe0,0x12,0x20,0x02,0x20,0x01,0xc0,0x00,0x00,\r
119   /* ASCII 81  */  0x00,0x00,0x0f,0xc0,0x10,0x20,0x30,0x20,0x30,0x20,0x2f,0xc0,0x00,0x00,\r
120   /* ASCII 82  */  0x10,0x20,0x1f,0xe0,0x12,0x20,0x02,0x20,0x06,0x20,0x09,0xc0,0x10,0x00,\r
121   /* ASCII 83  */  0x00,0x00,0x18,0xc0,0x09,0x20,0x11,0x20,0x11,0x40,0x0e,0x60,0x00,0x00,\r
122   /* ASCII 84  */  0x00,0x60,0x00,0x20,0x10,0x20,0x1f,0xe0,0x10,0x20,0x00,0x20,0x00,0x60,\r
123   /* ASCII 85  */  0x00,0x20,0x0f,0xe0,0x10,0x20,0x10,0x00,0x10,0x20,0x0f,0xe0,0x00,0x20,\r
124   /* ASCII 86  */  0x00,0x20,0x00,0xe0,0x07,0x20,0x18,0x00,0x07,0x20,0x00,0xe0,0x00,0x20,\r
125   /* ASCII 87  */  0x00,0x20,0x0f,0xe0,0x10,0x20,0x0f,0x00,0x10,0x20,0x0f,0xe0,0x00,0x20,\r
126   /* ASCII 88  */  0x10,0x20,0x18,0x60,0x04,0x80,0x03,0x00,0x04,0x80,0x18,0x60,0x10,0x20,\r
127   /* ASCII 89  */  0x00,0x20,0x00,0x60,0x11,0xa0,0x1e,0x00,0x11,0xa0,0x00,0x60,0x00,0x20,\r
128   /* ASCII 90  */  0x00,0x00,0x18,0x60,0x14,0x20,0x13,0x20,0x10,0xa0,0x18,0x60,0x00,0x00,\r
129   /* ASCII 91  */  0x00,0x00,0x00,0x00,0x7f,0xe0,0x40,0x20,0x40,0x20,0x00,0x00,0x00,0x00,\r
130   /* ASCII 92  */  0x00,0x00,0x00,0x20,0x01,0xc0,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,\r
131   /* ASCII 93  */  0x00,0x00,0x00,0x00,0x40,0x20,0x40,0x20,0x7f,0xe0,0x00,0x00,0x00,0x00,\r
132   /* ASCII 94  */  0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x60,0x00,0x80,0x01,0x00,0x00,0x00,\r
133   /* ASCII 95  */  0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,\r
134   /* ASCII 96  */  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x00,0x00,0x00,\r
135   /* ASCII 97  */  0x00,0x00,0x0d,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x1f,0x00,0x10,0x00,\r
136   /* ASCII 98  */  0x10,0x20,0x1f,0xe0,0x11,0x00,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,\r
137   /* ASCII 99  */  0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x09,0x80,0x00,0x00,\r
138   /* ASCII 100 */  0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x11,0x20,0x1f,0xe0,0x10,0x00,\r
139   /* ASCII 101 */  0x00,0x00,0x0f,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x13,0x00,0x00,0x00,\r
140   /* ASCII 102 */  0x00,0x00,0x10,0x80,0x1f,0xc0,0x10,0xa0,0x10,0xa0,0x10,0xa0,0x00,0x00,\r
141   /* ASCII 103 */  0x00,0x00,0x0f,0x00,0x50,0x80,0x50,0x80,0x51,0x00,0x3f,0x80,0x00,0x80,\r
142   /* ASCII 104 */  0x10,0x20,0x1f,0xe0,0x11,0x00,0x00,0x80,0x10,0x80,0x1f,0x00,0x10,0x00,\r
143   /* ASCII 105 */  0x00,0x00,0x10,0x80,0x10,0x80,0x1f,0xa0,0x10,0x00,0x10,0x00,0x00,0x00,\r
144   /* ASCII 106 */  0x00,0x00,0x40,0x80,0x40,0x80,0x40,0xa0,0x3f,0x80,0x00,0x00,0x00,0x00,\r
145   /* ASCII 107 */  0x10,0x20,0x1f,0xe0,0x02,0x00,0x16,0x80,0x19,0x80,0x10,0x80,0x00,0x00,\r
146   /* ASCII 108 */  0x00,0x00,0x10,0x00,0x10,0x20,0x1f,0xe0,0x10,0x00,0x10,0x00,0x00,0x00,\r
147   /* ASCII 109 */  0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x00,0x10,0x80,0x1f,0x00,0x10,0x00,\r
148   /* ASCII 110 */  0x10,0x80,0x1f,0x80,0x11,0x00,0x00,0x80,0x10,0x80,0x1f,0x00,0x10,0x00,\r
149   /* ASCII 111 */  0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,\r
150   /* ASCII 112 */  0x40,0x80,0x7f,0x80,0x51,0x00,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,\r
151   /* ASCII 113 */  0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x51,0x00,0x7f,0x80,0x40,0x80,\r
152   /* ASCII 114 */  0x00,0x00,0x10,0x80,0x1f,0x80,0x11,0x00,0x10,0x80,0x10,0x80,0x00,0x00,\r
153   /* ASCII 115 */  0x00,0x00,0x19,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x0d,0x80,0x00,0x00,\r
154   /* ASCII 116 */  0x00,0x00,0x00,0x80,0x0f,0xc0,0x10,0x80,0x10,0x80,0x10,0x80,0x08,0x00,\r
155   /* ASCII 117 */  0x00,0x80,0x0f,0x80,0x10,0x00,0x10,0x00,0x08,0x80,0x1f,0x80,0x10,0x00,\r
156   /* ASCII 118 */  0x00,0x80,0x03,0x80,0x0c,0x80,0x10,0x00,0x0c,0x80,0x03,0x80,0x00,0x80,\r
157   /* ASCII 119 */  0x00,0x80,0x0f,0x80,0x10,0x80,0x0e,0x00,0x10,0x80,0x0f,0x80,0x00,0x80,\r
158   /* ASCII 120 */  0x10,0x80,0x19,0x80,0x06,0x00,0x06,0x00,0x19,0x80,0x10,0x80,0x00,0x00,\r
159   /* ASCII 121 */  0x00,0x80,0x41,0x80,0x46,0x80,0x78,0x00,0x4c,0x80,0x03,0x80,0x00,0x80,\r
160   /* ASCII 122 */  0x00,0x00,0x19,0x80,0x14,0x80,0x12,0x80,0x11,0x80,0x18,0x80,0x00,0x00,\r
161   /* ASCII 123 */  0x00,0x00,0x00,0x00,0x04,0x00,0x3b,0xc0,0x40,0x20,0x00,0x00,0x00,0x00,\r
162   /* ASCII 124 */  0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,\r
163   /* ASCII 125 */  0x00,0x00,0x00,0x00,0x40,0x20,0x3b,0xc0,0x04,0x00,0x00,0x00,0x00,0x00,\r
164   /* ASCII 126 */  0x00,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x00,0x00};\r
165 \r
166 /* Private function prototypes -----------------------------------------------*/\r
167 /* Private functions ---------------------------------------------------------*/\r
168 \r
169 /*******************************************************************************\r
170 * Function Name  : LCD_DataLinesConfig\r
171 * Description    : Configure data lines D0~D7 (P8.0~P8.7) in Input Floating mode\r
172 *                  for read from LCD or in Output Push-Pull mode for write on LCD\r
173 * Input          : - Mode: specifies the configuration mode for data lines D0~D7\r
174 *                       - Input: configure in Input Floating mode\r
175 *                       - Output: configure in Output Push-Pul mode\r
176 * Output         : None\r
177 * Return         : None\r
178 *******************************************************************************/\r
179 void LCD_DataLinesConfig(DataConfigMode_TypeDef Mode)\r
180 {\r
181   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;\r
182   if (Mode == Input)\r
183   {\r
184     /* Configure D0~D7 lines (P8.0 ->P8.7) as Input */\r
185     GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;\r
186   }\r
187   else\r
188   {\r
189     /* Configure D0~D7 lines in Output Push-Pull mode */\r
190     GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput ;\r
191     GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;\r
192   }\r
193   GPIO_Init(GPIO8, &GPIO_InitStructure);\r
194 }\r
195 \r
196 /*******************************************************************************\r
197 * Function Name  : LCD_DataLinesWrite\r
198 * Description    : Write a value on D0~D7 (P8.0~P8.7)\r
199 * Input          : - GPIOx: GPIO port to write on. It could be\r
200 *                  - PortVal: value to write\r
201 * Output         : None\r
202 * Return         : None.\r
203 *******************************************************************************/\r
204 void LCD_DataLinesWrite(GPIO_TypeDef* GPIOx, u32 PortVal)\r
205 {\r
206         GPIOx->DR[0x3FC] = PortVal;\r
207 }\r
208 \r
209 /*******************************************************************************\r
210 * Function Name  : LCD_CtrlLinesConfig\r
211 * Description    : Configure control lines E2, E1, RW, DI (P9.4~P9.7) in\r
212 *                  Output Push-Pull mode.\r
213 * Input          : None\r
214 * Output         : None\r
215 * Return         : None\r
216 *******************************************************************************/\r
217 void LCD_CtrlLinesConfig(void)\r
218 {\r
219   /* Configure E2, E1, RW, DI lines (P9.4~P9.7) in Output Push-Pull mode */\r
220   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;\r
221   GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput ;\r
222   GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;\r
223   GPIO_Init(GPIO9, &GPIO_InitStructure);\r
224 }\r
225 \r
226 /*******************************************************************************\r
227 * Function Name  : LCD_CtrlLinesWrite\r
228 * Description    : Set or reset control lines E2, E1, RW, DI (P9.4~P9.7).\r
229 * Input          : - GPIOx: where x can be 0,1 or 2 to select the GPIO peripheral.\r
230 *                  - CtrlPins: the Control line. This parameter can be:\r
231 *                       - CtrlPin_E2: Enabe clock signal for Slave\r
232 *                       - CtrlPin_E1: Enabe clock signal for Master\r
233 *                       - CtrlPin_RW: Read/Write control line\r
234 *                       - CtrlPin_DI:\r
235 * Output         : None\r
236 * Return         : None\r
237 *******************************************************************************/\r
238 void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, u32 CtrlPins, BitAction BitVal)\r
239 {\r
240   /* Set or Reset the control line */\r
241   if(BitVal == Bit_SET)\r
242   {\r
243     GPIOx->DR[CtrlPins <<2] = CtrlPins;\r
244   }\r
245   else\r
246   {\r
247     GPIOx->DR[CtrlPins <<2] = 0x00;\r
248   }\r
249 }\r
250 \r
251 /*******************************************************************************\r
252 * Function Name  : LCD_CheckMasterStatus\r
253 * Description    : Check whether master LCD is busy or not\r
254 * Input          : None\r
255 * Output         : None\r
256 * Return         : None\r
257 *******************************************************************************/\r
258 void LCD_CheckMasterStatus(void)                        \r
259 {\r
260   u8 MasterStatus = 0;\r
261 \r
262   /* Configure Data lines as Input */\r
263   LCD_DataLinesConfig(Input);\r
264   /* Start the master read sequence */\r
265   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);   /* E1 = 0 */\r
266   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_SET);     /* RW = 1 */\r
267   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_RESET);   /* DI = 0 */\r
268   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_SET);     /* E1 = 1 */\r
269   MasterStatus = GPIO_Read(GPIO8);\r
270   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);   /* E1 = 0 */\r
271         \r
272   /* Wait until BF is cleared */\r
273   while ((MasterStatus & 0x80))\r
274   {\r
275         vTaskDelay( 1 );\r
276     LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_SET);   /* E1 = 1 */\r
277     MasterStatus = GPIO_Read(GPIO8);\r
278     LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET); /* E1 = 0 */\r
279   }\r
280 }\r
281 \r
282 /*******************************************************************************\r
283 * Function Name  : LCD_CheckSlaveStatus\r
284 * Description    : Check whether slave LCD is busy or not\r
285 * Input          : None\r
286 * Output         : None\r
287 * Return         : None\r
288 *******************************************************************************/\r
289 void LCD_CheckSlaveStatus(void)                 \r
290 {\r
291   u8 SlaveStatus = 0;\r
292 \r
293   /* Configure Data lines as Input */\r
294   LCD_DataLinesConfig(Input);\r
295   /* Start the slave read sequence */\r
296   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);   /* E2 = 0 */      \r
297   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_SET);     /* RW = 1 */\r
298   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_RESET);   /* DI = 0 */\r
299   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_SET);     /* E2 = 1 */\r
300   SlaveStatus = GPIO_Read(GPIO8);\r
301   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);   /* E2 = 0 */\r
302         \r
303   /* Wait until BF is cleared */\r
304   while ((SlaveStatus & 0x80))\r
305   {\r
306         vTaskDelay( 1 );\r
307     LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_SET);   /* E2 = 1 */\r
308     SlaveStatus = GPIO_Read(GPIO8);\r
309     LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET); /* E2 = 0 */\r
310   }\r
311 }\r
312 \r
313 /*******************************************************************************\r
314 * Function Name  : LCD_SendMasterCmd\r
315 * Description    : Send one byte command to master LCD.\r
316 * Input          : - Cmd: the user expected command to send to master LCD\r
317 * Output         : None\r
318 * Return         : None\r
319 *******************************************************************************/\r
320 void LCD_SendMasterCmd(u8 Cmd)\r
321 {\r
322   /* Check the master status */\r
323   LCD_CheckMasterStatus();\r
324   /* Configure Data lines as Output */\r
325   LCD_DataLinesConfig(Output);\r
326   /* Start the master send command sequence */\r
327   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);  /* E1 = 0 */\r
328   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_RESET);  /* RW = 0 */\r
329   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_RESET);  /* DI = 0 */\r
330   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_SET);    /* E1 = 1 */\r
331   /* Write master command */\r
332   LCD_DataLinesWrite(GPIO8, (u32)Cmd);\r
333   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);  /* E1 = 0 */\r
334 }\r
335 \r
336 /*******************************************************************************\r
337 * Function Name  : LCD_SendSlaveCmd\r
338 * Description    : Send one byte command to slave LCD\r
339 * Input          : - Cmd: the user expected command to send to slave LCD.\r
340 * Output         : None\r
341 * Return         : None\r
342 *******************************************************************************/\r
343 void LCD_SendSlaveCmd(u8 Cmd)\r
344 {\r
345   /* Check the slave status */\r
346   LCD_CheckSlaveStatus();\r
347   /* Configure Data lines as Output */\r
348   LCD_DataLinesConfig(Output);\r
349   /* Start the slave send command sequence */\r
350   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);  /* E2 = 0 */\r
351   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_RESET);  /* RW = 0 */\r
352   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_RESET);  /* DI = 0 */\r
353   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_SET);    /* E2 = 1 */\r
354   /* Write slave command */\r
355   LCD_DataLinesWrite(GPIO8, (u32)Cmd);\r
356   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);  /* E2 = 0 */\r
357 }\r
358 \r
359 /*******************************************************************************\r
360 * Function Name  : LCD_SendMasterData\r
361 * Description    : Display one byte data to master LCD.\r
362 * Input          : - Data: the user expected data to display on master LCD.\r
363 * Output         : None\r
364 * Return         : None\r
365 *******************************************************************************/\r
366 void LCD_SendMasterData(u8 Data)\r
367 {\r
368   /* Check the master status */\r
369   LCD_CheckMasterStatus();\r
370   /* Configure Data lines as Output */\r
371   LCD_DataLinesConfig(Output);\r
372   /* Start the master send data sequence */\r
373   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);  /* E1 = 0 */\r
374   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_RESET);  /* RW = 0 */\r
375   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_SET);    /* DI = 1 */\r
376   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_SET);    /* E1 = 1 */\r
377   /* Write data to the master */\r
378   LCD_DataLinesWrite(GPIO8, (u32)Data);\r
379   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);  /* E1 = 0 */\r
380 }\r
381 \r
382 /*******************************************************************************\r
383 * Function Name  : LCD_ReadMasterData\r
384 * Description    : Read master byte data displayed on master LCD.\r
385 * Input          : None\r
386 * Output         : None\r
387 * Return         : None\r
388 *******************************************************************************/\r
389 u32 LCD_ReadMasterData(void)\r
390 {\r
391   u32 MasterData = 0;\r
392 \r
393   /* Check the master status */\r
394   LCD_CheckMasterStatus();\r
395   /* Configure Data lines as Input */\r
396   LCD_DataLinesConfig(Input);\r
397   /* Start the master read data sequence */\r
398   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);  /* E1 = 0 */\r
399   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_SET);    /* RW = 1 */\r
400   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_SET);    /* DI = 1 */\r
401   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_SET);    /* E1 = 1 */\r
402   /* Read data from the master */\r
403   MasterData = (GPIO_Read(GPIO8));\r
404   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E1, Bit_RESET);  /* E1 = 0 */\r
405   /* Read the master returned data */\r
406   return MasterData;\r
407 }\r
408 \r
409 /*******************************************************************************\r
410 * Function Name  : LCD_SendSlaveData\r
411 * Description    : Display one byte data to slave LCD.\r
412 * Input          : - Data: the user expected data to display on slave LCD.\r
413 * Output         : None\r
414 * Return         : None\r
415 *******************************************************************************/\r
416 void LCD_SendSlaveData(u8 Data)\r
417 {\r
418   /* Check the slave status */\r
419   LCD_CheckSlaveStatus();\r
420   /* Configure Data lines as Output */\r
421   LCD_DataLinesConfig(Output);\r
422   /* Start the slave send data sequence */\r
423   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);  /* E2 = 0 */\r
424   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_RESET);  /* RW = 0 */\r
425   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_SET);    /* DI = 1 */\r
426   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_SET);    /* E2 = 1 */\r
427   /* Write data to the slave */\r
428   LCD_DataLinesWrite(GPIO8, (u32)Data);\r
429   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);  /* E2 = 0 */\r
430 }\r
431 \r
432 /*******************************************************************************\r
433 * Function Name  : LCD_ReadSlaveData\r
434 * Description    : Read slave byte data displayed on slave LCD.\r
435 * Input          : None\r
436 * Output         : None\r
437 * Return         : None\r
438 *******************************************************************************/\r
439 u32 LCD_ReadSlaveData(void)\r
440 {\r
441   u32 SlaveData = 0;\r
442 \r
443   /* Check the slave status */\r
444   LCD_CheckSlaveStatus();\r
445   /* Configure Data lines as Input */\r
446   LCD_DataLinesConfig(Input);\r
447   /* Start the slave read data sequence */\r
448   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);  /* E2 = 0 */\r
449   LCD_CtrlLinesWrite(GPIO9, CtrlPin_RW, Bit_SET);    /* RW = 1 */\r
450   LCD_CtrlLinesWrite(GPIO9, CtrlPin_DI, Bit_SET);    /* DI = 1 */\r
451   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_SET);    /* E2 = 1 */\r
452   /* Read data from the slave */\r
453   SlaveData = GPIO_Read(GPIO8);\r
454   LCD_CtrlLinesWrite(GPIO9, CtrlPin_E2, Bit_RESET);  /* E2 = 0 */\r
455   /* Read the slave returned data */\r
456   return SlaveData;\r
457 }\r
458 \r
459 /*******************************************************************************\r
460 * Function Name  : LCD_Init\r
461 * Description    : Initialize master and slave LCD.\r
462 * Input          : None\r
463 * Output         : None\r
464 * Return         : None\r
465 *******************************************************************************/\r
466 void LCD_Init(void)\r
467 {\r
468   /* Enable GPIO Clock */\r
469 \r
470 \r
471   /* Configure control lines signals as output mode */\r
472   LCD_CtrlLinesConfig();        \r
473 \r
474   /* Master LCD Init */\r
475   LCD_SendMasterCmd(SOFTWARE_RESET);\r
476   LCD_SendMasterCmd(DISPLAY_OFF);\r
477   LCD_SendMasterCmd(DYNAMIC_DRIVE);\r
478   LCD_SendMasterCmd(DUTY_CYCLE);\r
479   LCD_SendMasterCmd(CLOCKWISE_OUTPUT);\r
480   LCD_SendMasterCmd(READ_MODIFY_WRITE_OFF);\r
481   LCD_SendMasterCmd(START_COLUMN);          /* Set master column address to 0 */\r
482   LCD_SendMasterCmd(START_LINE);            /* Set master display start line to 0 */\r
483   LCD_SendMasterCmd(DISPLAY_ON );\r
484 \r
485   /* Slave LCD Init */\r
486   LCD_SendSlaveCmd(SOFTWARE_RESET);\r
487   LCD_SendSlaveCmd(DISPLAY_OFF);\r
488   LCD_SendSlaveCmd(DYNAMIC_DRIVE);\r
489   LCD_SendSlaveCmd(DUTY_CYCLE);\r
490   LCD_SendSlaveCmd(CLOCKWISE_OUTPUT);\r
491   LCD_SendSlaveCmd(READ_MODIFY_WRITE_OFF);\r
492   LCD_SendSlaveCmd(START_COLUMN );          /* Set slave column address to 0 */\r
493   LCD_SendSlaveCmd(START_LINE);             /* Set slave display start line to 0 */\r
494   LCD_SendSlaveCmd(DISPLAY_ON);\r
495 \r
496   /* Clear LCD */       \r
497   LCD_Clear();\r
498   /* Set current Page to 0 for Master and Slave LCDs */ \r
499   LCD_SetSlavePage(0);\r
500   LCD_SetMasterPage(0);\r
501 }\r
502 \r
503 /*******************************************************************************\r
504 * Function Name  : LCD_SetSlavePage\r
505 * Description    : Set the display page of slave LCD, the page range is 0 to 3,\r
506 *                  make sure the input will not exceed this range ,otherwise it\r
507 *                  will reach a undecided result.\r
508 * Input          : - Page: specifies the expected display page of slave LCD\r
509 * Output         : None\r
510 * Return         : None\r
511 *******************************************************************************/\r
512 void LCD_SetSlavePage(u8 Page)\r
513 {\r
514 static u8 ucLastPage = 255;\r
515 \r
516   /* Set Slave page */\r
517   if( Page != ucLastPage )\r
518   {\r
519         LCD_SendSlaveCmd(0xB8|Page);\r
520         ucLastPage = Page;\r
521   }\r
522 }\r
523 \r
524 /*******************************************************************************\r
525 * Function Name  : LCD_SetMasterPage\r
526 * Description    : Set the display page of master LCD, the page range is 0 to 3,\r
527 *                  make sure the input will not exceed this range ,otherwise it\r
528 *                  will reach a undecided result.\r
529 * Input          : - Page: specifies the expected display page of master LCD\r
530 * Output         : None\r
531 * Return         : None\r
532 *******************************************************************************/\r
533 void LCD_SetMasterPage(u8 Page)\r
534 {\r
535 static u8 ulLastPage = 255;\r
536 \r
537   /* Set Master page */\r
538   if( Page != ulLastPage )\r
539   {\r
540     LCD_SendMasterCmd(0xB8|Page);\r
541         ulLastPage = Page;\r
542   }\r
543 }\r
544 \r
545 /*******************************************************************************\r
546 * Function Name  : SetAddress\r
547 * Description    : Set the display column of slave LCD. Column range is 0 to 61.\r
548 * Input          : - Address: specifies the expected display column of slave LCD\r
549 * Output         : None\r
550 * Return         : None\r
551 *******************************************************************************/\r
552 void LCD_SetSlaveColumn(u8 Address)\r
553 {\r
554   /* Set Slave column address */\r
555   LCD_SendSlaveCmd(Address&0x7F);\r
556 }\r
557 \r
558 /*******************************************************************************\r
559 * Function Name  : LCD_SetMasterColumn\r
560 * Description    : Set the display column of master LCD. Column range is 0 to 61.\r
561 * Input          : - Address: specifies the expected display column of slave LCD\r
562 * Output         : None\r
563 * Return         : None\r
564 *******************************************************************************/\r
565 void LCD_SetMasterColumn(u8 Address)\r
566 {\r
567   /* Set Master column address */\r
568   LCD_SendMasterCmd(Address&0x7F);\r
569 }\r
570 \r
571 /*******************************************************************************\r
572 * Function Name  : LCD_SetTextColor\r
573 * Description    : Set the text color for LCD.\r
574 * Input          : - TextColor: BlackText: character on black, bottom on white.\r
575 *                               WhiteText: character on white, bottom on black.\r
576 * Output         : None\r
577 * Return         : None\r
578 *******************************************************************************/\r
579 void LCD_SetTextColor(TextColorMode_TypeDef TextColor)\r
580 {\r
581   if(TextColor)\r
582   {\r
583     /* Set White Text color */\r
584     TextMode=WhiteText;\r
585   }\r
586   else\r
587   {\r
588     /* Set Black Text color */\r
589     TextMode=BlackText;\r
590   }\r
591 }\r
592 \r
593 /*******************************************************************************\r
594 * Function Name  : LCD_Clear\r
595 * Description    : Clear the Master and Slave LCDs display.\r
596 * Input          : None\r
597 * Output         : None\r
598 * Return         : None\r
599 *******************************************************************************/\r
600 void LCD_Clear(void)\r
601 {\r
602   u8 Page = 0, Column = 0;      \r
603 \r
604   /* Clear master and slave LCDs page by page */\r
605   for (Page=0; Page<4; Page++)\r
606   {\r
607     /* Set master and slave page by page */\r
608     LCD_SetMasterPage(Page);\r
609     LCD_SetSlavePage(Page);\r
610     /* Set master and slave column address */\r
611     LCD_SetMasterColumn(0);\r
612     LCD_SetSlaveColumn(0);\r
613     /* Send empty data to master and slave column address on the selected page */\r
614     for (Column=0; Column<61; Column++)\r
615     {\r
616       LCD_SendSlaveData(0);\r
617       LCD_SendMasterData(0);\r
618     }\r
619   }\r
620 }\r
621         \r
622 /*******************************************************************************\r
623 * Function Name  : LCD_ClearLine\r
624 * Description    : Clear the selected line of the LCD.\r
625 * Input          : - Line: the Line to clear.\r
626 *                      - Line1 (Page0&1): clear the first line\r
627 *                      - Line2 (Page2&3): clear the second line\r
628 * Output         : None\r
629 * Return         : None\r
630 *******************************************************************************/\r
631 void LCD_ClearLine(u8 Line)\r
632 {\r
633   u8 Page = 0, Column = 0;      \r
634 \r
635   /* Clear the slected master and slave line */\r
636   for (Page=Line; Page<Line+2; Page++)\r
637   {\r
638     /* Set master and slave page by page */\r
639     LCD_SetMasterPage(Page);\r
640     LCD_SetSlavePage(Page);\r
641     /* Set master and slave column address */\r
642     LCD_SetMasterColumn(0);\r
643     LCD_SetSlaveColumn(0);\r
644     /* Send empty data to master and slave column address on the selected page */\r
645     for (Column=0; Column<61; Column++)\r
646     {\r
647       LCD_SendSlaveData(0);\r
648       LCD_SendMasterData(0);\r
649     }\r
650   }\r
651 }\r
652 \r
653 /*******************************************************************************\r
654 * Function Name  : LCD_ClearMaster\r
655 * Description    : Clear the master LCD.\r
656 * Input          : None\r
657 * Output         : None\r
658 * Return         : None\r
659 *******************************************************************************/\r
660 void LCD_ClearMaster(void)\r
661 {\r
662   u8 Page = 0, Column = 0;\r
663         \r
664   /* Clear all master LCD pages */\r
665   for (Page=0; Page<4; Page++)\r
666   {\r
667     /* Set master page by page */\r
668     LCD_SetMasterPage(Page);\r
669     /* Set master column address */\r
670     LCD_SetMasterColumn(0);\r
671     /* Send empty data to master column address on the selected page */\r
672     for (Column=0; Column<61; Column++)\r
673     {\r
674       LCD_SendMasterData(0);\r
675     }\r
676   }\r
677 }\r
678 \r
679 /*******************************************************************************\r
680 * Function Name  : LCD_ClearSlave\r
681 * Description    : Clear the slave LCD.\r
682 * Input          : None\r
683 * Output         : None\r
684 * Return         : None\r
685 *******************************************************************************/\r
686 void LCD_ClearSlave()\r
687 {\r
688   u8 Page = 0, Column = 0;      \r
689 \r
690   /* Clear all slave LCD pages */\r
691   for (Page=0; Page<4; Page++)\r
692   {\r
693     /* Set slave page by page */\r
694     LCD_SetSlavePage(Page);\r
695     /* Set slave column address */\r
696     LCD_SetSlaveColumn(0);\r
697     /* Send empty data to slave column address on the selected page */\r
698     for (Column=0; Column<61; Column++)\r
699     {\r
700       LCD_SendSlaveData(0);\r
701     }\r
702   }\r
703 }\r
704 \r
705 /*******************************************************************************\r
706 * Function Name  : LCD_DrawChar\r
707 * Description    : Draw a character in LCD.\r
708 *                  Note:\r
709 *                  the LCD can only display two line character,so page 0 and 1\r
710 *                  is to display the first line, page2 and page 3 is to display\r
711 *                  the second line.\r
712 * Input          : - Line: the Line where to display the character shape .\r
713 *                      - Line1 (Page0&1): display character on the first line\r
714 *                      - Line2 (Page2&3): display character on the second line\r
715 *                  - Column: start column address.\r
716 *                  - Width: the number of column (dots) of a character width.\r
717 *                  - Bmp: the pointer of the dot matrix data.\r
718 * Output         : None\r
719 * Return         : None\r
720 *******************************************************************************/\r
721 void LCD_DrawChar(u8 Line, u8 Column, u8 Width, u8 *Bmp)\r
722 {\r
723   u8 X = 0, ActualColumn = 0, Window = 0, i = 0;\r
724 \r
725   /* Draw the character column by column: width times */\r
726   for(X = Column; X<(Column+Width); X++)\r
727   {\r
728     if(X > 121)\r
729     {\r
730       /* Return if column exceeded 121 */\r
731       return;\r
732     }\r
733     if (X > 60)         \r
734     {\r
735       /* To be displayed on slave LCD (Window = 1) */\r
736       Window = 1;\r
737       /* Get the Slave relative start column */\r
738 //      ActualColumn = X%61;\r
739           ActualColumn = X - 61;\r
740     }\r
741     else\r
742     {   \r
743       /* To be displayed on master LCD (Window = 0) */\r
744       ActualColumn = X;\r
745     }\r
746 \r
747     /* Switch window, display the character upper part */\r
748     if (Window)\r
749     {\r
750       /* Display it on slave LCD */\r
751       LCD_SetSlavePage(Line);\r
752       LCD_SetSlaveColumn(ActualColumn);\r
753       LCD_SendSlaveData(Bmp[i]);\r
754     }\r
755     else\r
756     {\r
757       /* Display it on master LCD */\r
758       LCD_SetMasterPage(Line);\r
759       LCD_SetMasterColumn(ActualColumn);\r
760       LCD_SendMasterData(Bmp[i]);\r
761     }\r
762     /* Switch window, diplay the character lower part  */\r
763     if (Window)\r
764     {\r
765       /* Display it on slave LCD */\r
766       LCD_SetSlavePage(Line+1);\r
767       LCD_SetSlaveColumn(ActualColumn);\r
768       LCD_SendSlaveData(Bmp[i+1]);\r
769     }\r
770     else\r
771     {\r
772       /* Display it on master LCD */\r
773       LCD_SetMasterPage(Line+1);\r
774       LCD_SetMasterColumn(ActualColumn);\r
775       LCD_SendMasterData(Bmp[i+1]);\r
776     }\r
777     /* Increment by 2 the character table index */\r
778     i+=2;\r
779   }\r
780 }\r
781 \r
782 /*******************************************************************************\r
783 * Function Name  : LCD_DisplayChar\r
784 * Description    : Display one character (7dots large, 16dots high).\r
785 *                  Note:\r
786 *                  the LCD can only display two line character,so page 0 and 1\r
787 *                  is to display the first line, page2 and page 3 is to display\r
788 *                  the second line.\r
789 * Input          : - Line: the Line where to display the character.\r
790 *                      - Line1 (Page0&1): display character on the first line\r
791 *                      - Line2 (Page2&3): display character on the second line\r
792 *                  - Column: start column address.\r
793 *                  - Ascii: character ascii code.\r
794 *                  - CharMode: BlackText: character on black, bottom on white.\r
795 *                              WhiteText: character on white, bottom on black.\r
796 * Output         : None\r
797 * Return         : None\r
798 *******************************************************************************/\r
799 void LCD_DisplayChar(u8 Line, u8 Column, u8 Ascii, TextColorMode_TypeDef CharMode)\r
800 {\r
801   u8  DotBuffer[14], i = 0;\r
802 \r
803   /* Display the character lower and upper 8bit parts (2*7columns) */\r
804   for (i=0;i<14;i++)\r
805   {\r
806     /* Character displayed as white Text on black buttom  */\r
807     if(CharMode)\r
808     {\r
809           if( i & 0x01 )\r
810           {\r
811                 DotBuffer[i] = ~AsciiDotsTable[Ascii*14+i-1];   \r
812           }\r
813           else\r
814           {\r
815         DotBuffer[i] = ~AsciiDotsTable[Ascii*14+i+1];   \r
816           }\r
817     }\r
818     /* Character displayed as black Text on white buttom  */\r
819     else\r
820     {\r
821           if( ( u8 ) i & 0x01 )\r
822       {\r
823         DotBuffer[i] = AsciiDotsTable[Ascii*14+i-1];            \r
824       }\r
825       else\r
826       {\r
827         DotBuffer[i] = AsciiDotsTable[Ascii*14+i+1];                            \r
828       }\r
829     }\r
830   }\r
831   /* Display the asc code after conversion */\r
832   LCD_DrawChar(Line, Column, 7, DotBuffer);\r
833 }\r
834 \r
835 /*******************************************************************************\r
836 * Function Name  : LCD_HexToAsciiLow\r
837 * Description    : This function is used to convert the low nibble of an\r
838 *                  unsigned byte (0-F hex) to ASCII.\r
839 * Input          : - byte: byte to convert to ASCII.\r
840 * Output         : None\r
841 * Return         : ASCII value result of the conversion.\r
842 *******************************************************************************/\r
843 char LCD_HexToAsciiLow(u8 byte)\r
844 {\r
845   /* Keep lower nibble only */\r
846   byte = byte & 0x0F;\r
847   /* If the ascii is a number */        \r
848   if (byte <= 0x09)\r
849   {\r
850     /* Add 0x30 to its ascii */\r
851     return(byte + 0x30);\r
852   }\r
853   else\r
854   {\r
855     /* Add 0x37 to its ascii */\r
856     return (byte + 0x37);\r
857   }\r
858 }\r
859 \r
860 /*******************************************************************************\r
861 * Function Name  : LCD_HexToAsciiHigh\r
862 * Description    : This function is used to convert the high nibble of an\r
863 *                  unsigned byte (0-F hex) to ASCII.\r
864 * Input          : - byte: byte to convert to ASCII.\r
865 * Output         : None\r
866 * Return         : ASCII value result of the conversion.\r
867 *******************************************************************************/\r
868 char LCD_HexToAsciiHigh(u8 byte)\r
869 {\r
870   /* Keep upper nibble only */\r
871   byte = byte & 0xF0;   \r
872   byte = byte >> 4;\r
873   /* If the ascii is a number */\r
874   if (byte <= 0x09)\r
875   {\r
876     /* Add 0x30 to display its ascii */\r
877     return(byte + 0x30);\r
878   }\r
879   else\r
880   {\r
881     /* Add 0x37 to display its ascii */\r
882     return (byte + 0x37);\r
883   }\r
884 }\r
885 \r
886 /*******************************************************************************\r
887 * Function Name  : LCD_DisplayString\r
888 * Description    : This function is used to display a 17char max string of\r
889 *                  characters on the LCD display on the selected line.\r
890 *                  Note:\r
891 *                  this function is the user interface to use the LCD driver.\r
892 * Input          : - *ptr: pointer to string to display on LCD.\r
893 *                  - Line: the Line where to display the character.\r
894 *                      - Line1 (Page0&1): display character on the first line\r
895 *                      - Line2 (Page2&3): display character on the second line\r
896 * Output         : None\r
897 * Return         : None\r
898 *******************************************************************************/\r
899 void LCD_DisplayString(u8 Line, u8 *ptr, TextColorMode_TypeDef CharMode)\r
900 {\r
901   u8 RefColumn = 0, i = 0;\r
902 \r
903   /* Send the string character by character on lCD */\r
904   while ((*ptr!=0)&(i<17))\r
905   {\r
906         vTaskDelay( 1 );\r
907         \r
908         /* Display one character on LCD */\r
909     LCD_DisplayChar(Line, RefColumn, *ptr, CharMode);\r
910 \r
911     /* Increment the column position by 7 */\r
912     RefColumn+=7;\r
913     /* Point on the next character */\r
914     ptr++;\r
915     /* Increment the character counter */\r
916     i++;\r
917     /* If we reach the maximum Line character */\r
918     if(i==17)\r
919     {\r
920       LCD_DisplayChar(Line, RefColumn-1, 0x1f, CharMode); /* Add missed columns */\r
921     }\r
922   }\r
923 }\r
924 \r
925 /*******************************************************************************\r
926 * Function Name  : LCD_Printf\r
927 * Description    : This function is used to display a string of characters\r
928 *                  on the LCD display.\r
929 *                  Note:\r
930 *                  this function is the user interface to use the LCD driver.\r
931 * Input          : - *ptr: pointer to string to display on LCD.\r
932 * Output         : None\r
933 * Return         : None\r
934 *******************************************************************************/\r
935 void LCD_Printf(u8 *ptr, ...)\r
936 {\r
937   u8 RefColumn = 0, RefPage = 0, i = 0, c1 = 0;\r
938   u16  var = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0;\r
939   u32 WordVar = 0;\r
940 \r
941   /* Store pointer on LCD_Printf second parameter (String) */\r
942   u8 *var_ptr=(u8 *)(&ptr+1);\r
943 \r
944   /* Send String */\r
945   while (*ptr != 0)\r
946   {\r
947     c1 = *ptr;\r
948     /* Limited to AsciiDotsTable code table */\r
949     if(c1 <= 128)\r
950     {\r
951       /* Carriage return */\r
952       if ( *ptr == '\r')\r
953       {\r
954         ptr++;\r
955         RefColumn = 0;\r
956       }\r
957       /* Jump to Line2 */\r
958       else if( *ptr == '\n')\r
959       {\r
960         /* Point on the string to display */\r
961         ptr++;\r
962         /* Clear Line2 */\r
963         LCD_ClearLine(Line2);\r
964         /* Point on first Line2 column */\r
965         RefColumn = 0;\r
966         /* Increment RefPage by 2 */\r
967         RefPage+=2;\r
968       }\r
969       /* Display value on the passed format */\r
970       else if( *ptr == '%')\r
971       {\r
972         ptr++;\r
973         /* Display decimal value */\r
974         if (*ptr == 'd')\r
975         {\r
976           ptr++;\r
977           /* Get the word value to display */\r
978           WordVar = ((*var_ptr)|(*(var_ptr+1)<<8)|(*(var_ptr+2)<<16));\r
979           c1=WordVar/10000;\r
980           c2=(WordVar%10000)/1000;\r
981           c3=(WordVar%1000)/100;\r
982           c4=(WordVar%100)/10;\r
983           c5=(WordVar%10);\r
984           /* Display the ten miles digit */\r
985           if (c1!=0)\r
986           {\r
987             LCD_DisplayChar(RefPage, RefColumn, c1+0x30, TextMode);\r
988             RefColumn+=7;\r
989           }\r
990           /* Display the miles digit */\r
991           if (!((c1==0)&(c2==0)))\r
992           {\r
993           LCD_DisplayChar(RefPage, RefColumn, c2+0x30, TextMode);\r
994           RefColumn+=7;\r
995           }\r
996           /* Display the hundred digit */\r
997           if (!((c1==0)&(c2==0)&(c3==0)))\r
998           {\r
999           LCD_DisplayChar(RefPage, RefColumn, c3+0x30, TextMode);\r
1000           RefColumn+=7;\r
1001           }\r
1002           /* Display the tens digit */\r
1003           if (!((c1==0)&(c2==0)&(c3==0)&(c4==0)))\r
1004           {\r
1005           LCD_DisplayChar(RefPage, RefColumn, c4+0x30, TextMode);\r
1006           RefColumn+=7;\r
1007           }\r
1008           /* Display the rest */\r
1009           LCD_DisplayChar(RefPage, RefColumn, c5+0x30, TextMode);\r
1010           RefColumn+=7;\r
1011         }\r
1012         /* Display 16bits Hex value */\r
1013         else if (*ptr == 'x')\r
1014         {\r
1015           ptr++;\r
1016           /* Display 8bits MSB */\r
1017           var_ptr = var_ptr +1;\r
1018           var = *var_ptr;\r
1019           c1 = LCD_HexToAsciiHigh(var);\r
1020           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1021           RefColumn+=7;\r
1022           c1 = LCD_HexToAsciiLow(var);\r
1023           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1024           RefColumn+=7;\r
1025           /* Display 8bits LSB */\r
1026           var_ptr = var_ptr -1;\r
1027           var = *var_ptr;\r
1028           var_ptr = var_ptr +4;\r
1029           c1 = LCD_HexToAsciiHigh(var);\r
1030           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1031           RefColumn+=7;\r
1032           c1 = LCD_HexToAsciiLow(var);\r
1033           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1034           RefColumn+=7;\r
1035         }\r
1036         /* Display 32bits Hex value */\r
1037         else if (*ptr == 'w')\r
1038         {\r
1039           ptr++;\r
1040           /* Display 16bits MSB */\r
1041           var_ptr = var_ptr +3;\r
1042           var = *var_ptr;\r
1043           c1 = LCD_HexToAsciiHigh(var);\r
1044           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1045           RefColumn+=7;\r
1046           c1 = LCD_HexToAsciiLow(var);\r
1047           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1048           RefColumn+=7;\r
1049           var_ptr = var_ptr -1;\r
1050           var = *var_ptr;\r
1051           c1 = LCD_HexToAsciiHigh(var);\r
1052           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1053           RefColumn+=7;\r
1054           c1 = LCD_HexToAsciiLow(var);\r
1055           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1056           RefColumn+=7;\r
1057           /* Display 16bits LSB */\r
1058           var_ptr = var_ptr -1;\r
1059           var = *var_ptr;\r
1060           var_ptr = var_ptr +4;\r
1061           c1 = LCD_HexToAsciiHigh(var);\r
1062           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1063           RefColumn+=7;\r
1064           c1 = LCD_HexToAsciiLow(var);\r
1065           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1066           RefColumn+=7;\r
1067           var_ptr = var_ptr -5;\r
1068           var = *var_ptr;\r
1069           var_ptr = var_ptr +4;\r
1070           c1 = LCD_HexToAsciiHigh(var);\r
1071           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1072           RefColumn+=7;\r
1073           c1 = LCD_HexToAsciiLow(var);\r
1074           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1075           RefColumn+=7;\r
1076         }\r
1077         else\r
1078         {\r
1079           /* Display '%' character which is followed by (d, x or w) */\r
1080           ptr--;\r
1081           c1 = *ptr;\r
1082           LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1083           RefColumn+=7;\r
1084           ptr++;\r
1085           i++;\r
1086           if(i==17)\r
1087           {\r
1088             /* Add missed columns */\r
1089             LCD_DisplayChar(RefPage, RefColumn-1, 0x1f, TextMode);\r
1090             RefColumn = 0;\r
1091             RefPage+=2;\r
1092           }\r
1093         }\r
1094       }\r
1095       else\r
1096       { \r
1097         /* Display characters different from (\r, \n, %) */                     \r
1098         LCD_DisplayChar(RefPage, RefColumn, c1, TextMode);\r
1099         RefColumn+=7;\r
1100         ptr++;\r
1101         i++;\r
1102         if(i==17)\r
1103         {\r
1104           /* Add missed columns */\r
1105           LCD_DisplayChar(RefPage, RefColumn-1, 0x1f, TextMode);\r
1106           LCD_ClearLine(Line2);\r
1107           RefColumn = 0;\r
1108           RefPage+=2;\r
1109         }\r
1110       }\r
1111     }\r
1112   }\r
1113   /* Display spaces if string doesn't reach the max LCD characters size */\r
1114   while(RefColumn<119)\r
1115   {\r
1116     /* Display Spaces */\r
1117     LCD_DisplayChar(RefPage, RefColumn, 0x20, TextMode);\r
1118     RefColumn+=7;\r
1119     /* Add missed columns */\r
1120     LCD_DisplayChar(RefPage, RefColumn, 0x1f, TextMode);\r
1121   }\r
1122 }\r
1123 \r
1124 /*******************************************************************************\r
1125 * Function Name  : LCD_DrawMasterGraphic\r
1126 * Description    : Draw a Graphic image on master LCD.\r
1127 * Input          : - Bmp: the pointer of the dot matrix data.\r
1128 * Output         : None\r
1129 * Return         : None.\r
1130 *******************************************************************************/\r
1131 void LCD_DrawMasterGraphic(u8 *Bmp)\r
1132 {\r
1133   u8 j = 0, k = 0, ActPage = 0;\r
1134 \r
1135   /* Draw graphic on master: 61 Column *4 Pages */\r
1136   while(j<244)\r
1137   {\r
1138     /* Draw on master page by page */\r
1139     LCD_SetMasterPage(ActPage);\r
1140     for(k=0; k<61; k++)\r
1141     {\r
1142       LCD_SetMasterColumn(k);\r
1143       LCD_SendMasterData(*Bmp++);\r
1144       j++;\r
1145     }\r
1146     ActPage++;\r
1147   }\r
1148 }\r
1149 \r
1150 /*******************************************************************************\r
1151 * Function Name  : LCD_DrawSlaveGraphic\r
1152 * Description    : Draw a Graphic image on slave LCD.\r
1153 * Input          : - Bmp: the pointer of the dot matrix data.\r
1154 * Output         : None\r
1155 * Return         : None.\r
1156 *******************************************************************************/\r
1157 void LCD_DrawSlaveGraphic(u8 *Bmp)\r
1158 {\r
1159   u8 j = 0, k = 0, ActPage = 0;\r
1160 \r
1161   /* Draw graphic on slave: 61 Column *4 Pages */\r
1162   while(j<244)\r
1163   {\r
1164     /* Draw on slave page by page */\r
1165     LCD_SetSlavePage(ActPage);\r
1166     for(k=0; k<61; k++)\r
1167     {\r
1168       LCD_SetSlaveColumn(k);\r
1169       LCD_SendSlaveData(*Bmp++);\r
1170       j++;\r
1171     }\r
1172     ActPage++;\r
1173   }\r
1174 }\r
1175 \r
1176 /*******************************************************************************\r
1177 * Function Name  : LCD_DrawGraphic\r
1178 * Description    : Draw a Graphic image on LCD.\r
1179 * Input          : - Bmp: the pointer of the dot matrix data.\r
1180 * Output         : None\r
1181 * Return         : None.\r
1182 *******************************************************************************/\r
1183 void LCD_DrawGraphic(u8 *Bmp)\r
1184 {\r
1185   u8 Pos = 0, ActPage = 0;\r
1186   u16 j = 0, k = 0;\r
1187 \r
1188   /* Draw graphic on LCD: 122 Column *4 Pages */\r
1189   while(j<488)\r
1190   {\r
1191     if(!Pos)\r
1192     {\r
1193       /* Draw on master page by page */\r
1194       LCD_SetMasterPage(ActPage);\r
1195       for(k=0; k<61; k++)\r
1196       {\r
1197         LCD_SetMasterColumn(k);\r
1198         LCD_SendMasterData(*Bmp++);\r
1199         j++;\r
1200       }\r
1201       Pos=1;\r
1202     }\r
1203     else\r
1204     {\r
1205       /* Draw on slave page by page */\r
1206       LCD_SetSlavePage(ActPage);\r
1207       for(k=0; k<61; k++)\r
1208       {\r
1209         LCD_SetSlaveColumn(k);\r
1210         LCD_SendSlaveData(*Bmp++);\r
1211         j++;\r
1212       }\r
1213       ActPage++;\r
1214       Pos=0;\r
1215     }\r
1216   }\r
1217 }\r
1218 \r
1219 /*******************************************************************************\r
1220 * Function Name  : LCD_ScrollGraphic\r
1221 * Description    : Scroll a Graphic image on LCD.\r
1222 * Input          : - Bmp: the pointer of the dot matrix data.\r
1223 *                  - nCount: specifies the delay time length.\r
1224 * Output         : None\r
1225 * Return         : None.\r
1226 *******************************************************************************/\r
1227 void LCD_ScrollGraphic(u8 *Bmp, u32 nCount)\r
1228 {\r
1229   u8 Pos = 0, ActPage = 0;\r
1230   u16 j = 0, k = 0;\r
1231   u32 Counter = 0;\r
1232 \r
1233   /* Draw graphic on LCD: 122 Column *4 Pages */\r
1234   while(j<488)\r
1235   {\r
1236     if(!Pos)\r
1237     {\r
1238       /* Draw on master page by page */\r
1239       LCD_SetMasterPage(ActPage);\r
1240       for(k=0; k<61; k++)\r
1241       {\r
1242         LCD_SetMasterColumn(k);\r
1243         LCD_SendMasterData(*Bmp++);\r
1244         Counter = nCount;\r
1245         /* Set a delay */\r
1246         for(; Counter != 0; Counter--);\r
1247         j++;\r
1248       }\r
1249       Pos=1;\r
1250     }\r
1251     else\r
1252     {\r
1253       /* Draw on slave page by page */\r
1254       LCD_SetSlavePage(ActPage);\r
1255       for(k=0; k<61; k++)\r
1256       {\r
1257         LCD_SetSlaveColumn(k);\r
1258         Counter = nCount;\r
1259         /* Set a delay */\r
1260         for(; Counter != 0; Counter--);\r
1261         LCD_SendSlaveData(*Bmp++);\r
1262         j++;\r
1263       }\r
1264       ActPage++;\r
1265       Pos=0;\r
1266     }\r
1267   }\r
1268 }\r
1269 \r
1270 /*******************************************************************************\r
1271 * Function Name  : LCD_DrawPixel\r
1272 * Description    : Draw a Graphic image on slave LCD.\r
1273 * Input          : - XPos: the dot line number of the pixel.\r
1274 *                      - 1->61 : displayed on master LCD\r
1275 *                      - 62->122: displayed on slave LCD\r
1276 *                  - YPos: column address of the pixel from 1->32.\r
1277 *                  - Mode: Dot_On: Pixel turned on (black).\r
1278 *                          Dot_Off: Pixel turned off (black).\r
1279 * Output         : None\r
1280 * Return         : None.\r
1281 *******************************************************************************/\r
1282 void LCD_DrawPixel(u8 XPos, u8 YPos, DotMode_TypeDef Mode)\r
1283 {\r
1284   u8 Page = 0, Position = 0;\r
1285   u16 Mask = 0;\r
1286   u32 MasterDataIn = 0, MasterDataOut = 0, SlaveDataIn = 0, SlaveDataOut = 0;\r
1287 \r
1288   /* Pixel page */\r
1289   Page = (XPos-1)/8;\r
1290   /* Pixel column  */\r
1291   Position = (YPos-1)/61; /* 0:Master, 1:Slave */\r
1292   /* Mask for the pixel */\r
1293   Mask= 1<<((XPos-1)%8);\r
1294   /* If Position=0 draw pixel on master LCD */\r
1295   if(!Position)\r
1296   {\r
1297     LCD_SetMasterPage(Page);\r
1298     LCD_SetMasterColumn(YPos-1);\r
1299     MasterDataIn = LCD_ReadMasterData();\r
1300     MasterDataIn = LCD_ReadMasterData();\r
1301     LCD_SetMasterColumn(YPos-1);\r
1302     if(Mode==Dot_On)\r
1303     {\r
1304       MasterDataOut = MasterDataIn | Mask;\r
1305     }\r
1306     else\r
1307     {\r
1308       MasterDataOut = MasterDataIn & (~Mask);\r
1309     }\r
1310     LCD_SendMasterData(MasterDataOut);\r
1311   }\r
1312   /* If Position=1 draw pixel on slave LCD */\r
1313   else\r
1314   {\r
1315     LCD_SetSlavePage(Page);\r
1316     LCD_SetSlaveColumn(YPos-62);\r
1317     SlaveDataIn = LCD_ReadSlaveData();\r
1318     SlaveDataIn = LCD_ReadSlaveData();\r
1319     LCD_SetSlaveColumn(YPos-62);\r
1320     if(Mode==Dot_On)\r
1321     {\r
1322       SlaveDataOut = SlaveDataIn | Mask;\r
1323     }\r
1324     else\r
1325     {\r
1326       SlaveDataOut = SlaveDataIn & (~Mask);\r
1327     }\r
1328     LCD_SendSlaveData(SlaveDataOut);\r
1329   }\r
1330 }\r
1331 \r
1332 /*******************************************************************************\r
1333 * Function Name  : LCD_DrawLine\r
1334 * Description    : Draw a line on master and slave LCDs.\r
1335 * Input          : - XPos1: the dot line number of the source point .\r
1336 *                  - XPos2: the dot line number of the destination point .\r
1337 *                  - YPos1: the dot column number of the source point.\r
1338 *                  - YPos2: the dot column number of the destination point.\r
1339 * Output         : None\r
1340 * Return         : None.\r
1341 *******************************************************************************/\r
1342 void LCD_DrawLine(u8 XPos1, u8 YPos1, u8 XPos2, u8 YPos2)\r
1343 {\r
1344   u8 XPos = 0, YPos = 0;\r
1345 \r
1346   /* Use XPos1, YPos1, XPos2 and YPos2 */\r
1347   if((XPos2>=XPos1)&(YPos2>=YPos1))\r
1348   {\r
1349     for(XPos=XPos1; XPos<=XPos2; XPos++)\r
1350     {\r
1351       for(YPos=YPos1; YPos<=YPos2; YPos++)\r
1352       {\r
1353         LCD_DrawPixel(XPos, YPos, Dot_On);\r
1354       }\r
1355     }\r
1356   }\r
1357   else if((XPos2<XPos1)&(YPos2>=YPos1))\r
1358   {\r
1359     for(XPos=XPos2; XPos<=XPos1; XPos++)\r
1360     {\r
1361       for(YPos=YPos1; YPos<=YPos2; YPos++)\r
1362       {\r
1363         LCD_DrawPixel(XPos, YPos, Dot_On);\r
1364       }\r
1365     }\r
1366   }\r
1367   else if((XPos2>=XPos1)&(YPos2<YPos1))\r
1368   {\r
1369     for(XPos=XPos1; XPos<=XPos2; XPos++)\r
1370     {\r
1371       for(YPos=YPos2; YPos<=YPos1; YPos++)\r
1372       {\r
1373         LCD_DrawPixel(XPos, YPos, Dot_On);\r
1374       }\r
1375     }\r
1376   }\r
1377   else /*if((XPos2<XPos1)&(YPos2<YPos1))*/\r
1378   {\r
1379     for(XPos=XPos2; XPos<=XPos1; XPos++)\r
1380     {\r
1381       for(YPos=YPos2; YPos<=YPos1; YPos++)\r
1382       {\r
1383         LCD_DrawPixel(XPos, YPos, Dot_On);\r
1384       }\r
1385     }\r
1386   }\r
1387 }\r
1388 \r
1389 /*******************************************************************************\r
1390 * Function Name  : LCD_DrawBox\r
1391 * Description    : Draw a Box on master and slave LCDs.\r
1392 * Input          : - XPos: the dot line number of the source point .\r
1393 *                  - YPos: the dot column number of the source point.\r
1394 *                  - Dx: Box large.\r
1395 *                  - Dy: Box width.\r
1396 * Output         : None\r
1397 * Return         : None.\r
1398 *******************************************************************************/\r
1399 void LCD_DrawBox(u8 XPos, u8 YPos, u8 Dx, u8 Dy)\r
1400 {\r
1401   /* Use XPos, YPos, Dx and Dy */\r
1402   LCD_DrawLine(XPos, YPos, XPos, YPos+Dy);\r
1403   LCD_DrawLine(XPos, YPos, XPos+Dx, YPos);\r
1404   LCD_DrawLine(XPos+Dx, YPos, XPos+Dx, YPos+Dy);\r
1405   LCD_DrawLine(XPos, YPos+Dy, XPos+Dx, YPos+Dy);\r
1406 }\r
1407 \r
1408 /******************* (C) COPYRIGHT 2006 STMicroelectronics *****END OF FILE******/\r
1409 \r