-#define LCD_PORT PORTB
-#define LCD_DDR DDRB
-
-#define PIN_RS 4
-#define PIN_E 5
-#define PIN_RW 6
-
-void
-ao_lcd_set_bits(uint8_t bits)
-{
-#if 0
- printf("\tLCD data %x RS %d R/W %d E %d\n",
- bits & 0xf,
- (bits & (1 << PIN_RS)) ? 1 : 0,
- (bits & (1 << PIN_RW)) ? 1 : 0,
- (bits & (1 << PIN_E)) ? 1 : 0);
-#endif
- LCD_PORT = bits;
-#if 0
- ao_delay(1);
- if (bits & (1 << PIN_RW))
- printf("\tLCD input %x\n", PINB);
-#endif
-}
-
-uint8_t
-ao_lcd_get_nibble(uint8_t rs)
-{
- uint8_t data = (rs ? (1 << PIN_RS) : 0) | (1 << PIN_RW);
- uint8_t n;
-
- DDRB = (1 << PIN_RS) | (1 << PIN_E) | (1 << PIN_RW);
- ao_lcd_set_bits(data);
- ao_lcd_set_bits(data | (1 << PIN_E));
- n = PINB & 0xf;
- ao_lcd_set_bits(data);
- return n;
-}
-
-uint8_t
-ao_lcd_get_status(void)
-{
- uint8_t high, low;
- uint8_t data;
-
- high = ao_lcd_get_nibble(0);
- low = ao_lcd_get_nibble(0);
- data = (high << 4) | low;
- printf ("\tLCD status %02x\n", data);
- return data;
-}
-
-uint8_t
-ao_lcd_get_data(void)
-{
- uint8_t high, low;
- uint8_t data;
-
- high = ao_lcd_get_nibble(1);
- low = ao_lcd_get_nibble(1);
- data = (high << 4) | low;
- printf ("\tLCD data %02x\n", data);
- return data;
-}
-
-void
-ao_lcd_wait_idle(void)
-{
- uint8_t status;
- uint8_t count = 0;
-
- do {
- status = ao_lcd_get_status();
- count++;
- if (count > 100) {
- printf("idle timeout\n");
- break;
- }
- } while (0); /* status & 0x80); */
-}
-
-void
-ao_lcd_send_nibble(uint8_t rs, uint8_t data)
-{
- data = (data & 0xf) | (rs ? (1 << PIN_RS) : 0);
- DDRB = (0xf) | (1 << PIN_RS) | (1 << PIN_E) | (1 << PIN_RW);
- ao_lcd_set_bits(data);
- ao_lcd_set_bits(data | (1 << PIN_E));
- ao_lcd_set_bits(data);
-}
-