README: Add some description
[brmpuk.git] / lcd.c
blobbc13d0fa2f562ceb2ee936ccec74ab77840809a3
1 #include "brmpuk.h"
3 #include <string.h>
4 #include <avr/io.h>
5 #include <util/delay.h>
6 #include "lcd.h"
8 static void lcd_putdata(unsigned char data4)
10 PORTG &= ~0x7;
11 PORTG |= data4 & 0x7;
13 /* EN pulse: */
14 PORTD &= ~_BV(PD7);
15 _delay_us(1);
16 PORTD |= _BV(PD7);
17 _delay_us(1);
20 static void lcd_command(unsigned char data8)
22 PORTG &= ~_BV(PG4); // RS low
23 lcd_putdata(data8 >> 8);
24 lcd_putdata(data8);
27 static void lcd_data(unsigned char data8)
29 PORTG |= _BV(PG4); // RS high
30 lcd_putdata(data8 >> 8);
31 lcd_putdata(data8);
34 static void lcd_clear(void)
36 lcd_command(0x01 /* CLEARDISPLAY */);
37 _delay_us(2000);
40 void lcd_init(void)
42 DDRD |= _BV(PD7); // EN pin
43 DDRG |= _BV(PG4); // RS pin
44 DDRG |= (_BV(PG0)|_BV(PG1)|_BV(PG2)|_BV(PG3)); // data pins
45 _delay_us(40000);
47 /* Pull RS, EN low to start talking. */
48 PORTG &= ~_BV(PG4); // XXX: try pull high?
49 PORTD &= ~_BV(PD7);
50 _delay_us(4500); // XXX: needed?
52 /* Set 4-bit mode. */
53 lcd_putdata(0x3);
54 _delay_us(4500);
55 lcd_putdata(0x3);
56 _delay_us(4500);
57 lcd_putdata(0x3);
58 _delay_us(150);
60 lcd_command(0x20 /* FUNCTIONCONTROL */ | 0x08 /* 2LINE */);
61 lcd_command(0x08 /* DISPLAYCONTROL */ | 0x04 /* DISPLAYON */);
62 lcd_clear();
63 lcd_command(0x04 /* ENTRYMORE */ | 0x02 /* LTR */);
66 void lcd_text(char *str)
68 lcd_clear();
69 int i;
70 for (i = 0; i < strlen(str); i++) {
71 lcd_data(str[i]);