上一篇我现已说过,12864和lcd1602其实多差不多,只需你按着时序编写,一般多不会有问题的。
假如发生了问题,一般没有严厉按着时序写的,特别是延时方面的。
程序:(在每次读写时多要查看忙信号)
#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(” 现在开端 “);
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/256692.html