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