#include < stdio.h>
#include < unistd.h>
#include < stdlib.h>
#include < fcntl.h>
#include < sys/mman.h>
#define DEV_NAME "/dev/mem" //MEMORY DEVICE
#define ADDROFLCD 0x10700000 //PHYSICAL ADDRESS OF CHARACTER LCD
#define BYTE_LEN 2 //SIZE OF BYTE for MEMORY
static
int
txtlcd_fd;
static
unsigned
int
*lcd;
void
set_command (unsigned
short
cmd)
{
cmd=cmd&0x00ff;
*lcd=cmd|0x0000;
*lcd=cmd|0x0400;
*lcd=cmd&0x0000;
usleep(50);
}
void
write_byte (
char
ch)
{
unsigned
char
data;
data = ch &0x00ff;
*lcd=data|0x100;
*lcd=data|0x500;
*lcd=data|0x100;
usleep(50);
}
void
set_func()
{
unsigned
short
cmd = 0x30;
cmd |= 0x08;
set_command (cmd);
}
void
ctrl_display ()
{
unsigned
short
cmd = 0x08;
cmd |= 0x04;
set_command(cmd);
}
void
shift_cursor (
int
set_scr ,
int
set_rshift)
{
unsigned
short
cmd = 0x10;
cmd = set_scr ? cmd | 0x08 : cmd;
cmd = set_rshift ? cmd | 0x04 : cmd;
set_command ( cmd );
}
void
set_entrymode ()
{
unsigned
short
cmd = 0x04;
cmd |= 0x2;
set_command ( cmd );
}
void
ret_home ()
{
unsigned
short
cmd = 0x02;
set_command (cmd);
}
void
clr_display()
{
unsigned
short
cmd = 0x01;
set_command (cmd);
usleep(2000);
}
void
set_ddr_addr(unsigned
char
pos)
{
unsigned
short
cmd = 0x80;
cmd |= (pos & 127);
set_command ( cmd );
}
void
init_lcd(unsigned
char
*addr)
{
txtlcd_fd = open(DEV_NAME , O_RDWR | O_SYNC);
if
(!txtlcd_fd)
{
printf
(
"device open failed\n"
);
exit
(-1);
}
addr = mmap(NULL,BYTE_LEN , PROT_WRITE , MAP_SHARED , txtlcd_fd , ADDROFLCD);
if
(addr == NULL)
{
close(txtlcd_fd);
printf
(
"memory map error\n"
);
exit
(-1);
}
lcd = (unsigned
int
*)addr;
set_func();
ctrl_display();
clr_display ();
ret_home();
set_entrymode();
}
void
close_lcd(unsigned
char
*addr)
{
lcd = NULL;
munmap(addr , BYTE_LEN);
close(txtlcd_fd);
}