From 2e6fb40353e8353a04296b4c9b4a9d5a8a91fbe0 Mon Sep 17 00:00:00 2001 From: Garrett Smith Date: Sun, 1 Mar 2020 19:27:52 -0600 Subject: [PATCH 01/10] Updated write command for 4 bits --- esos/src/esos_lcd44780.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index 2867d84..da77a6b 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -68,7 +68,6 @@ ESOS_USER_TASK( __esos_lcd44780_service ) // The LCD service hidden task will need to maintain a buffer containing the LCD character display ESOS_TASK_BEGIN(); - printf("service loop top\n"); __ESOS_LCD44780_PIC24_SET_E_LOW; ESOS_TASK_WAIT_TICKS(100); // Wait >15 msec after power is applied ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30); @@ -417,11 +416,18 @@ ESOS_CHILD_TASK(__esos_lcd44780_write_u8, uint8_t u8_data, BOOL b_isData, BOOL b __ESOS_LCD44780_HW_SET_RW_WRITE(); __esos_lcd44780_hw_configDataPinsAsOutput(); - __esos_lcd44780_hw_setDataPins( u8_data ); + __esos_lcd44780_hw_setDataPins( 0x0F & (u8_data >> 4) ); __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD(); __ESOS_LCD44780_HW_SET_E_LOW(); + + __esos_lcd44780_hw_setDataPins( 0xF0 & (u8_data << 4) ); + + __ESOS_LCD44780_HW_SET_E_HIGH(); + ESOS_TASK_YIELD(); + __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_YIELD(); ESOS_TASK_END(); From e56fc26014ce5740b345da1d04cdb1ce81e596bb Mon Sep 17 00:00:00 2001 From: Garrett Smith Date: Sun, 1 Mar 2020 19:34:09 -0600 Subject: [PATCH 02/10] Updated read command for 4 bits --- esos/src/esos_lcd44780.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index da77a6b..464205c 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -389,7 +389,13 @@ ESOS_CHILD_TASK(__esos_lcd44780_read_u8, uint8_t *pu8_data, BOOL b_isData, BOOL __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD(); - *pu8_data = __esos_lcd44780_hw_getDataPins(); + *pu8_data = 0x0F & (__esos_lcd44780_hw_getDataPins() << 4); + __ESOS_LCD44780_HW_SET_E_HIGH(); + ESOS_TASK_YIELD(); + __ESOS_LCD44780_HW_SET_E_LOW(); + + *pu8_data = pu8_data | (0x0F & (__esos_lcd44780_hw_getDataPins() >> 4)); + __ESOS_LCD44780_HW_SET_E_LOW(); ESOS_TASK_YIELD(); @@ -422,7 +428,7 @@ ESOS_CHILD_TASK(__esos_lcd44780_write_u8, uint8_t u8_data, BOOL b_isData, BOOL b ESOS_TASK_YIELD(); __ESOS_LCD44780_HW_SET_E_LOW(); - __esos_lcd44780_hw_setDataPins( 0xF0 & (u8_data << 4) ); + __esos_lcd44780_hw_setDataPins( 0x0F & (u8_data << 4) ); __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD(); From fb061ba729a5daf99c04905b3f02cbf160b48107 Mon Sep 17 00:00:00 2001 From: Garrett Smith Date: Sun, 1 Mar 2020 19:38:22 -0600 Subject: [PATCH 03/10] Updated init command for 4 bits --- esos/src/esos_lcd44780.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index 464205c..2149cde 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -69,16 +69,29 @@ ESOS_USER_TASK( __esos_lcd44780_service ) ESOS_TASK_BEGIN(); __ESOS_LCD44780_PIC24_SET_E_LOW; + __ESOS_LCD44780_HW_CLEAR_D0() + __ESOS_LCD44780_HW_CLEAR_D3() ESOS_TASK_WAIT_TICKS(100); // Wait >15 msec after power is applied ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30); ESOS_TASK_WAIT_TICKS(10); // must wait 5ms, busy flag not available - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30); - ESOS_TASK_WAIT_TICKS(10); // must wait 160us, busy flag not available - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30); - ESOS_TASK_WAIT_TICKS(10); // must wait 160us, busy flag not available - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x38); + __ESOS_LCD44780_HW_SET_E_HIGH(); + ESOS_TASK_WAIT_TICKS(1); + __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_WAIT_TICKS(10); + __ESOS_LCD44780_HW_SET_E_HIGH(); + ESOS_TASK_WAIT_TICKS(1); + __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_WAIT_TICKS(10); + __ESOS_LCD44780_HW_SET_E_HIGH(); + ESOS_TASK_WAIT_TICKS(1); + __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x20); + __ESOS_LCD44780_HW_SET_E_HIGH(); + ESOS_TASK_WAIT_TICKS(1); + __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x28); ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x10); - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x0C); + ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x0F); ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x06); // Send startup sequence from datasheet From 53aea88c7f4830118b22760bd336d952f4529d50 Mon Sep 17 00:00:00 2001 From: Andrew Yingst Date: Sun, 1 Mar 2020 20:01:45 -0600 Subject: [PATCH 04/10] minot fixes --- esos/src/esos_lcd44780.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index 2149cde..fc5d25d 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -37,7 +37,9 @@ #include #include #include - +#include +#include +#include // Main data structure for updating lcd44780 struct { BOOL b_cursorPositionNeedsUpdate; @@ -69,8 +71,8 @@ ESOS_USER_TASK( __esos_lcd44780_service ) ESOS_TASK_BEGIN(); __ESOS_LCD44780_PIC24_SET_E_LOW; - __ESOS_LCD44780_HW_CLEAR_D0() - __ESOS_LCD44780_HW_CLEAR_D3() + __ESOS_LCD44780_HW_CLEAR_D0(); + __ESOS_LCD44780_HW_CLEAR_D3(); ESOS_TASK_WAIT_TICKS(100); // Wait >15 msec after power is applied ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30); ESOS_TASK_WAIT_TICKS(10); // must wait 5ms, busy flag not available From 741b16a0290eade52a7765aa0de23f5b29030fca Mon Sep 17 00:00:00 2001 From: Garrett Smith Date: Sun, 1 Mar 2020 21:40:58 -0600 Subject: [PATCH 05/10] Cast result getPins to unsigned 8bit integer --- esos/src/esos_lcd44780.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index fc5d25d..0e6323b 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -404,12 +404,12 @@ ESOS_CHILD_TASK(__esos_lcd44780_read_u8, uint8_t *pu8_data, BOOL b_isData, BOOL __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD(); - *pu8_data = 0x0F & (__esos_lcd44780_hw_getDataPins() << 4); + *pu8_data = 0x0F & (((uint8_t)__esos_lcd44780_hw_getDataPins()) << 4); __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD(); __ESOS_LCD44780_HW_SET_E_LOW(); - *pu8_data = pu8_data | (0x0F & (__esos_lcd44780_hw_getDataPins() >> 4)); + *pu8_data = pu8_data | (0x0F & (((uint8_t)__esos_lcd44780_hw_getDataPins()) >> 4)); __ESOS_LCD44780_HW_SET_E_LOW(); ESOS_TASK_YIELD(); From 0fda2b6b212cd68909f354b96a4f8757f9910551 Mon Sep 17 00:00:00 2001 From: Andrew Yingst Date: Mon, 2 Mar 2020 08:30:03 -0600 Subject: [PATCH 06/10] minor cleanup --- esos/src/pic24/esos_pic24_lcd44780.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/esos/src/pic24/esos_pic24_lcd44780.c b/esos/src/pic24/esos_pic24_lcd44780.c index d7e28c0..cd237c5 100644 --- a/esos/src/pic24/esos_pic24_lcd44780.c +++ b/esos/src/pic24/esos_pic24_lcd44780.c @@ -49,9 +49,7 @@ void __esos_lcd44780_pic24_setDataPins(uint8_t u8_data) { // write the hardware-specific code to take the u8_data passed in // and place it on the appropriate data pins - //printf("setPins\n"); - //Suggestion: more compact way of settig pins from byte - //where the MSb is LCD_D7 + LCD_D7 = (u8_data >> 7) & 0x01; LCD_D6 = (u8_data >> 6) & 0x01; LCD_D5 = (u8_data >> 5) & 0x01; @@ -66,8 +64,7 @@ uint8_t __esos_lcd44780_pic24_getDataPins(void) { // write the hardware-specific code to read the appropriate data pins // and create the uint8 data to return to the caller - //Suggestion: more compact way of constructing return byte - //where the MSb is LCD_D7 + uint8_t u8_data = 0; u8_data |= LCD_D7 << 7; From 7544f785823dc2acbdee99a79b2f8dbde3afb959 Mon Sep 17 00:00:00 2001 From: kharaRobinson96 <43385947+kharaRobinson96@users.noreply.github.com> Date: Mon, 2 Mar 2020 09:21:21 -0600 Subject: [PATCH 07/10] Added Comments Still under comment construction... --- esos/src/esos_lcd44780.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index 0e6323b..79f5998 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -231,29 +231,32 @@ void esos_lcd44780_setCursorHome( void ) void esos_lcd44780_setCursor( uint8_t u8_row, uint8_t u8_column ) { // Move cursor to (u8_row,u8_column) without changing memory buffer or the display - // TODO: Write hardware-independent code here esos_lcd44780_vars.u8_cursorRow = u8_row; esos_lcd44780_vars.u8_cursorCol = u8_column; + + // Informs buffer about the cursor's position esos_lcd44780_vars.b_cursorPositionNeedsUpdate = TRUE; } void esos_lcd44780_writeChar( uint8_t u8_row, uint8_t u8_column, uint8_t u8_data ) { + // Writes a character to a row and column that is specified esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_column] = u8_data; + + // Updates buffer that a character has been added esos_lcd44780_vars.ab_lcdBufferNeedsUpdate[u8_row][u8_column] = TRUE; - //printf("writeChar\n"); } uint8_t esos_lcd44780_getChar( uint8_t u8_row, uint8_t u8_column ) { + //Returns the character that is in that specified position return esos_lcd44780_vars.aac_lcdBuffer[u8_row][u8_column]; } void esos_lcd44780_writeBuffer( uint8_t u8_row, uint8_t u8_column, uint8_t *pu8_data, uint8_t u8_bufflen ) { // Write u8_bufflen characters from pu8_data to (u8_row,u8_column) - // TODO: Write hardware-independent code here int x; for (x = 0; x < u8_bufflen; x++) { From db0a94b9ef5f1610d3c0d09f0d74d00d7e8ceff8 Mon Sep 17 00:00:00 2001 From: kharaRobinson96 <43385947+kharaRobinson96@users.noreply.github.com> Date: Mon, 2 Mar 2020 09:22:01 -0600 Subject: [PATCH 08/10] Added changes for Lab 5 --- Docs/Assembly_Report.docx | Bin 20719 -> 21496 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Docs/Assembly_Report.docx b/Docs/Assembly_Report.docx index f23de817c2756f6da421ccd35706ed5be6a4d498..dade7b2ae54d591bd4b46d1d6837dc456e80aa82 100644 GIT binary patch delta 12011 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 XXe-J>B`c(CF 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 m%$>}XU7eiW*i4+AS-l Date: Mon, 2 Mar 2020 09:41:09 -0600 Subject: [PATCH 09/10] COMMENT GALORE! --- esos/src/esos_lcd44780.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index 79f5998..c28abbc 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -260,7 +260,8 @@ void esos_lcd44780_writeBuffer( uint8_t u8_row, uint8_t u8_column, uint8_t *pu8_ int x; for (x = 0; x < u8_bufflen; x++) { - + //The characters write to the buffer and must move to the next column to properly write the characters + //pu8_data= is the pointer to the "string" of characters or single character esos_lcd44780_writeChar(u8_row, u8_column + x, pu8_data[x]); } @@ -276,10 +277,12 @@ void esos_lcd44780_getBuffer( uint8_t u8_row, uint8_t u8_column, uint8_t *pu8_da void esos_lcd44780_writeString( uint8_t u8_row, uint8_t u8_column, char *psz_data ) { // Write zero-terminated string psz_data to location starting at (u8_row,u8_column) - // TODO: Write hardware-independent code here + int i; - + // Write a character as long as the string does not end with a null character for (i = 0; psz_data[i] != '\0'; i++) { + + //The characters write to the buffer and must move to the next column to properly write the characters esos_lcd44780_writeChar(u8_row, u8_column + i, psz_data[i]); } } @@ -287,16 +290,12 @@ void esos_lcd44780_writeString( uint8_t u8_row, uint8_t u8_column, char *psz_dat void esos_lcd44780_setCursorDisplay( BOOL u8_state ) { // Set cursor display state to u8_state - // TODO: Write hardware-independent code here - esos_lcd44780_vars.b_cursorShown = u8_state; } BOOL esos_lcd44780_getCursorDisplay( void ) { // Return cursor display state - // TODO: Write hardware-independent code here - return esos_lcd44780_vars.b_cursorShown; } From 6be6d86eaedf88daba9e88e627d369589ae8b6d9 Mon Sep 17 00:00:00 2001 From: Ryan Shoemake Date: Mon, 2 Mar 2020 15:33:15 -0600 Subject: [PATCH 10/10] Working 4bit --- esos/src/esos_lcd44780.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/esos/src/esos_lcd44780.c b/esos/src/esos_lcd44780.c index c28abbc..6261e32 100644 --- a/esos/src/esos_lcd44780.c +++ b/esos/src/esos_lcd44780.c @@ -70,41 +70,43 @@ ESOS_USER_TASK( __esos_lcd44780_service ) // The LCD service hidden task will need to maintain a buffer containing the LCD character display ESOS_TASK_BEGIN(); - __ESOS_LCD44780_PIC24_SET_E_LOW; - __ESOS_LCD44780_HW_CLEAR_D0(); - __ESOS_LCD44780_HW_CLEAR_D3(); ESOS_TASK_WAIT_TICKS(100); // Wait >15 msec after power is applied - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND_NOWAIT(0x30); - ESOS_TASK_WAIT_TICKS(10); // must wait 5ms, busy flag not available + __esos_lcd44780_hw_setDataPins(0x30); + ESOS_TASK_WAIT_TICKS(30); + + //nybble __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_WAIT_TICKS(1); __ESOS_LCD44780_HW_SET_E_LOW(); - ESOS_TASK_WAIT_TICKS(10); + + ESOS_TASK_WAIT_TICKS(10); + + //nybble __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_WAIT_TICKS(1); __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_WAIT_TICKS(10); + + //nybble __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_WAIT_TICKS(1); __ESOS_LCD44780_HW_SET_E_LOW(); - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x20); + + ESOS_TASK_WAIT_TICKS(10); + + __esos_lcd44780_hw_setDataPins(0x20); + + //nybble __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_WAIT_TICKS(1); __ESOS_LCD44780_HW_SET_E_LOW(); + ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x28); ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x10); ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x0F); ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND(0x06); - // Send startup sequence from datasheet - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF); - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_FUNCTION_SET | 0b00011100); - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_DISPLAY_ON_OFF | - ESOS_LCD44780_CMD_DISPLAY_ON_OFF_CUR | - ESOS_LCD44780_CMD_DISPLAY_ON_OFF_DISP); - ESOS_TASK_WAIT_LCD44780_WRITE_COMMAND( ESOS_LCD44780_CMD_ENTRY_MODE_SET | - ESOS_LCD44780_CMD_ENTRY_MODE_SET_INC); - while(TRUE) { static uint8_t i, u8_col, u8_row; @@ -411,7 +413,7 @@ ESOS_CHILD_TASK(__esos_lcd44780_read_u8, uint8_t *pu8_data, BOOL b_isData, BOOL ESOS_TASK_YIELD(); __ESOS_LCD44780_HW_SET_E_LOW(); - *pu8_data = pu8_data | (0x0F & (((uint8_t)__esos_lcd44780_hw_getDataPins()) >> 4)); + // *pu8_data = pu8_data | (0x0F & (((uint8_t)__esos_lcd44780_hw_getDataPins()) >> 4)); __ESOS_LCD44780_HW_SET_E_LOW(); ESOS_TASK_YIELD(); @@ -439,13 +441,13 @@ ESOS_CHILD_TASK(__esos_lcd44780_write_u8, uint8_t u8_data, BOOL b_isData, BOOL b __ESOS_LCD44780_HW_SET_RW_WRITE(); __esos_lcd44780_hw_configDataPinsAsOutput(); - __esos_lcd44780_hw_setDataPins( 0x0F & (u8_data >> 4) ); + __esos_lcd44780_hw_setDataPins( u8_data & 0xF0 ); __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD(); __ESOS_LCD44780_HW_SET_E_LOW(); - __esos_lcd44780_hw_setDataPins( 0x0F & (u8_data << 4) ); + __esos_lcd44780_hw_setDataPins( (u8_data << 4) & 0xF0 ); __ESOS_LCD44780_HW_SET_E_HIGH(); ESOS_TASK_YIELD();