]> git.sur5r.net Git - freertos/blob - Demo/PIC24_MPLAB/lcd.c
Update version numbers to V4.8.0
[freertos] / Demo / PIC24_MPLAB / lcd.c
1 /*\r
2         FreeRTOS.org V4.8.0 - Copyright (C) 2003-2008 Richard Barry.\r
3 \r
4         This file is part of the FreeRTOS.org distribution.\r
5 \r
6         FreeRTOS.org is free software; you can redistribute it and/or modify\r
7         it under the terms of the GNU General Public License as published by\r
8         the Free Software Foundation; either version 2 of the License, or\r
9         (at your option) any later version.\r
10 \r
11         FreeRTOS.org is distributed in the hope that it will be useful,\r
12         but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14         GNU General Public License for more details.\r
15 \r
16         You should have received a copy of the GNU General Public License\r
17         along with FreeRTOS.org; if not, write to the Free Software\r
18         Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19 \r
20         A special exception to the GPL can be applied should you wish to distribute\r
21         a combined work that includes FreeRTOS.org, without being obliged to provide\r
22         the source code for any proprietary components.  See the licensing section \r
23         of http://www.FreeRTOS.org for full details of how and when the exception\r
24         can be applied.\r
25 \r
26         ***************************************************************************\r
27         ***************************************************************************\r
28         *                                                                                                                                                 *\r
29         * SAVE TIME AND MONEY!  Why not get us to quote to get FreeRTOS.org               *\r
30         * running on your hardware - or even write all or part of your application*\r
31         * for you?  See http://www.OpenRTOS.com for details.                                      *\r
32         *                                                                                                                                                 *\r
33         ***************************************************************************\r
34         ***************************************************************************\r
35 \r
36         Please ensure to read the configuration and relevant port sections of the\r
37         online documentation.\r
38 \r
39         http://www.FreeRTOS.org - Documentation, latest information, license and \r
40         contact details.\r
41 \r
42         http://www.SafeRTOS.com - A version that is certified for use in safety \r
43         critical systems.\r
44 \r
45         http://www.OpenRTOS.com - Commercial support, development, porting, \r
46         licensing and training services.\r
47 */\r
48 \r
49 /* Scheduler includes. */\r
50 #include "FreeRTOS.h"\r
51 #include "task.h"\r
52 #include "queue.h"\r
53 \r
54 /* Demo includes. */\r
55 #include "lcd.h"\r
56 \r
57 /*\r
58  * The LCD is written to by more than one task so is controlled by this\r
59  * 'gatekeeper' task.  This is the only task that is actually permitted to\r
60  * access the LCD directly.  Other tasks wanting to display a message send\r
61  * the message to the gatekeeper.\r
62  */\r
63 static void vLCDTask( void *pvParameters );\r
64 \r
65 /*\r
66  * Setup the peripherals required to communicate with the LCD.\r
67  */\r
68 static void prvSetupLCD( void );\r
69 \r
70 /* \r
71  * Move to the first (0) or second (1) row of the LCD. \r
72  */\r
73 static void prvLCDGotoRow( unsigned portSHORT usRow );\r
74 \r
75 /* \r
76  * Write a string of text to the LCD. \r
77  */\r
78 static void prvLCDPutString( portCHAR *pcString );\r
79 \r
80 /* \r
81  * Clear the LCD. \r
82  */\r
83 static void prvLCDClear( void );\r
84 \r
85 /*-----------------------------------------------------------*/\r
86 \r
87 /* Brief delay to permit the LCD to catch up with commands. */\r
88 #define lcdSHORT_DELAY          3\r
89 \r
90 /* SFR that seems to be missing from the standard header files. */\r
91 #define PMAEN                           *( ( unsigned short * ) 0x60c )\r
92 \r
93 /* LCD commands. */\r
94 #define lcdDEFAULT_FUNCTION     0x3c\r
95 #define lcdDISPLAY_CONTROL      0x0c\r
96 #define lcdCLEAR_DISPLAY        0x01\r
97 #define lcdENTRY_MODE           0x06\r
98 \r
99 /* The length of the queue used to send messages to the LCD gatekeeper task. */\r
100 #define lcdQUEUE_SIZE           3\r
101 /*-----------------------------------------------------------*/\r
102 \r
103 /* The queue used to send messages to the LCD task. */\r
104 xQueueHandle xLCDQueue;\r
105 \r
106 \r
107 /*-----------------------------------------------------------*/\r
108 \r
109 xQueueHandle xStartLCDTask( void )\r
110 {\r
111         /* Create the queue used by the LCD task.  Messages for display on the LCD\r
112         are received via this queue. */\r
113         xLCDQueue = xQueueCreate( lcdQUEUE_SIZE, sizeof( xLCDMessage ) );\r
114 \r
115         /* Start the task that will write to the LCD.  The LCD hardware is\r
116         initialised from within the task itself so delays can be used. */\r
117         xTaskCreate( vLCDTask, ( signed portCHAR * ) "LCD", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL );\r
118 \r
119         return xLCDQueue;\r
120 }\r
121 /*-----------------------------------------------------------*/\r
122 \r
123 static void prvLCDGotoRow( unsigned portSHORT usRow )\r
124 {\r
125         if( usRow == 0 )\r
126         {\r
127                 PMADDR = 0x0000;\r
128                 PMDIN1 = 0x02;\r
129         }\r
130         else\r
131         {\r
132                 PMADDR = 0x0000;\r
133                 PMDIN1 = 0xc0;\r
134         }\r
135 \r
136         vTaskDelay( lcdSHORT_DELAY );\r
137 }\r
138 /*-----------------------------------------------------------*/\r
139 \r
140 static void prvLCDPutString( portCHAR *pcString )\r
141 {\r
142         /* Write out each character with appropriate delay between each. */\r
143         while( *pcString )\r
144         {\r
145                 PMADDR = 0x0001;\r
146                 PMDIN1 = *pcString;\r
147                 pcString++;\r
148                 vTaskDelay( lcdSHORT_DELAY );\r
149         }\r
150 }\r
151 /*-----------------------------------------------------------*/\r
152 \r
153 static void prvLCDClear( void )\r
154 {\r
155         /* Clear the display. */\r
156         PMADDR = 0x0000;\r
157         PMDIN1 = lcdCLEAR_DISPLAY;\r
158         vTaskDelay( lcdSHORT_DELAY );   \r
159 }\r
160 /*-----------------------------------------------------------*/\r
161 \r
162 static void prvSetupLCD( void )\r
163 {\r
164         /* Setup the PMP. */\r
165         PMCON = 0x83BF;\r
166         PMMODE = 0x3FF;\r
167         PMAEN = 1;\r
168         PMADDR = 0x0000;\r
169         vTaskDelay( lcdSHORT_DELAY );\r
170 \r
171         /* Set the default function. */\r
172         PMDIN1 = lcdDEFAULT_FUNCTION;\r
173         vTaskDelay( lcdSHORT_DELAY );\r
174 \r
175         /* Set the display control. */\r
176         PMDIN1 = lcdDISPLAY_CONTROL;\r
177         vTaskDelay( lcdSHORT_DELAY );\r
178 \r
179         /* Clear the display. */\r
180         PMDIN1 = lcdCLEAR_DISPLAY;\r
181         vTaskDelay( lcdSHORT_DELAY );\r
182 \r
183         /* Set the entry mode. */\r
184         PMDIN1 = lcdENTRY_MODE;\r
185         vTaskDelay( lcdSHORT_DELAY );\r
186 }\r
187 /*-----------------------------------------------------------*/\r
188 \r
189 static void vLCDTask( void *pvParameters )\r
190 {\r
191 xLCDMessage xMessage;\r
192 unsigned portSHORT usRow = 0;\r
193 \r
194         /* Initialise the hardware.  This uses delays so must not be called prior\r
195         to the scheduler being started. */\r
196         prvSetupLCD();\r
197 \r
198         /* Welcome message. */\r
199         prvLCDPutString( "www.FreeRTOS.org" );\r
200 \r
201         for( ;; )\r
202         {\r
203                 /* Wait for a message to arrive that requires displaying. */\r
204                 while( xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY ) != pdPASS );\r
205 \r
206                 /* Clear the current display value. */\r
207                 prvLCDClear();\r
208 \r
209                 /* Switch rows each time so we can see that the display is still being\r
210                 updated. */\r
211                 prvLCDGotoRow( usRow & 0x01 );\r
212                 usRow++;\r
213                 prvLCDPutString( xMessage.pcMessage );\r
214 \r
215                 /* Delay the requested amount of time to ensure the text just written \r
216                 to the LCD is not overwritten. */\r
217                 vTaskDelay( xMessage.xMinDisplayTime );         \r
218         }\r
219 }\r
220 \r
221 \r
222 \r
223 \r