diff --git a/1602LCD_char_display.c b/1602LCD_char_display.c index 53f089d..3a13cbd 100644 --- a/1602LCD_char_display.c +++ b/1602LCD_char_display.c @@ -66,6 +66,7 @@ * DB4~DB7: high order three-state data lines. */ + //############################# //MACROS //############################# @@ -83,7 +84,7 @@ void init_lcd(void); -//void cmd_lcd(uint8_t cmd); +void cmd_lcd(uint8_t cmd); void cmd_nibble_lcd(uint8_t cmd); void clear_lcd(void); static void led_blink(void); @@ -101,12 +102,20 @@ void write_lcd_address(uint8_t addr); int main() { //SETUP HERE. _delay_ms(500); + + //setup for single line mode. + //cmd_lcd(0x20); + //_delay_ms(1000); + //cmd_lcd(0x28); + while(1) { led_blink(); _delay_ms(1000); - set_lcd_one_line(); + cmd_lcd(0x20); _delay_ms(1000); - set_lcd_two_line(); + cmd_lcd(0x28); + _delay_ms(2); + } return 0; @@ -142,34 +151,28 @@ void init_lcd(void) { * Description: Sets the LCD into 4bit two line display mode. */ void set_lcd_two_line(void) { - cmd_nibble_lcd(0x20); - cmd_nibble_lcd(0x80); + cmd_lcd(0x28); } void set_lcd_one_line(void) { - cmd_nibble_lcd(0x20); - cmd_nibble_lcd(0x00); + cmd_lcd(0x20); } void clear_lcd(void) { - cmd_nibble_lcd(0x00); - cmd_nibble_lcd(0x10); + cmd_lcd(0x01); } void return_home_lcd(void) { - cmd_nibble_lcd(0x00); - cmd_nibble_lcd(0x20); + cmd_lcd(0x02); } void turn_off_lcd(void) { - cmd_nibble_lcd(0x00); - cmd_nibble_lcd(0x80); + cmd_lcd(0x08); } void turn_on_lcd(void) { - cmd_nibble_lcd(0x00); - cmd_nibble_lcd(0x80); + cmd_lcd(0x08); } @@ -188,9 +191,31 @@ void write_lcd_address(uint8_t addr) { } -//A version that doesn't require multiple calls. +/* + * Input: uint8_t, a 8bit command code. + * Output: none + * Description: Takes a 8bit command code and sends it as two 4bit nibbles + * to the 1602LCD. The timing of delays is very important to match the + * datasheets timing diagrams. + */ void cmd_lcd(uint8_t cmd) { -; + DDRD = 0xff; + PORTD &=0x0f; + + //Send first nibble + setbit(PORTD, ENA_PIN); + PORTD |= (cmd & 0xf0); + _delay_ms(1); + clearbit(PORTD, ENA_PIN); + _delay_ms(2); + + //Send the second nibble and shift cmd by four. + PORTD &= 0x0f; + setbit(PORTD, ENA_PIN); + PORTD |= (cmd<<4); + _delay_ms(1); + clearbit(PORTD, ENA_PIN); + _delay_ms(2); } void cmd_nibble_lcd(uint8_t cmd) {