Skip to content

Instantly share code, notes, and snippets.

@delamonpansie
Created August 24, 2011 07:40
Show Gist options
  • Save delamonpansie/1167510 to your computer and use it in GitHub Desktop.
Save delamonpansie/1167510 to your computer and use it in GitHub Desktop.
lcd driver
#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