微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 12864读写程序

12864读写程序

时间:11-28 来源:互联网 点击:
上一篇我已经说过,12864lcd1602其实多差不多,只要你按着时序编写,一般多不会有问题的。

如果发生了问题,一般没有严格按着时序写的,特别是延时方面的。

程序:(在每次读写时多要检查忙信号)

#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(" 现在开始 ");

}

上一篇:I2C通讯的C语言程序
下一篇:学习总结

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top