LCD12864的屏总是在闪,我是用51单片机做的,屏带字库,补充里是整个程序,怎么解决?谢谢

#define FIRST_ADDR 0 //定义字符/汉字显示起始位置

unsigned char code zk[]={
0x08,0x20,0x1c,0x10,0x1c,0x1c,0xff,0x9e,0x7f,0x1e,0x1c,0x1f,0x3e,0x1f,0x3e,0x1f,
0x77,0x1f,0x41,0x3f,0x00,0x7e,0x00,0xfe,0x83,0xfc,0x7f,0xf8,0x3f,0xf0,0x0f,0xc0,
};

sbit sinA = P2^0; //信号A
sbit sinB = P2^1; //信号B

/*-----检查忙位----*/
void chk_busy()
{ RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x01)==0x01);
E=0;
}
/*--延时子程序---*/
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/*-写命令到LCD----*/
void write_com(unsigned char cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
cmdcode = ((cmdcode&0x01)<<7)|((cmdcode&0x02)<<5)|((cmdcode&0x04)<<3)|((cmdcode&0x08)<<1)|((cmdcode&0x10)>>1)|((cmdcode&0x20)>>3)|((cmdcode&0x40)>>5)|((cmdcode&0x80)>>7);
Lcd_Bus=cmdcode;
delay(5);//
E=0;
delay(5);
}
/*---写数据到LCD----*/
void write_data(unsigned char Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
Dispdata = ((Dispdata&0x01)<<7)|((Dispdata&0x02)<<5)|((Dispdata&0x04)<<3)|((Dispdata&0x08)<<1)|((Dispdata&0x10)>>1)|((Dispdata&0x20)>>3)|((Dispdata&0x40)>>5)|((Dispdata&0x80)>>7);
Lcd_Bus=Dispdata;
delay(5);///
E=0;
delay(5);
}
/*-----初始化LCD屏----*/
void lcdreset()
{ delay(0.1);
write_com(0x30);
delay(10); //选择基本指令集
write_com(0x30); //选择8bit数据流
delay(5);
write_com(0x0c); //开显示(无游标、不反白)
delay(10);
write_com(0x01); //清除显 delay(500);
write_com(0x06); //指定示的移位
delay(0);
}
/*-----自定义一个字符代码(一个星星和月亮)----*/
void CGRAM()
{ int i;
write_com(0x30);
write_com(0x40);
for(i=0;i<16;i++)
{write_data(zk[i*2]);
write_data(zk[i*2+1]);
}
}
/*-----显示字符串-----*/
void hzkdis(unsigned char code *s)
{ while(*s>0)
{ write_data(*s);
s++;
delay(50);
}
}
/*-----首屏显示---*/
void ceshi()
{write_com(0x01);//清除
delay(5);
if(sinA==0&&sinB==0)
{
write_com(0x98);//第一行
hzkdis("5555");
delay(2500);
}
if(sinA==1&&sinB==0)
{
write_com(0x98);//第二行
hzkdis("4444");
delay(2500);
}
if(sinA==1&&sinB==1)
{
write_com(0x98);//第三行
hzkdis("3333");
delay(3000);
}
if(sinA==0&&sinB==1)
{
write_com(0x98);//第四行
hzkdis("1111");
delay(2500);
}
{
write_com(0x80);//第一行
hzkdis("222");
delay(3000);
}
{
write_com(0x90);//第四行
hzkdis("123456");
delay(3000);
}
}

/*----清屏命令----*/
void clrscreen()
{
write_com(0x01);
delay(10);
}
main()
{
while(10)
{
PSB=0;
delay(10);
PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
CGRAM();
ceshi(); //显示测试字样
clrscreen(); //清屏
}
}
不是背光灯和电的问题,应该是刷新屏幕的延时,可是我总是找不到是那一项造成的,

看了你的程序,问题在while里面。没必要循环初始化你的LCD,将初始化程序放到主函数中。你的显示函数中也已经包含了清屏指令,不需要在while里面再次加入清屏指令。如果一定要用,建议你在所有清屏指令后加入的延时够大。清屏指令过多,延时太少的话,相当于清屏之后又写入,再清屏再写入,你看到的就是闪了。追问

您好,请问去掉那一段初始化清屏,是最后一段吗,我去掉后,就不显示了,请详述,非常感谢!!

追答

你在所有清屏指令后面加入延时1S的程序,然后看看闪烁是否得到缓解,如果有,就每去掉一清屏指令后的延时后看效果,这样就可以找到那个位置了。while循环里面的清屏,你放在主函数里面就可以了

追问

/*------------------清屏命令--------------------------*/

main()
{

while(1)
{
PSB=0;

PSB=1;
RW=0;
lcdreset(); //初始化LCD屏

ceshi(); //显示测试字样

}
}

这样还是闪,不好意思,我刚学,呵呵,还是没有完全弄明白,我的QQ976624836,谢谢1

追答

/*-----首屏显示---*/
void ceshi()
{write_com(0x01);//清除
delay(5); //这里修改一下
delay(3000);

if(sinA==0&&sinB==0)

/*----清屏命令----*/

void clrscreen()
{
write_com(0x01);
delay(10); //这里修改一下延时
delay(3000);
}

main()
{
PSB=0;
delay(10);
PSB=1;
RW=0;
lcdreset(); //初始化LCD屏
clrscreen(); //清屏

while(1)
{
//delay(3000);// 新加入的
// CGRAM();
delay(3000);// 新加入的
ceshi(); //显示测试字样
}
}
你先这样改了 看看还有闪没有 这里加的时间比较长 你可以适当改短 因为我不知道你的晶振是多少的 具体时间多少才合适你就自己改了 你先试试吧 一般如果不需要持续写入的话建议你就写一次 不要在while里重复的写

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-08
如果程序真的没有问题了,背景灯光闪烁,,,就是供电不足了!
第2个回答  2011-08-08
接触不良吧
第3个回答  2011-08-08
你可以参加一下

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网