1602液晶显示屏不按程序显示

我昨天写了个程序,就是将矩阵键盘按下后将按钮上对应的数字显示在LCD1602屏幕上,程序不停地扫描矩阵键盘(废话 呵呵~ )当检测到有按钮按下后将flag置一,然后将此时的键盘编码给变量keycode,再通过numbersearch();函数找到相应按钮的对应数值,然后通过液晶显示出来(我设置的是读写一个字符后地址自动加一)。现在先不管别的,我有两块1602 LCD 其中一块是按下矩阵键盘按钮后屏幕第一行全部显示该数字! 另一块是数字随便乱显示!~ 搞了一天了,硬是不知道问题在哪儿~ 悬赏15分!
程序如下:
#include<stdio.h> //使用sprintf(); 时必须带上“标准输入输出头文件”
#include<reg51.h>
#include<math.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit RS=P2^6;
sbit RW=P2^5;
sbit LCDE=P2^7;
sbit STA7=P0^7;

bit flag=0;
uchar keycode,key=0xfe,str[3]={'A'};
uchar code num[]={
0xb7,0xbb,0xbd,0xbe,
0xd7,0xdb,0xdd,0xde,
0xe7,0xeb,0xed,0xee
};

uint numbersearch();
void keyscan();
void initdisplayer();
void write(uchar,uchar,uchar);
void busycheck();
void delay(uint);
void display();

main()
{
uint number;
initdisplayer(); //初始化液晶显示器
ag: keyscan();
flag=0;
P3=keycode;
number=numbersearch(); //返回相关按钮对应的数字给变量number
sprintf(str,"%d",number); //此处的number一定要是整型变量
display();
goto ag;
}

void initdisplayer()
{
write(0,0,0x0c); //开显示 不显示光标
write(0,0,0x06); //读写一个字符指针加一,屏幕不移动
write(0,0,0x01); //清屏
write(0,0,0x80+0x00); //初始化地址
}

void write(uchar R_W,uchar Dat_Cmd,uchar date)
{
busycheck();
RW=R_W;
RS=Dat_Cmd;
P0=date;
delay(5);
LCDE=1;
delay(5);
LCDE=0;
delay(10);
}

void delay(uint tt)
{
while(tt--);
}

void busycheck() //液晶控制器繁忙检测
{
bit temp;
RS=0;
RW=1;
do
{
LCDE=1;
temp=STA7;
LCDE=0;
}while(temp);
}

void keyscan()
{
while(!flag)
{
key=_crol_(key,1);
P2=key;
if(P2!=key)
{
delay(500);
if(P2!=key)
{
flag=1;
keycode=P2;
while(P2!=key); //松手检测
}
}
}
}

uint numbersearch()
{
uchar i;
for(i=0;i<=8;i++)
{
if(num[i]==keycode)
{
break;
}
}
return(i+1);
}

void display()
{
uchar i;
while(str[i]!='\0') //输出到液晶1602上
{
write(0,1,str[i++]);
}
}

看你的程序感觉很费劲,呵呵,我发一个我的程序给你吧!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2007-7-30 MON";
uchar code table1[]=" 00:00:00";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void init()
{
uchar num;
dula=0;
wela=0;
lcden=0;
// fen=59;
// miao=53;
// shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}

}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);

}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
/* if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}*/
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();

}

}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);

}
}
希望能帮助你,呵呵追问

这个是郭天祥视屏里面的始终程序,人家的东西能看懂,自己动手就出问题,你这样还是没有帮我解决问题 不过我自己已经发现了~ 程序里面有个小小滴逻辑错误,呵呵~

追答

颌,自己写到程序只有自己才好看。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-14
同求

刚刚买了一块1602的液晶屏,只有背光灯亮,液晶屏没有显示,并且调节对比...
楼主是否考虑过或验证过延时器程序与液晶屏有没有任何冲突呢?背光灯亮,说明高压板、背光灯管等等基本上没有问题,没有显示很可能是AD驱动板没有工作;从对比度不能调节这一点来看,有可能是AD驱动板的MCU工作异常,或它的电源部分不正常,使得AD板不能输出高电平去控制高压板的开关极(此时有背光,...

1602坏了怎么修
首先,检查电源线是否连接正常,尝试重新插拔连接线。如果问题仍然存在,可以尝试使用软件复位或者硬件复位来恢复显示屏的正常功能。另外,还可以尝试调整对比度和亮度设置,确保显示屏能够正常显示信息。此外,如果1602显示屏的背光功能失效,检查背光电路是否有问题,例如电源连接是否稳定等。综上所述,通过简单...

1602液晶屏显示时间。有时候不显示,一显示就是乱码,而且液晶屏的显示东...
检查晶振,还有工作电压,液晶屏与电路板是否接触好,最后就可能是程序问题,问题多样化,也不一定说的 清楚

AVR上面lcd1602只亮不显示,但是写入程序之后屏幕一直在闪烁
写个简单数字程序 看看先不显示数字 在检查一下温度传感器 其他都对 那就是温度传感器的问题 要不你现在开发板上面 看看 温度传感器好不好用!

1602液晶屏能显示数据, 就是不听使唤!!! ~高人求助, 我百度了好多,发现...
你好:首先说个比较明显的问题,你就写了一次数据就进入while(1),且不再做任何操作,请问你所描述的“不听使唤”是什么意思。

1602液晶显示模块不显示的问题
P0口需要上拉电阻,P3应该不需要上拉电阻。这种不显示的问题毛病不好找,建议还是看看硬件连接上。那个对比度调节应该有反应的。

为什么把程序烧进去后LCD1602显示一排黑色方块
1602液晶显示模块有个特性,就是在通电后,如果没有正确执行初始化操作,屏幕将会出现第一行点阵全部点亮、第二行点阵不亮的现象,此时除了初始化操作以外,1602液晶屏不接收其它操作指令。因此,在驱动1602液晶屏的时候出现这种情况,应该重点检查控制电路(单片机或者其它控制器)是否正确输出了初始化的信号...

51单片机 LCD1602只亮不显示东西
对于LCD1602不显示字符,一是先检查仿真电路对不对,再检查程序中定义的控制引脚与仿真图是否相符。因很多人都是从网上找的程序,与自己的仿真图并不相符,需要改程序的引脚定义,但没有改。二就是检查程序是不是写错了,虽然引脚定义对,但显示字符的程序不对。你没有发仿真图,所以,看程序是找不到...

1602液晶显示屏显示程序
1602液晶的程序我有,要做数字锁的话其实用到液晶也不多。因为你显示密码是时候不应该都是现实***吗?你只需把键盘写入的数据存在一个数组中,然后跟密码数组对比就好了。还有就是值得注意的是数据类型问题。输入的键值看你处理的方式而定,密码存放的格式,还有输出显示的是ascll码。注意转换。下面附带...

单片机LCD1602错误显示
在每输入数据之前,你得先确定当前的Address Counter(AC)记录的是不是你所想的,也就是第一个字符的DDRAM是不是对的,之后每输入一个数据,AC是自加1的。建议你下载HD44780的资料仔细看一遍,它是LCD的驱动IC,比直接看1602的资料在原理上会更清楚一些。

相似回答