36 #include "esos_pic24_lcd44780.h" 42 BOOL b_cursorPositionNeedsUpdate;
46 BOOL b_cursorShownNeedsUpdate;
49 BOOL b_cursorBlinkNeedsUpdate;
52 BOOL b_displayVisibleNeedsUpdate;
53 BOOL b_displayVisible;
55 BOOL ab_lcdBufferNeedsUpdate[ESOS_LCD44780_MEM_HEIGHT][ESOS_LCD44780_MEM_WIDTH];
56 char aac_lcdBuffer[ESOS_LCD44780_MEM_HEIGHT][ESOS_LCD44780_MEM_WIDTH];
58 BOOL ab_customCharNeedsUpdate[ESOS_LCD44780_NUM_CUSTOM_CHARS];
59 esos_lcd44780_char_t ast_customChar[ESOS_LCD44780_NUM_CUSTOM_CHARS];
73 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30);
75 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30);
77 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30);
79 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x38);
80 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x10);
81 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x0C);
82 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x06);
85 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF);
86 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_FUNCTION_SET | 0b00011100);
87 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF |
88 ESOS_LCD44780_CMD_DISPLAY_ON_OFF_CUR |
89 ESOS_LCD44780_CMD_DISPLAY_ON_OFF_DISP);
90 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_ENTRY_MODE_SET |
91 ESOS_LCD44780_CMD_ENTRY_MODE_SET_INC);
94 static uint8_t i, u8_col, u8_row;
96 if(esos_lcd44780_vars.b_cursorPositionNeedsUpdate) {
97 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
FALSE;
98 ESOS_TASK_WAIT_LCD44780_SET_DATA_ADDRESS(esos_lcd44780_vars.u8_cursorRow > 0 ? 0x40 : 0x00 |
99 esos_lcd44780_vars.u8_cursorCol);
102 if(esos_lcd44780_vars.b_cursorShownNeedsUpdate ||
103 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate ||
104 esos_lcd44780_vars.b_displayVisibleNeedsUpdate) {
105 esos_lcd44780_vars.b_cursorShownNeedsUpdate =
FALSE;
106 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate =
FALSE;
107 esos_lcd44780_vars.b_displayVisibleNeedsUpdate =
FALSE;
108 ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF |
109 (esos_lcd44780_vars.b_cursorShown ? ESOS_LCD44780_CMD_DISPLAY_ON_OFF_CUR : 0) |
110 (esos_lcd44780_vars.b_cursorBlink ? ESOS_LCD44780_CMD_DISPLAY_ON_OFF_BLINK : 0) |
111 (esos_lcd44780_vars.b_displayVisible ? ESOS_LCD44780_CMD_DISPLAY_ON_OFF_DISP : 0));
114 for(u8_row = 0; u8_row < ESOS_LCD44780_MEM_HEIGHT; ++u8_row) {
115 for(u8_col = 0; u8_col < ESOS_LCD44780_MEM_WIDTH; ++u8_col) {
117 if(esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_col]) {
118 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
119 ESOS_TASK_WAIT_LCD44780_SET_DATA_ADDRESS((u8_row > 0 ? 0x40 : 0x00) | u8_col);
121 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_col] =
FALSE;
122 ESOS_TASK_WAIT_LCD44780_WRITE_DATA(esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_col]);
125 }
while(esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_col]
126 && u8_col < ESOS_LCD44780_MEM_WIDTH);
132 for(i = 0; i < ESOS_LCD44780_NUM_CUSTOM_CHARS; ++i) {
134 if(esos_lcd44780_vars.ab_customCharNeedsUpdate[i]) {
136 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
137 ESOS_TASK_WAIT_LCD44780_SET_CG_ADDRESS(8 * i);
142 esos_lcd44780_vars.ab_customCharNeedsUpdate[i] =
FALSE;
144 for(n = 0; n < 8; ++n) {
145 ESOS_TASK_WAIT_LCD44780_WRITE_DATA(esos_lcd44780_vars.ast_customChar[i].au8_data[n]);
149 }
while(esos_lcd44780_vars.ab_customCharNeedsUpdate[i] && i < ESOS_LCD44780_NUM_CUSTOM_CHARS);
160 void esos_lcd44780_configDisplay(
void )
162 unsigned int u8_column;
164 esos_lcd44780_vars.b_displayVisible =
TRUE;
165 esos_lcd44780_vars.b_displayVisibleNeedsUpdate =
TRUE;
166 esos_lcd44780_vars.b_cursorShown =
FALSE;
167 esos_lcd44780_vars.b_cursorShownNeedsUpdate =
TRUE;
168 esos_lcd44780_vars.b_cursorBlink =
FALSE;
169 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate =
TRUE;
171 esos_lcd44780_clearScreen();
173 for(u8_column = 0; u8_column < ESOS_LCD44780_NUM_CUSTOM_CHARS; ++u8_column) {
174 esos_lcd44780_vars.ab_customCharNeedsUpdate[u8_column] =
FALSE;
178 void esos_lcd44780_init(
void )
182 __esos_lcd44780_hw_configDataPinsAsOutput();
183 __ESOS_LCD44780_HW_SET_RW_WRITE();
184 __ESOS_LCD44780_HW_SET_RS_REGISTERS();
187 __esos_lcd44780_hw_config();
193 void esos_lcd44780_clearScreen(
void )
198 for(u8_height = 0; u8_height < ESOS_LCD44780_MEM_HEIGHT; u8_height++){
199 for(u8_width = 0; u8_width < ESOS_LCD44780_MEM_WIDTH; u8_width++){
200 esos_lcd44780_vars.aac_lcdBuffer[u8_height][u8_width] =
' ';
201 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_height][u8_width] =
TRUE;
205 esos_lcd44780_setCursor(0,0);
206 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
209 void esos_lcd44780_setCursorHome(
void )
211 esos_lcd44780_setCursor(0,0);
212 esos_lcd44780_vars.b_cursorPositionNeedsUpdate =
TRUE;
223 esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_column] = u8_data;
224 esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_column] =
TRUE;
229 return esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_column];
244 void esos_lcd44780_writeString(
uint8_t u8_row,
uint8_t u8_column,
char *psz_data )
250 void esos_lcd44780_setCursorDisplay(
BOOL u8_state )
256 BOOL esos_lcd44780_getCursorDisplay(
void )
262 void esos_lcd44780_setCursorBlink(
BOOL u8_state )
268 BOOL esos_lcd44780_getCursorBlink(
void )
274 void esos_lcd44780_setDisplayVisible(
BOOL u8_state )
280 BOOL esos_lcd44780_getDisplayVisible(
void )
286 void esos_lcd44780_setCustomChar(
uint8_t u8_charSlot,
uint8_t *pu8_charData )
292 void esos_lcd44780_getCustomChar(
uint8_t u8_charSlot,
uint8_t *pu8_charData )
298 BOOL esos_lcd44780_isCurrent(
void )
302 if(esos_lcd44780_vars.b_cursorPositionNeedsUpdate ||
303 esos_lcd44780_vars.b_cursorBlinkNeedsUpdate ||
304 esos_lcd44780_vars.b_displayVisibleNeedsUpdate) {
308 for(u8_row = 0; u8_row < ESOS_LCD44780_MEM_HEIGHT; ++u8_row) {
309 for(u8_column = 0; u8_column < ESOS_LCD44780_MEM_WIDTH; ++u8_column) {
310 if(esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_column]) {
316 for(u8_column = 0; u8_column < ESOS_LCD44780_NUM_CUSTOM_CHARS; ++u8_column) {
317 if(esos_lcd44780_vars.ab_customCharNeedsUpdate[u8_column]) {
337 __ESOS_LCD44780_HW_SET_RS_DATA();
339 __ESOS_LCD44780_HW_SET_RS_REGISTERS();
342 __ESOS_LCD44780_HW_SET_RW_READ();
343 __esos_lcd44780_hw_configDataPinsAsInput();
345 __ESOS_LCD44780_HW_SET_E_HIGH();
347 *pu8_data = __esos_lcd44780_hw_getDataPins();
348 __ESOS_LCD44780_HW_SET_E_LOW();
366 __ESOS_LCD44780_HW_SET_RS_DATA();
368 __ESOS_LCD44780_HW_SET_RS_REGISTERS();
371 __ESOS_LCD44780_HW_SET_RW_WRITE();
372 __esos_lcd44780_hw_configDataPinsAsOutput();
374 __esos_lcd44780_hw_setDataPins( u8_data );
376 __ESOS_LCD44780_HW_SET_E_HIGH();
378 __ESOS_LCD44780_HW_SET_E_LOW();
391 __esos_lcd44780_hw_configDataPinsAsInput();
392 __ESOS_LCD44780_HW_SET_RS_REGISTERS();
393 __ESOS_LCD44780_HW_SET_RW_READ();
394 __ESOS_LCD44780_HW_SET_E_HIGH();
395 b_hw_lcd_isBusy = (__esos_lcd44780_hw_getDataPins() & 0x80);
396 __ESOS_LCD44780_HW_SET_E_LOW();
397 if ( b_hw_lcd_isBusy ){
ESOS_TASK_HANDLE esos_RegisterTask(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
#define ESOS_CHILD_TASK(taskname,...)
#define ESOS_TASK_YIELD()
#define ESOS_TASK_WAIT_TICKS(u32_duration)
#define ESOS_ALLOCATE_CHILD_TASK(pstName)
#define ESOS_TASK_SPAWN_AND_WAIT(pstChild, pfnChild,...)
#define ESOS_TASK_BEGIN()
ESOS_USER_TASK(CANFactory)
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.