]> git.sur5r.net Git - freertos/blob - Demo/ARM7_LPC2368_Rowley/LCD/portlcd.c
Add printf-stdarg.c to the new MicroBlaze demo.
[freertos] / Demo / ARM7_LPC2368_Rowley / LCD / portlcd.c
1 /*****************************************************************************\r
2  *\r
3  * Project          : lwIP Web\r
4  * Subproject       : \r
5  * Name             : portlcd.c\r
6  * Function         : Routines for LCD\r
7  * Designer         : K. Sterckx\r
8  * Creation date    : 22/01/2007\r
9  * Compiler         : GNU ARM\r
10  * Processor        : LPC2368\r
11  * Last update      :\r
12  * Last updated by  :\r
13  * History          : \r
14  *  based on example code from NXP\r
15  *\r
16  ************************************************************************\r
17  *\r
18  *  This code is used to place text on the LCD.\r
19  *\r
20  ************************************************************************/\r
21 \r
22 #include <targets/LPC2368.h>\r
23 #include "portlcd.h"\r
24 #include "FreeRTOS.h"\r
25 #include "task.h"\r
26 \r
27 /* Please note, on old MCB2300 board, the LCD_E bit is p1.30, on the new board\r
28 it's p1.31, please check the schematic carefully, and change LCD_CTRL and LCD_E \r
29 accordingly if you have a different board. */\r
30 \r
31 /* LCD IO definitions */\r
32 #define LCD_E     0x80000000            /* Enable control pin                */\r
33 #define LCD_RW    0x20000000            /* Read/Write control pin            */\r
34 #define LCD_RS    0x10000000            /* Data/Instruction control          */\r
35 #define LCD_CTRL  0xB0000000            /* Control lines mask                */\r
36 #define LCD_DATA  0x0F000000            /* Data lines mask                   */\r
37 \r
38 /* Local variables */\r
39 static unsigned int lcd_ptr;\r
40 \r
41 /* 8 user defined characters to be loaded into CGRAM (used for bargraph) */\r
42 static const unsigned char UserFont[8][8] = {\r
43         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },\r
44         { 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },\r
45         { 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 },\r
46         { 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C },\r
47         { 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },\r
48         { 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F },\r
49         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },\r
50         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }\r
51 };\r
52 \r
53 /* Local Function Prototypes */\r
54 static void     lcd_write( unsigned int c );\r
55 static void     lcd_write_4bit( unsigned int c );\r
56 static unsigned int lcd_read_stat( void );\r
57 static void     lcd_write_cmd( unsigned int c );\r
58 static void     lcd_write_data( unsigned int d );\r
59 static void     lcd_wait_busy( void );\r
60 \r
61 \r
62 /******************************************************************************\r
63 ** Function name:  lcd_write_4bit\r
64 **\r
65 ** Descriptions:\r
66 **\r
67 ** parameters:     four bits to write\r
68 ** Returned value: None\r
69 ** \r
70 ******************************************************************************/\r
71 static void lcd_write_4bit(unsigned int c)\r
72 {\r
73         /* Write a 4-bit command to LCD controller. */\r
74         FIO1DIR |= LCD_DATA | LCD_CTRL;\r
75         FIO1CLR  = LCD_RW   | LCD_DATA;\r
76         FIO1SET  = (c & 0xF) << 24;\r
77         FIO1SET  = LCD_E;\r
78         vTaskDelay(0);\r
79         FIO1CLR  = LCD_E;\r
80         vTaskDelay(0);\r
81         return;\r
82 }\r
83 \r
84 /******************************************************************************\r
85 ** Function name: lcd_write\r
86 **\r
87 ** Descriptions:\r
88 **\r
89 ** parameters:     word to write\r
90 ** Returned value: None\r
91 ** \r
92 ******************************************************************************/\r
93 static void lcd_write(unsigned int c)\r
94 {\r
95         /* Write data/command to LCD controller. */\r
96         lcd_write_4bit (c >> 4);\r
97         lcd_write_4bit (c);\r
98         return;\r
99 }\r
100 \r
101 /******************************************************************************\r
102 ** Function name: lcd_read_stat\r
103 **\r
104 ** Descriptions:\r
105 **\r
106 ** parameters:     None\r
107 ** Returned value: status\r
108 ** \r
109 ******************************************************************************/\r
110 static unsigned int lcd_read_stat(void)\r
111 {\r
112         /* Read status of LCD controller (ST7066) */\r
113         unsigned int stat;\r
114 \r
115         FIO1DIR &= ~LCD_DATA;\r
116         FIO1CLR  = LCD_RS;\r
117         FIO1SET  = LCD_RW;\r
118         vTaskDelay( 0 );\r
119         FIO1SET  = LCD_E;\r
120         vTaskDelay( 0 );\r
121         stat    = (FIO1PIN >> 20) & 0xF0;\r
122         FIO1CLR  = LCD_E;\r
123         vTaskDelay( 0 );\r
124         FIO1SET  = LCD_E;\r
125         vTaskDelay( 0 );\r
126         stat   |= (FIO1PIN >> 24) & 0xF;\r
127         FIO1CLR  = LCD_E;\r
128         return (stat);\r
129 }\r
130 \r
131 /******************************************************************************\r
132 ** Function name: lcd_wait_busy\r
133 **\r
134 ** Descriptions:\r
135 **\r
136 ** parameters:     None\r
137 ** Returned value: None\r
138 ** \r
139 ******************************************************************************/\r
140 static void lcd_wait_busy(void)\r
141 {\r
142         /* Wait until LCD controller (ST7066) is busy. */\r
143         unsigned int stat;\r
144 \r
145         do\r
146         {\r
147                 stat = lcd_read_stat();\r
148         }\r
149         while (stat & 0x80); /* Wait for busy flag */\r
150 \r
151         return;\r
152 }\r
153 \r
154 /******************************************************************************\r
155 ** Function name: lcd_write_cmd\r
156 **\r
157 ** Descriptions:\r
158 **\r
159 ** parameters:     command word\r
160 ** Returned value: None\r
161 ** \r
162 ******************************************************************************/\r
163 static void lcd_write_cmd(unsigned int c)\r
164 {\r
165         /* Write command to LCD controller. */\r
166         lcd_wait_busy();\r
167         FIO1CLR = LCD_RS;\r
168         lcd_write(c);\r
169         return;\r
170 }\r
171 \r
172 /******************************************************************************\r
173 ** Function name: lcd_write_data\r
174 **\r
175 ** Descriptions:\r
176 **\r
177 ** parameters:     data word\r
178 ** Returned value: None\r
179 ** \r
180 ******************************************************************************/\r
181 static void lcd_write_data(unsigned int d)\r
182 {\r
183         /* Write data to LCD controller. */\r
184         lcd_wait_busy();\r
185         FIO1SET = LCD_RS;\r
186         lcd_write(d);\r
187         return;\r
188 }\r
189 \r
190 /******************************************************************************\r
191 ** Function name: LCD_init\r
192 **\r
193 ** Descriptions:\r
194 **\r
195 ** parameters:     None\r
196 ** Returned value: None\r
197 ** \r
198 ******************************************************************************/\r
199 void LCD_init(void)\r
200 {\r
201         /* Initialize the ST7066 LCD controller to 4-bit mode. */\r
202         PINSEL3 = 0x00000000;\r
203 #if USE_FIO\r
204         SCS |= 0x00000001;/* set GPIOx to use Fast I/O */\r
205 #endif\r
206         FIO1DIR |= LCD_CTRL | LCD_DATA;\r
207         FIO1CLR  = LCD_RW   | LCD_RS   | LCD_DATA;\r
208 \r
209         lcd_write_4bit(0x3);                /* Select 4-bit interface            */\r
210         vTaskDelay(100);\r
211         lcd_write_4bit(0x3);\r
212         vTaskDelay(100);\r
213         lcd_write_4bit(0x3);\r
214         lcd_write_4bit(0x2);\r
215 \r
216         lcd_write_cmd(0x28);                /* 2 lines, 5x8 character matrix     */\r
217         lcd_write_cmd(0x0e);                /* Display ctrl:Disp/Curs/Blnk=ON    */\r
218         lcd_write_cmd(0x06);                /* Entry mode: Move right, no shift  */\r
219 \r
220         LCD_load( (unsigned char *)&UserFont, sizeof (UserFont) );\r
221         LCD_cls();\r
222         return;\r
223 }\r
224 \r
225 /******************************************************************************\r
226 ** Function name: LCD_load\r
227 **\r
228 ** Descriptions:\r
229 **\r
230 ** parameters:     pointer to the buffer and counter\r
231 ** Returned value: None\r
232 ** \r
233 ******************************************************************************/\r
234 void LCD_load(unsigned char *fp, unsigned int cnt)\r
235 {\r
236         /* Load user-specific characters into CGRAM */\r
237         unsigned int i;\r
238 \r
239         lcd_write_cmd( 0x40 );                /* Set CGRAM address counter to 0    */\r
240         for (i = 0; i < cnt; i++, fp++)  \r
241         {\r
242                 lcd_write_data( *fp );\r
243         }\r
244         return;\r
245 }\r
246 \r
247 /******************************************************************************\r
248 ** Function name: LCD_gotoxy\r
249 **\r
250 ** Descriptions:\r
251 **\r
252 ** parameters:     pixel X and Y\r
253 ** Returned value: None\r
254 ** \r
255 ******************************************************************************/\r
256 void LCD_gotoxy(unsigned int x, unsigned int y)\r
257 {\r
258         /* Set cursor position on LCD display. Left corner: 1,1, right: 16,2 */\r
259         unsigned int c;\r
260 \r
261         c = --x;\r
262         if (--y) \r
263         {\r
264                 c |= 0x40;\r
265         }\r
266         lcd_write_cmd (c | 0x80);\r
267         lcd_ptr = y*16 + x;\r
268         return;\r
269 }\r
270 \r
271 /******************************************************************************\r
272 ** Function name: LCD_cls\r
273 **\r
274 ** Descriptions:\r
275 **\r
276 ** parameters:     None\r
277 ** Returned value: None\r
278 ** \r
279 ******************************************************************************/\r
280 void LCD_cls(void)\r
281 {\r
282         /* Clear LCD display, move cursor to home position. */\r
283         lcd_write_cmd (0x01);\r
284         LCD_gotoxy (1,1);\r
285         return;\r
286 }\r
287 \r
288 /******************************************************************************\r
289 ** Function name: LCD_cur_off\r
290 **\r
291 ** Descriptions:\r
292 **\r
293 ** parameters:     None\r
294 ** Returned value: None\r
295 ** \r
296 ******************************************************************************/\r
297 void LCD_cur_off(void)\r
298 {\r
299         /* Switch off LCD cursor. */\r
300         lcd_write_cmd(0x0c);\r
301         return;\r
302 }\r
303 \r
304 \r
305 /******************************************************************************\r
306 ** Function name: LCD_on\r
307 **\r
308 ** Descriptions:\r
309 **\r
310 ** parameters:     None\r
311 ** Returned value: None\r
312 ** \r
313 ******************************************************************************/\r
314 void LCD_on(void)\r
315 {\r
316         /* Switch on LCD and enable cursor. */\r
317         lcd_write_cmd (0x0e);\r
318         return;\r
319 }\r
320 \r
321 /******************************************************************************\r
322 ** Function name: LCD_putc\r
323 **\r
324 ** Descriptions:\r
325 **\r
326 ** parameters:     unsigned char character\r
327 ** Returned value: None\r
328 ** \r
329 ******************************************************************************/\r
330 void LCD_putc(unsigned char c)\r
331\r
332         /* Print a character to LCD at current cursor position. */\r
333         if (lcd_ptr == 16) \r
334         {\r
335                 lcd_write_cmd (0xc0);\r
336         }\r
337         lcd_write_data(c);\r
338         lcd_ptr++;\r
339         return;\r
340 }\r
341 \r
342 /******************************************************************************\r
343 ** Function name: LCD_puts\r
344 **\r
345 ** Descriptions:\r
346 **\r
347 ** parameters:     pointer to the buffer\r
348 ** Returned value: None\r
349 ** \r
350 ******************************************************************************/\r
351 void LCD_puts(unsigned char *sp)\r
352 {\r
353         /* Print a string to LCD display. */\r
354         while (*sp) \r
355         {\r
356                 LCD_putc (*sp++);\r
357         }\r
358         return;\r
359 }\r
360 \r
361 /******************************************************************************\r
362 ** Function name: LCD_bargraph\r
363 **\r
364 ** Descriptions:\r
365 **\r
366 ** parameters:     value and size\r
367 ** Returned value: None\r
368 ** \r
369 ******************************************************************************/\r
370 void LCD_bargraph(unsigned int val, unsigned int size)\r
371 {\r
372         /* Print a bargraph to LCD display.  */\r
373         /* - val:  value 0..100 %            */\r
374         /* - size: size of bargraph 1..16    */\r
375         unsigned int i;\r
376 \r
377         val = val * size / 20;               /* Display matrix 5 x 8 pixels       */\r
378         for (i = 0; i < size; i++) \r
379         {\r
380                 if (val > 5) \r
381                 {\r
382                         LCD_putc(5);\r
383                         val -= 5;\r
384                 }\r
385                 else\r
386                 {\r
387                         LCD_putc(val);\r
388                         break;\r
389                 }\r
390         }\r
391         return;\r
392 }\r