Created
August 24, 2011 07:40
-
-
Save delamonpansie/1167510 to your computer and use it in GitHub Desktop.
lcd driver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <avr/io.h> | |
#include <avr/pgmspace.h> | |
#include <util/delay.h> | |
#include "lcd.h" | |
#define BUSY_FLAG 0b10000000 | |
void wait(); | |
char read(void) | |
{ | |
char low, high; | |
en(1); | |
_delay_us(100); | |
high = read_nible(); | |
en(0); | |
_delay_us(50); | |
en(1); | |
_delay_us(100); | |
low = read_nible(); | |
en(0); | |
return high | (low >> 4); | |
} | |
void write(char data) | |
{ | |
char high = data >> 4, low = data; | |
write_nible(high); | |
en(1); | |
_delay_us(100); | |
en(0); | |
write_nible(low); | |
en(1); | |
_delay_us(100); | |
en(0); | |
} | |
void lcd_clear_display(void) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b00000001); | |
} | |
void lcd_return_home(void) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b00000010); | |
} | |
void lcd_entry_mode_set(char incr_decr, char shift) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b00000100 | (incr_decr << 1) | shift); | |
} | |
void lcd_display_on_off_control(char display, char cursor, char blink) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b00001000 | (display << 2) | (cursor << 1) | blink); | |
} | |
void lcd_cursor_display_shift(char s_c, char r_l) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b00010000 | (s_c << 3) | (r_l << 2)); | |
} | |
void lcd_function_set(char lines, char font) | |
{ | |
char data_len = 0; /* we're only support 4bit mode of operation */ | |
wait(); | |
rs_ws(0, 0); | |
write(0b00100000 | (data_len << 4) | (lines << 3) | (font << 2)); | |
} | |
void | |
lcd_set_cgram_addr(char addr) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b01000000 | (addr & 0b00111111)); | |
} | |
void | |
lcd_set_ddram_addr(char addr) | |
{ | |
wait(); | |
rs_ws(0, 0); | |
write(0b10000000 | (addr & 0b01111111)); | |
} | |
/* read BusyFlag and AddressCounter */ | |
char lcd_read_bf_ac(void) | |
{ | |
rs_ws(0, 1); | |
return read(); | |
} | |
void wait() | |
{ | |
_delay_ms(1); | |
for (;;) { | |
if ((lcd_read_bf_ac() & BUSY_FLAG) == 0) | |
break; | |
} | |
} | |
#define lcd_putc lcd_write_data | |
void lcd_write_data(char data) | |
{ | |
wait(); | |
rs_ws(1, 0); | |
write(data); | |
} | |
char lcd_read_data(void) | |
{ | |
wait(); | |
rs_ws(1, 1); | |
return read(); | |
} | |
void lcd_init(char lines, char font) | |
{ | |
rs_ws(0, 0); | |
write_nible(0b0011); /* Function Set: 8bit interface */ | |
en(1); | |
_delay_us(500); | |
en(0); | |
_delay_ms(5); | |
en(1); | |
_delay_us(500); | |
en(0); | |
_delay_ms(5); | |
en(1); | |
_delay_us(500); | |
en(0); | |
_delay_ms(5); | |
rs_ws(0, 0); | |
write_nible(0b0010); /* Function Set: 4bit interface, 8bit write */ | |
en(1); | |
_delay_us(500); | |
en(0); | |
_delay_ms(5); | |
write(0b00100000 | (lines << 3) | (font << 2)); /* Function Set 4bit, lines, font */ | |
} | |
void | |
lcd_puts(char *message) | |
{ | |
while(*message) | |
lcd_putc(*message++); | |
} | |
void | |
lcd_puts_P(char *message) | |
{ | |
char b; | |
while((b = pgm_read_byte(message++))) | |
lcd_putc(b); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment