void init_port();
void data(char);
void control(char);
void dely(long);
void init_lcd();
void write_data(char);
void write_command(char);
void write_string(char);
void create_char(char location, volatile char array1[]);
void write_char(char);
void write_userchar();
void setup() {
volatile char userchars[4][8] = {
{0x00, 0x0A, 0x0A, 0x00, 0x11, 0x0E, 0x00, 0x00},
{0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00, 0x00},
{0x00, 0x04, 0x0E, 0x1F, 0x0E, 0x04, 0x00, 0x00},
{0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x00}};
init_port();
init_lcd();
for (char i = 0; i < 4; i++) {
create_char(i, userchars[i]);
}
write_command(0x80); //set ddram address 0
write_userchar();
write_string(" LCD ");
write_userchar();
dely(1500);
init_lcd();
write_command(0x84); //custom address of 1st line
write_string("HELLO...");
write_command(0xc0); //custom address of 2nd line
write_string("Welcome to Earth");
write_command(0x0c); //turn cursor and blink off
while(1){
write_command(0x18); //shift display to left
dely(50);
}
}
void init_port(){
volatile char *Fdir=(volatile char *)0x30, *Kdir=(volatile char *)0x107;
*Fdir=0x03; *Kdir=0xff;
}
void data(char ad1){
volatile char *Kout=(volatile char *)0x108;
*Kout=ad1;
}
void control(char ad2){
volatile char *Fout=(volatile char *)0x31;
*Fout=ad2;
}
void dely(long ms){
for(volatile long g=0; g<(ms*1000); g++);
}
void write_data(char let){
data(let);
control(0x02); //RS=1
dely(1);
control(0x03);
dely(1);
control(0x02);
dely(1);
}
void write_command(char adr){
data(adr);
control(0x00); //RS=0
dely(1);
control(0x01);
dely(1);
control(0x00);
dely(1);
}
void init_lcd(){
write_command(0x38); //8 bit 2 line
write_command(0x0c); //cursor off
write_command(0x01); //clear disp
write_command(0x06); //cursor moves right without shift
}
void write_string(char *name) {
while (*name != '\0') {
write_data(*name);
dely(5);
name++;
}
}
void create_char(char location, volatile char array1[]) {
for (volatile char j = 0; j < 8; j++) {
write_command(0x40 + (location * 0x08) + j);
write_data(array1[j]);
}
}
void write_char(char location){
write_command(0x80);
write_data(location);
}
void write_userchar(){
for (volatile char i = 0; i < 4; i++) {
write_data(i);
dely(50);
}
}