上一篇我已经说过,12864和lcd1602其实多差不多,只要你按着时序编写,一般多不会有问题的。如果发生了问题,一般没有严格按着时序写的,特别是延时方面的。
本文引用地址:https://www.eepw.com.cn/article/201611/323059.htm程序:(在每次读写时多要检查忙信号)
#define uchar unsigned char
#define uint unsigned int
#define Lcd_Bus P0 //MCU P2<------> LCM
sbit RS_12 = P3^5;
sbit RW_12 = P3^6;
sbit E_12 = P3^7;
void chk_busy(); //检查忙
void write_com(uchar cmdcode) ; // 写命令 写地址时先行后列
void write_data(uchar Dispdata) ; // 写数据
uchar read_data(void) ; //读数据 第一个字节要读两次,也就是要读三次,最后两次是所要的,第一次,地址自动加1,写也是如此
void lcdreset(); //12864初始化
void hzkdis(unsigned char code *s); //显示字符串
void Disp_Img(uchar code *img) ; //绘图
void clrgdram(); //清除整个空间
void clrscreen(); //清屏,包括地址
void ceshi() ; //首屏显示
void chk_busy()
{ RS_12=0;
RW_12=1;
E_12=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
E_12=0;
}
void write_com(uchar cmdcode)
{
chk_busy();
RS_12=0;
RW_12=0;
E_12=1;
Lcd_Bus=cmdcode;
delay10(1);////////////////////在数据写入的时候加入适当的延时
E_12=0;
delay10(1);;
}
void write_data(uchar Dispdata)
{
chk_busy();
RS_12=1;
RW_12=0;
E_12=1;
Lcd_Bus=Dispdata;
delay10(1); //在数据写入的时候加入适当的延时
E_12=0;
delay10(1);
}
uchar read_data(void)
{
uchar da=0x00;
chk_busy();
Lcd_Bus=0xff;
RS_12=1;
RW_12=1;
E_12=1;
delay10(1);
da=Lcd_Bus;
E_12=0;
delay10(5);
return(da);
}
void lcdreset()
{ delayns(2);
write_com(0x30);
delay10(1); //选择基本指令集
write_com(0x30); //选择8bit数据流
delay10(1);
write_com(0x0c); //开显示(无游标、不反白)
delay10(1);
write_com(0x01); //清除显示,并且设定地址指针为00H
delayns(1);
write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delayns(2);
}
void hzkdis(unsigned char code *s)
{ while(*s>0)
{ write_data(*s);
s++;
delay10(3);
}
}
void Disp_Img(uchar code *img)
{ unsigned int j=0;
unsigned char x,y,i;
for(i=0;i<9;i+=8)
for(y=0;y<32;y++)
for(x=0;x<8;x++)
{ write_com(0x36);//功能设置---8BIT控制界面,扩充指令集
write_com(y+0x80); //行地址
write_com(x+0x80+i); //列地址
write_com(0x30);
write_data(img[j++]);
write_data(img[j++]);
}
}
void clrgdram()
{ unsigned char x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{ write_com(0x34);
write_com(y+0x80); //行地址
write_com(x+0x80); //列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
void clrscreen()
{
write_com(0x01);
delay10(3);
}
void ceshi()
{write_com(0x01);//清除显示,并且设定地址指针为00H
delay10(1);
write_com(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis(" 欢迎光临 ");
write_com(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
hzkdis(" 这里是B 12组 ");
write_com(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
hzkdis(" 恒温装置实验 ");
write_com(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
hzkdis(" 现在开始 ");
}
评论