#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <string.h>
#define RS PB1
#define E PB0
#define LCD_dir DDRB
#define LCD_port PORTB
void LCD_cmd(unsigned char cmd)
{
LCD_port=(LCD_port&0x0f)|(cmd&0xf0);
LCD_port&=~(1<<RS);
LCD_port|=(1<<E);
_delay_us(1);
LCD_port&=~(1<<E);
_delay_us(200);
LCD_port=(LCD_port&0x0f)|(cmd<<4);
LCD_port|=(1<<E);
_delay_us(1);
LCD_port&=~(1<<E);
_delay_ms(2);
}
void LCD_char(unsigned char ch)
{
LCD_port=(LCD_port&0x0f)|(ch&0xf0);
LCD_port|=(1<<RS);
LCD_port|=(1<<E);
_delay_us(1);
LCD_port&=~(1<<E);
_delay_us(200);
LCD_port=(LCD_port&0x0f)|(ch<<4);
LCD_port|=(1<<E);
_delay_us(1);
LCD_port&=~(1<<E);
_delay_ms(2);
}
void LCD_string (char *str)
{
for (int i=0; str[i] != 0; i++)
{
LCD_char(str[i]);
}
}
void LCD_string_pos(char *str, int line, int pos)
{
if ((line==1) && (pos<16))
LCD_cmd((pos&0x0f)|0x80);
else if((line=2) && (pos<16))
LCD_cmd((pos&0x0f)|0xc0);
while(*str)
LCD_char(*str++);
}
void LCD_string_int(int n, int line, int pos)
{
char buffer_LCD[10];
itoa(n, buffer_LCD, 10);
LCD_string_pos(buffer_LCD, line, pos);
}
void LCD_string_float(float n, int line, int pos)
{
char buffer_LCD[20];
dtostre(n, buffer_LCD, 5, 4);
LCD_string_pos(buffer_LCD, line, pos);
}
void LCD_clear()
{
LCD_cmd(0x01);
_delay_ms(2);
LCD_cmd(0x80);
}
void LCD_home()
{
LCD_cmd(0x02);
}
void LCD_init()
{
LCD_dir=0xff;
_delay_ms(20);
LCD_cmd(0x33);
LCD_cmd(0x32);
LCD_cmd(0x01);
LCD_cmd(0x28);
LCD_cmd(0x0C);
LCD_cmd(0x06);
LCD_cmd(0x1c);
_delay_ms(2);
LCD_cmd(0x80);
}
int main()
{
LCD_init();
LCD_cmd(0x80);
LCD_string("Dao Manh Tung");
LCD_cmd(0xc0);
LCD_string("ECE2022");
LCD_cmd(0x05);
while(1)
{
LCD_cmd(0x1c);
_delay_ms(500);
}
}