45 volatile struct stTask __stLCDChildTask;
49 BOOL b_cursorPositionNeedsUpdate;
53 BOOL b_cursorShownNeedsUpdate;
56 BOOL b_cursorBlinkNeedsUpdate;
59 BOOL b_displayVisibleNeedsUpdate;
60 BOOL b_displayVisible;
62 BOOL ab_lcdBufferNeedsUpdate[ESOS_LCD44780_MEM_HEIGHT][ESOS_LCD44780_MEM_WIDTH];
63 char aac_lcdBuffer[ESOS_LCD44780_MEM_HEIGHT][ESOS_LCD44780_MEM_WIDTH];
65 BOOL ab_customCharNeedsUpdate[ESOS_LCD44780_NUM_CUSTOM_CHARS];
78 #ifdef ESOS_USE_LCD_8BIT
80 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT( ESOS_LCD44780_CMD_FUNCTION_SET + \
81 ESOS_LCD44780_CMD_FUNCTION_SET_8BIT_MODE + \
82 ESOS_LCD44780_CMD_FUNCTION_SET_2LINE_MODE + \
83 ESOS_LCD44780_CMD_FUNCTION_SET_LOWFONT_MODE );
85 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT( ESOS_LCD44780_CMD_FUNCTION_SET + \
86 ESOS_LCD44780_CMD_FUNCTION_SET_8BIT_MODE + \
87 ESOS_LCD44780_CMD_FUNCTION_SET_2LINE_MODE + \
88 ESOS_LCD44780_CMD_FUNCTION_SET_LOWFONT_MODE );
91 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT( ESOS_LCD44780_CMD_FUNCTION_SET + \
92 ESOS_LCD44780_CMD_FUNCTION_SET_8BIT_MODE + \
93 ESOS_LCD44780_CMD_FUNCTION_SET_2LINE_MODE + \
94 ESOS_LCD44780_CMD_FUNCTION_SET_LOWFONT_MODE );
97 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(ESOS_LCD44780_CMD_FUNCTION_SET + \
98 ESOS_LCD44780_CMD_FUNCTION_SET_8BIT_MODE + \
99 ESOS_LCD44780_CMD_FUNCTION_SET_2LINE_MODE + \
100 ESOS_LCD44780_CMD_FUNCTION_SET_LOWFONT_MODE );
103 #ifdef ESOS_USE_LCD_4BIT
106 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
FALSE,
FALSE) ;
109 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
TRUE,
FALSE) ;
110 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
FALSE,
FALSE) ;
113 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
TRUE,
FALSE) ;
114 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
FALSE,
FALSE) ;
117 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
TRUE,
FALSE) ;
118 __esos_unsafe_lcd44780_hw_write_u4( 0x30,
FALSE,
FALSE) ;
121 __esos_unsafe_lcd44780_hw_write_u4( 0x20,
TRUE,
FALSE) ;
122 __esos_unsafe_lcd44780_hw_write_u4( 0x20,
FALSE,
FALSE) ;
125 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(ESOS_LCD44780_CMD_FUNCTION_SET + \
126 ESOS_LCD44780_CMD_FUNCTION_SET_4BIT_MODE + \
127 ESOS_LCD44780_CMD_FUNCTION_SET_2LINE_MODE + \
128 ESOS_LCD44780_CMD_FUNCTION_SET_LOWFONT_MODE );
132 #define ESOS_LCD44780_CMD_CLEAR_DISPLAY 0b00000001
133 #define ESOS_LCD44780_CMD_RETURN_HOME 0b00000010
134 #define ESOS_LCD44780_CMD_ENTRY_MODE_SET 0b00000100
135 #define ESOS_LCD44780_CMD_ENTRY_MODE_SET_INC 0b00000010
136 #define ESOS_LCD44780_CMD_ENTRY_MODE_SET_SHIFT 0b00000001
137 #define ESOS_LCD44780_CMD_DISPLAY_ON_OFF 0b00001000
138 #define ESOS_LCD44780_CMD_DISPLAY_ON_OFF_DISPLAYON 0b00000100
139 #define ESOS_LCD44780_CMD_DISPLAY_ON_OFF_CURSORON 0b00000010
140 #define ESOS_LCD44780_CMD_DISPLAY_ON_OFF_BLINKCURSOR 0b00000001
141 #define ESOS_LCD44780_CMD_CUR_DISP_CURSOR_SHIFT_L 0b00010000
142 #define ESOS_LCD44780_CMD_CUR_DISP_CURSOR_SHIFT_R 0b00010100
143 #define ESOS_LCD44780_CMD_CUR_DISP_DISPLAY_SHIFT_L 0b00011000
144 #define ESOS_LCD44780_CMD_CUR_DISP_DISPLAY_SHIFT_R 0b00011100
145 #define ESOS_LCD44780_CMD_FUNCTION_SET 0b00100000
146 #define ESOS_LCD44780_CMD_FUNCTION_SET_8BIT_MODE 0b00010000
147 #define ESOS_LCD44780_CMD_FUNCTION_SET_4BIT_MODE 0b00000000
148 #define ESOS_LCD44780_CMD_FUNCTION_SET_1LINE_MODE 0b00000000
149 #define ESOS_LCD44780_CMD_FUNCTION_SET_2LINE_MODE 0b00001000
150 #define ESOS_LCD44780_CMD_FUNCTION_SET_LOWFONT_MODE 0b00000000
151 #define ESOS_LCD44780_CMD_FUNCTION_SET_HIFONT_MODE 0b00000100
152 #define ESOS_LCD44780_CMD_SET_CGRAM_ADDR 0b01000000
153 #define ESOS_LCD44780_CMD_SET_DDRAM_ADDR 0b10000000
158 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(ESOS_LCD44780_CMD_CUR_DISP_CURSOR_SHIFT_R);
164 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF + \
165 ESOS_LCD44780_CMD_DISPLAY_ON_OFF_DISPLAYON );
174 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_ENTRY_MODE_SET |
175 ESOS_LCD44780_CMD_ENTRY_MODE_SET_INC);
178 static uint8_t i, u8_col, u8_row;
180 if(esos_lcd44780_vars.b_cursorPositionNeedsUpdate) {
181 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
FALSE;
182 ESOS_TASK_WAIT_LCD44780_SET_DATA_ADDRESS(esos_lcd44780_vars.u8_cursorRow > 0 ? 0x40 : 0x00 |
183 esos_lcd44780_vars.u8_cursorCol);
186 if(esos_lcd44780_vars.b_cursorShownNeedsUpdate ||
187 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate ||
188 esos_lcd44780_vars.b_displayVisibleNeedsUpdate) {
189 esos_lcd44780_vars.b_cursorShownNeedsUpdate =
FALSE;
190 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate =
FALSE;
191 esos_lcd44780_vars.b_displayVisibleNeedsUpdate =
FALSE;
192 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF |
193 (esos_lcd44780_vars.b_cursorShown ? ESOS_LCD44780_CMD_DISPLAY_ON_OFF_CURSORON : 0) |
194 (esos_lcd44780_vars.b_cursorBlink ? ESOS_LCD44780_CMD_DISPLAY_ON_OFF_BLINKCURSOR : 0) |
195 (esos_lcd44780_vars.b_displayVisible ? ESOS_LCD44780_CMD_DISPLAY_ON_OFF_DISPLAYON : 0));
198 for(u8_row = 0; u8_row < ESOS_LCD44780_MEM_HEIGHT; ++u8_row) {
199 for(u8_col = 0; u8_col < ESOS_LCD44780_MEM_WIDTH; ++u8_col) {
201 if(esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_col]) {
202 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
203 ESOS_TASK_WAIT_LCD44780_SET_DATA_ADDRESS((u8_row > 0 ? 0x40 : 0x00) | u8_col);
205 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_col] =
FALSE;
206 ESOS_TASK_WAIT_LCD44780_WRITE_DATA(esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_col]);
209 }
while(esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_col]
210 && u8_col < ESOS_LCD44780_MEM_WIDTH);
216 for(i = 0; i < ESOS_LCD44780_NUM_CUSTOM_CHARS; ++i) {
218 if(esos_lcd44780_vars.ab_customCharNeedsUpdate[i]) {
220 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
221 ESOS_TASK_WAIT_LCD44780_SET_CG_ADDRESS(8 * i);
226 esos_lcd44780_vars.ab_customCharNeedsUpdate[i] =
FALSE;
228 for(n = 0; n < 8; ++n) {
229 ESOS_TASK_WAIT_LCD44780_WRITE_DATA(esos_lcd44780_vars.ast_customChar[i].au8_data[n]);
233 }
while(esos_lcd44780_vars.ab_customCharNeedsUpdate[i] && i < ESOS_LCD44780_NUM_CUSTOM_CHARS);
244 void esos_lcd44780_configDisplay(
void )
246 unsigned int u8_column;
248 esos_lcd44780_vars.b_displayVisible =
TRUE;
249 esos_lcd44780_vars.b_displayVisibleNeedsUpdate =
TRUE;
250 esos_lcd44780_vars.b_cursorShown =
FALSE;
251 esos_lcd44780_vars.b_cursorShownNeedsUpdate =
TRUE;
252 esos_lcd44780_vars.b_cursorBlink =
FALSE;
253 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate =
TRUE;
255 esos_lcd44780_clearScreen();
257 for(u8_column = 0; u8_column < ESOS_LCD44780_NUM_CUSTOM_CHARS; ++u8_column) {
258 esos_lcd44780_vars.ab_customCharNeedsUpdate[u8_column] =
FALSE;
262 void __esos_lcd44780_init(
void )
265 __esos_lcd44780_hw_config();
271 void esos_lcd44780_clearScreen(
void )
276 for(u8_height = 0; u8_height < ESOS_LCD44780_MEM_HEIGHT; u8_height++){
277 for(u8_width = 0; u8_width < ESOS_LCD44780_MEM_WIDTH; u8_width++){
278 esos_lcd44780_vars.aac_lcdBuffer[u8_height][u8_width] =
' ';
279 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_height][u8_width] =
TRUE;
283 esos_lcd44780_setCursor(0,0);
284 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
287 void esos_lcd44780_setCursorHome(
void )
289 esos_lcd44780_setCursor(0,0);
290 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
293 void esos_lcd44780_setCursor( uint8_t u8_row, uint8_t u8_column )
299 void esos_lcd44780_writeChar( uint8_t u8_row, uint8_t u8_column, uint8_t u8_data )
301 esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_column] = u8_data;
302 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_column] =
TRUE;
305 uint8_t esos_lcd44780_getChar( uint8_t u8_row, uint8_t u8_column )
307 return esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_column];
310 void esos_lcd44780_writeBuffer( uint8_t u8_row, uint8_t u8_column, uint8_t *pu8_data, uint8_t u8_bufflen ) {
315 for(i = 0; i < u8_bufflen; i++){
316 if(u8_column + i >= 8){
319 esos_lcd44780_vars.aac_lcdBuffer[(u8_row)][(u8_column+i)%ESOS_LCD44780_MEM_WIDTH] = pu8_data[i];
320 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[(u8_row)][(u8_column+i)%ESOS_LCD44780_MEM_WIDTH] =
TRUE;
325 void esos_lcd44780_getBuffer( uint8_t u8_row, uint8_t u8_column, uint8_t *pu8_data, uint8_t u8_bufflen ) {
330 for(i = 0; i < u8_bufflen; i++){
331 if(u8_row + i >= ESOS_LCD44780_MEM_WIDTH){
332 u8_column = (u8_column + 1) % ESOS_LCD44780_MEM_WIDTH;
334 pu8_data[i] = esos_lcd44780_vars.aac_lcdBuffer[(u8_row+i)%ESOS_LCD44780_MEM_HEIGHT][u8_column];
339 void esos_lcd44780_writeString( uint8_t u8_row, uint8_t u8_column,
char *psz_data ) {
345 uint8_t u8_pszbufflen = 0;
347 while(psz_data[u8_pszbufflen] !=
'\0'){
352 for(i = 0; i < u8_pszbufflen; i++){
353 if(u8_row + i >= ESOS_LCD44780_MEM_WIDTH){
354 u8_column = (u8_column + 1) % ESOS_LCD44780_MEM_WIDTH;
356 esos_lcd44780_vars.aac_lcdBuffer[(u8_row)][(u8_column+i)%ESOS_LCD44780_MEM_WIDTH] = psz_data[i];
357 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[(u8_row)][(u8_column+i)%ESOS_LCD44780_MEM_WIDTH] =
TRUE;
362 void esos_lcd44780_setCursorDisplay(
BOOL u8_state )
367 esos_lcd44780_vars.b_cursorShown = u8_state;
368 esos_lcd44780_vars.b_cursorShownNeedsUpdate =
TRUE;
371 BOOL esos_lcd44780_getCursorDisplay(
void )
374 return esos_lcd44780_vars.b_cursorShown;
377 void esos_lcd44780_setCursorBlink(
BOOL u8_state )
380 esos_lcd44780_vars.b_cursorBlink = u8_state;
381 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate =
TRUE;
384 BOOL esos_lcd44780_getCursorBlink(
void )
387 return esos_lcd44780_vars.b_cursorBlink;
390 void esos_lcd44780_setDisplayVisible(
BOOL u8_state )
393 esos_lcd44780_vars.b_displayVisible = u8_state;
394 esos_lcd44780_vars.b_displayVisibleNeedsUpdate =
TRUE;
397 BOOL esos_lcd44780_getDisplayVisible(
void )
400 return esos_lcd44780_vars.b_displayVisible;
403 void esos_lcd44780_setCustomChar( uint8_t u8_charSlot, uint8_t *pu8_charData )
408 esos_lcd44780_vars.ab_customCharNeedsUpdate[u8_charSlot] =
TRUE;
409 for(i = 0; i < ESOS_LCD44780_NUM_CUSTOM_CHARS; i++) {
410 esos_lcd44780_vars.ast_customChar[u8_charSlot].au8_data[i] = pu8_charData[i];
414 void esos_lcd44780_getCustomChar( uint8_t u8_charSlot, uint8_t *pu8_charData )
420 BOOL esos_lcd44780_isCurrent(
void )
422 uint8_t u8_row, u8_column;
424 if(esos_lcd44780_vars.b_cursorPositionNeedsUpdate ||
425 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate ||
426 esos_lcd44780_vars.b_displayVisibleNeedsUpdate) {
430 for(u8_row = 0; u8_row < ESOS_LCD44780_MEM_HEIGHT; ++u8_row) {
431 for(u8_column = 0; u8_column < ESOS_LCD44780_MEM_WIDTH; ++u8_column) {
432 if(esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_column]) {
438 for(u8_column = 0; u8_column < ESOS_LCD44780_NUM_CUSTOM_CHARS; ++u8_column) {
439 if(esos_lcd44780_vars.ab_customCharNeedsUpdate[u8_column]) {