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

#defineFIRST_ADDR0//定义字符/汉字显示起始位置unsignedcharcodezk[]={0x08,0x20,0x1c,0x10,0x1c,0x1c,... #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(); //清屏
}
}
不是背光灯和电的问题,应该是刷新屏幕的延时,可是我总是找不到是那一项造成的,
展开
 我来答
百度网友c7ad623
2011-08-08 · 超过30用户采纳过TA的回答
知道答主
回答量:109
采纳率:0%
帮助的人:49.4万
展开全部
看了你的程序,问题在while里面。没必要循环初始化你的LCD,将初始化程序放到主函数中。你的显示函数中也已经包含了清屏指令,不需要在while里面再次加入清屏指令。如果一定要用,建议你在所有清屏指令后加入的延时够大。清屏指令过多,延时太少的话,相当于清屏之后又写入,再清屏再写入,你看到的就是闪了。
更多追问追答
追问
您好,请问去掉那一段初始化清屏,是最后一段吗,我去掉后,就不显示了,请详述,非常感谢!!
追答
你在所有清屏指令后面加入延时1S的程序,然后看看闪烁是否得到缓解,如果有,就每去掉一清屏指令后的延时后看效果,这样就可以找到那个位置了。while循环里面的清屏,你放在主函数里面就可以了
dagehui
2011-08-08 · TA获得超过226个赞
知道小有建树答主
回答量:92
采纳率:0%
帮助的人:106万
展开全部
如果程序真的没有问题了,背景灯光闪烁,,,就是供电不足了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7ecdbdad54
2011-08-08 · 超过13用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:40.5万
展开全部
接触不良吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友647f507
2011-08-08 · TA获得超过1582个赞
知道小有建树答主
回答量:709
采纳率:0%
帮助的人:407万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式