Commit cb6fcbead0826fdbe54dc0b2218eb77d229c8248
authorAkos Kiss <akiss@inf.u-szeged.hu>
Mon, 5 Oct 2020 16:01:40 +0000 (18:01 +0200)
committerAkos Kiss <akiss@inf.u-szeged.hu>
Thu, 8 Oct 2020 21:32:39 +0000 (23:32 +0200)
In HD44780, the DDRAM has an address space of 0x80 bytes, while
CGRAM has 0x40 bytes. To ensure their proper separation, the vram
should have 0x80+0x40 bytes with the CGRAM starting at 0x80.

2 files changed:
examples/parts/hd44780.c
examples/parts/hd44780.h

index 144cbfcecb1ae4fdd3e5a20e1d8e5b2d7f7ae77d..84fb993bacd91c77dce3058654c7287e6f99dfbe 100644 (file)
@@ -55,7 +55,7 @@ static void
 _hd44780_clear_screen(
                hd44780_t *b)
 {
-       memset(b->vram, ' ', 80);
+       memset(b->vram, ' ', 0x80);
        hd44780_set_flag(b, HD44780_FLAG_DIRTY, 1);
        avr_raise_irq(b->irq + IRQ_HD44780_ADDR, b->cursor);
 }
@@ -84,14 +84,14 @@ hd44780_kick_cursor(
        hd44780_t *b)
 {
        if (hd44780_get_flag(b, HD44780_FLAG_I_D)) {
-               if (b->cursor < 79)
+               if (b->cursor < 0x80-1)
                        b->cursor++;
-               else if (b->cursor < 80+64-1)
+               else if (b->cursor < 0x80+0x40-1)
                        b->cursor++;
        } else {
-               if (b->cursor < 80 && b->cursor)
+               if (b->cursor < 0x80 && b->cursor)
                        b->cursor--;
-               else if (b->cursor > 80)
+               else if (b->cursor > 0x80)
                        b->cursor--;
                hd44780_set_flag(b, HD44780_FLAG_DIRTY, 1);
                avr_raise_irq(b->irq + IRQ_HD44780_ADDR, b->cursor);
@@ -139,7 +139,7 @@ hd44780_write_command(
                        break;
                // Set  CGRAM address
                case 6:         // 0 1 ADD ADD ADD ADD ADD ADD ADD
-                       b->cursor = 64 + (b->datapins & 0x3f);
+                       b->cursor = 0x80 + (b->datapins & 0x3f);
                        break;
                // Function     set
                case 5: {       // 0 0 1 DL N F x x
@@ -246,7 +246,7 @@ hd44780_process_read(
                        delay = 0;      // no raising busy when reading busy !
 
                        // low bits are the current cursor
-                       b->readpins = b->cursor < 80 ? b->cursor : b->cursor-64;
+                       b->readpins = b->cursor < 0x80 ? b->cursor : b->cursor-0x80;
                        int busy = hd44780_get_flag(b, HD44780_FLAG_BUSY);
                        b->readpins |= busy ? 0x80 : 0;
 
@@ -391,4 +391,3 @@ hd44780_init(
        printf("LCD: %duS is %d cycles for your AVR\n",
                        1, (int)avr_usec_to_cycles(avr, 1));
 }
-
index 39353e53a7a3ff825d2624fbb77099a9fe17e606..e359e6f1fd4ac1d8744d8c067fc4a1b51a31ace5 100644 (file)
@@ -98,7 +98,7 @@ typedef struct hd44780_t
        int             w, h;                           // width and height of the LCD
 
        uint16_t cursor;                        // offset in vram
-       uint8_t  vram[80 + 64];
+       uint8_t  vram[0x80 + 0x40];
 
        uint16_t pinstate;                      // 'actual' LCd data pins (IRQ bit field)
        // uint16_t oldstate;                   /// previous pins
@@ -134,4 +134,4 @@ hd44780_get_flag(
        return (b->flags &  (1 << bit)) != 0;
 }
 
-#endif 
+#endif