Read_busy(); //对LCD的每次读写都要读忙
RS=0; RW=0;
LCD_databus=command;
_nop_();
_nop_(); EN=1;
//EN由1----0锁存有效数据
_nop_();
_nop_(); EN=0; }
void write_LCD_data(uchar dat)//写数据函数 {
Read_busy(); RS=1; RW=0;
LCD_databus=dat; EN=1; _nop_(); _nop_(); EN=0; }
uchar Read_LCD(void) {
//选择数据
//EN由1----0锁存有效数据
//读数据函数
uchar value; Read_busy(); LCD_databus=0xFF; RS=1;
25
//先进行一次空读操作
}
RW=1; EN=1; _nop_(); _nop_(); EN=0;
LCD_databus=0xFF; RS=1; RW=1; EN=1;
value=LCD_databus; _nop_(); _nop_(); EN=0; return value;
//读取真正的数据
void Set_page(uchar page) 行点阵点 {
page=0xb8|page;
//设置“页”LCD12864共8页,一页是8
//页的首地址为0xB8
write_LCD_command(page); }
void Set_line(uchar startline) //设置显示的起始行 {
startline=0xC0|startline; //起始行地址为0xC0
write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示 }
26
void Set_column(uchar column) //设置显示的列 {
column=column &0x3f; column= 0x40|column;
//列的最大值为64
//列的首地址为0x40 //规定显示的列的位置
write_LCD_command(column); }
void SetOnOff(uchar onoff) 开显示 { }
onoff=0x3e|onoff;
//显示开关函数:0x3E是关显示,0x3F是
//onoff:1---开显示;0---关显示
write_LCD_command(onoff);
void SelectScreen(uchar screen) //选择屏幕 {
switch(screen) {
case 0: CS1=0;CS2=0;break; //全屏 case 1: CS1=0;CS2=1;break;//左半屏 case 2: CS1=1;CS2=0;break;//右半屏 default:break; } }
void ClearScreen(uchar screen) //清屏函数 {
uchar i,j;
SelectScreen(screen);
//0--全屏;1---左半屏;2---右半屏
for(i=0;i<8;i++) //控制页数0-7,共8页
27
{
Set_page(i);
Set_column(0);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
write_LCD_data(0x00); //写入0,地址指针自加1 } } }
void init_LCD() { }
void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p) {
//LCD的初始化
SetOnOff(1); SelectScreen(0);
//开显示
ClearScreen(0); Set_line(0);
//清屏
//开始行:0
uchar i;
SelectScreen(screen); Set_page(page); Set_column(column); for(i=0;i<8;i++) { }
Set_page(page+1); Set_column(column);
28
//显示字符上半部分:8*8
write_LCD_data(p[i]); //纵向取模,字节倒序
//显示字符下半部分:8*8
}
for(i=0;i<8;i++) { }
write_LCD_data(p[i+8]);
void Display_HZ(uchar screen,uchar page,uchar column,uchar *p) {
uchar i;
SelectScreen(screen); Set_page(page);
//写上半页:16*8 //控制列
//控制16列的数据输出
Set_column(column*16); for(i=0;i<16;i++) { }
Set_page(page+1);
write_LCD_data(p[i]); //汉字的上半部分
//写下半页:16*8
//控制列
//控制16列的数据输出
Set_column(column*16);
for(i=0;i<16;i++) }
{ }
write_LCD_data(p[i+16]); //汉字的下半部分
void Display_picture(uchar a[][64])//显示图形—128*64大小 {
uchar i,j;
for(j=0;j<8;j++) {
29