]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RX200_RX210-RSK_Renesas/RTOSDemo/Renesas-Files/lcd.c
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / RX200_RX210-RSK_Renesas / RTOSDemo / Renesas-Files / lcd.c
1 /***********************************************************************************\r
2 Filename: lcd.c\r
3 DESCRIPTION   LCD Module utility functions.\r
4                 Written for KS0066u compatible LCD Module.\r
5                 (8 characters by 2 lines)\r
6 \r
7 Copyright   : 2006 Renesas Technology Europe Ltd.\r
8 Copyright   : 2006 Renesas Technology Corporation.\r
9 All Rights Reserved\r
10 \r
11 ***********************************************************************************/\r
12 \r
13 /***********************************************************************************\r
14 Revision History\r
15 DD.MM.YYYY OSO-UID Description\r
16 26.07.2006 RTE-MBA First Release\r
17 ***********************************************************************************/\r
18 \r
19 /**********************************************************************************\r
20 System Includes\r
21 ***********************************************************************************/\r
22 #include <machine.h>\r
23 \r
24 /**********************************************************************************\r
25 User Includes\r
26 ***********************************************************************************/\r
27 /* iodefine.h provides a structure to access all of the device registers. */\r
28 #include "iodefine.h"\r
29 /* rsk1664def.h provides common defines for widely used items. */\r
30 #include "rskrx210def.h"\r
31 #include "lcd.h"\r
32 \r
33 /*****************************************************************************\r
34 Name:                   InitDisplay \r
35 Parameters:             none                            \r
36 Returns:                none\r
37 Description:    Intializes the LCD display. \r
38 *****************************************************************************/\r
39 void InitialiseDisplay( void )\r
40 {\r
41         /* Power Up Delay for LCD Module */\r
42         EN_PIN = SET_BIT_HIGH;\r
43         DisplayDelay(7000);\r
44         EN_PIN = SET_BIT_LOW;\r
45   \r
46         /* Display initialises in 8 bit mode - so send one write (seen as 8 bit)\r
47                 to set to 4 bit mode. */\r
48 \r
49         /* Function Set */\r
50         LCD_nibble_write(CTRL_WR,0x03);\r
51         LCD_nibble_write(CTRL_WR,0x03);\r
52         DisplayDelay(39);\r
53  \r
54         /* Configure display */\r
55         LCD_nibble_write(CTRL_WR,0x03);\r
56         LCD_nibble_write(CTRL_WR,0x02);\r
57         LCD_nibble_write(CTRL_WR,(LCD_DISPLAY_ON | LCD_TWO_LINE ));\r
58         LCD_nibble_write(CTRL_WR,(LCD_DISPLAY_ON | LCD_TWO_LINE ));\r
59         DisplayDelay(39);\r
60 \r
61         /* Display ON/OFF control */\r
62         LCD_write(CTRL_WR,LCD_CURSOR_OFF);\r
63         DisplayDelay(39);\r
64 \r
65         /* Display Clear */\r
66         LCD_write(CTRL_WR,LCD_CLEAR);\r
67         DisplayDelay(1530);\r
68 \r
69         /* Entry Mode Set */\r
70         LCD_write(CTRL_WR,0x06);\r
71         LCD_write(CTRL_WR,LCD_HOME_L1);\r
72 }\r
73 /**********************************************************************************\r
74 End of function InitialiseDisplay\r
75 ***********************************************************************************/   \r
76 \r
77 /*****************************************************************************\r
78 Name:           DisplayString   \r
79 Parameters:     position  Line number of display\r
80                         string  Pointer to data to be written to display.\r
81                                         Last character should be null.\r
82 Returns:        none\r
83 \r
84 Description:    This function controls LCD writes to line 1 or 2 of the LCD.\r
85                                 You need to use the defines LCD_LINE1 and LCD_LINE2 in order\r
86                                 to specify the starting position.\r
87                                 For example, to start at the 2nd position on line 1...\r
88                                 DisplayString(LCD_LINE1 + 1, "Hello")\r
89 *****************************************************************************/\r
90 void DisplayString(unsigned char position, char * string)\r
91 {\r
92         static unsigned char next_pos = 0xFF;\r
93 \r
94         /* Set line position if needed. We don't want to if we don't need \r
95                 to because LCD control operations take longer than LCD data\r
96                 operations. */\r
97         if( next_pos != position)\r
98         {\r
99                 if(position < LCD_LINE2)\r
100                 {\r
101                         /* Display on Line 1 */\r
102                         LCD_write(CTRL_WR, (unsigned char)(LCD_HOME_L1 + position) );\r
103                 }\r
104                 else\r
105                 {\r
106                         /* Display on Line 2 */\r
107                         LCD_write(CTRL_WR, (unsigned char)(LCD_HOME_L2 + position - LCD_LINE2) );\r
108                 }\r
109                 /* set position index to known value */\r
110                 next_pos = position;    \r
111         }\r
112 \r
113         do\r
114         {\r
115                 LCD_write(DATA_WR,*string++);\r
116                 /* increment position index */\r
117                 next_pos++;        \r
118         }\r
119         while(*string);\r
120 }\r
121 /**********************************************************************************\r
122 End of function DisplayString\r
123 ***********************************************************************************/   \r
124 \r
125 /*****************************************************************************\r
126 Name:           LCD_write\r
127 Parameters:     value - the value to write\r
128                         data_or_ctrl - To write value as DATA or CONTROL\r
129                                                         1 = DATA\r
130                                                         0 = CONTROL\r
131 Returns:        none\r
132 \r
133 Description:    Writes data to display. Sends command to display.  \r
134 *****************************************************************************/\r
135 void LCD_write(unsigned char data_or_ctrl, unsigned char value)\r
136 {\r
137         /* Write upper nibble first */\r
138         LCD_nibble_write(data_or_ctrl, (value & 0xF0) >> 4);\r
139 \r
140         /* Write lower nibble second */\r
141         LCD_nibble_write(data_or_ctrl, (value & 0x0F));\r
142 }\r
143 /**********************************************************************************\r
144 End of function LCD_write\r
145 ***********************************************************************************/   \r
146 \r
147 /*****************************************************************************\r
148 Name:           LCD_nibble_write\r
149 Parameters:     value - the value to write\r
150                         data_or_ctrl - To write value as DATA or CONTROL\r
151                                                         1 = DATA\r
152                                                         0 = CONTROL\r
153 Returns:        none\r
154 \r
155 Description:    Writes data to display. Sends command to display.  \r
156 *****************************************************************************/\r
157 void LCD_nibble_write(unsigned char data_or_ctrl, unsigned char value)\r
158 {\r
159         unsigned char ucStore;\r
160         if (data_or_ctrl == DATA_WR)\r
161         {\r
162                 RS_PIN = SET_BIT_HIGH;\r
163         }\r
164         else\r
165         {\r
166                 RS_PIN = SET_BIT_LOW;\r
167         }\r
168         /* There must be 40ns between RS write and EN write */\r
169         DisplayDelay(1);\r
170         /* EN enable chip (HIGH) */\r
171         EN_PIN = SET_BIT_HIGH;\r
172         /* Tiny delay */                \r
173         DisplayDelay(1);\r
174         /* Clear port bits used */  \r
175         /* Set upper lower 4 bits of nibble on port pins. */\r
176         ucStore = DATA_PORT;\r
177         ucStore &= ~DATA_PORT_MASK;\r
178         /* OR in data */  \r
179         ucStore |= ((value << DATA_PORT_SHIFT) & DATA_PORT_MASK );\r
180         /* Write lower 4 bits of nibble */\r
181         DATA_PORT = ucStore;\r
182 \r
183         /* write delay while En High */\r
184         DisplayDelay(20);\r
185         /* Latch data by dropping EN */          \r
186         EN_PIN = SET_BIT_LOW;\r
187         /* Data hold delay */      \r
188         DisplayDelay(20);                \r
189 \r
190         if(data_or_ctrl == CTRL_WR)\r
191         {\r
192                 /* Extra delay needed for control writes */\r
193                 DisplayDelay(40);          \r
194         }          \r
195 }\r
196 /**********************************************************************************\r
197 End of function LCD_nibble_write\r
198 ***********************************************************************************/   \r
199 \r
200 /*****************************************************************************\r
201 Name:           DisplayDelay \r
202 Parameters:     units - Approximately in microseconds                              \r
203 Returns:        none \r
204 \r
205 Description:   Delay routine for LCD display.\r
206 *****************************************************************************/\r
207 void DisplayDelay(unsigned long int units)\r
208 {\r
209         unsigned long counter = units * DELAY_TIMING;\r
210         while(counter--)\r
211         {\r
212                 nop();          // ~ 10ns\r
213         }\r
214 }\r
215 /**********************************************************************************\r
216 End of function DisplayDelay\r
217 ***********************************************************************************/   \r
218 \r
219 \r