本人不才,初接触单片机,8051f020开发板。想实现将一个4*4键盘的按键显示到液晶屏的功能,但是程序总是有问题,据我感觉跟延时有关,,其中的延时子程序是10ms延时。毛病是:按1 4 7 0的时候都显示1,按5的时候不稳定,一会是5,一会显示2!还请高手指教,代码附下:
#include<c8051F020.h>
#define uchar unsigned char
#define uint unsigned int
void dlms(void);
void kbscan(void);
void lcd_init(void);
uint DAT;
unsigned long x;
void lcd_init(void)
{
P3 = 0x08;
for(x=0;x<800;x++);
P0 = 0x3c; //功能设置,数据8位,两行显示,字型为5*10
P3 = 0x00;
P3 = 0x08;
for(x=0;x<2;x++);
P0 = 0x0e; //显示状态设置,整体显示开,光标显示,光标位字符不闪
P3 = 0x00;
P3 = 0x08;
for(x=0;x<2;x++);
P0 = 0x06; //输入方式为增量型,向右移位
P3 = 0x00;
P3 = 0x08;
for(x=0;x<2;x++);
P0 = 0x01; //清屏
P3 = 0x00;
P3 = 0x08;
for(x=0;x<60;x++);
}
void dlms(void)
{
for(x=0;x<400;x++);
}
main()
{ P0MDOUT = 0x80;
XBR2 = 0x40; //配置I/O端口
WDTCN = 0xde;
WDTCN = 0xad; //禁止看门狗定时器
for(x=0;x<400;x++);
lcd_init();
for(;;)
{
dlms();
kbscan();
}
}
void kbscan(void)
{
// uchar sccode;
P3 = 0x09;
P1 = 0x0f;
if((P1&0x0f)!= 0x0f)
{
for(x=0;x<400;x++);
while ((P1&0x0f)!= 0x0f) //确认有键被按下
{
// sccode = P1;
P1 = 0xef;
if((P1&0x0f)==0x0e) {DAT=1;break;}
if((P1&0x0f)==0x0d) {DAT=2;break;}
if((P1&0x0f)==0x0b) {DAT=3;break;}
if((P1&0x0f)==0x07) {DAT=4;break;}
for(x=0;x<400;x++);
P1 = 0xdf;
if((P1&0x0f)==0x0e) {DAT=5;break;}
if((P1&0x0f)==0x0d) {DAT=6;break;}
if((P1&0x0f)==0x0b) {DAT=7;break;}
if((P1&0x0f)==0x07) {DAT=8;break;}
for(x=0;x<400;x++);
P1 = 0xbf;
if((P1&0x0f)==0x0e) {DAT=9;break;}
if((P1&0x0f)==0x0d) {DAT=10;break;}
if((P1&0x0f)==0x0b) {DAT=11;break;}
if((P1&0x0f)==0x07) {DAT=12;break;}
for(x=0;x<400;x++);
P1 = 0x7f;
if((P1&0x0f)==0x0e) {DAT=13;break;}
if((P1&0x0f)==0x0d) {DAT=14;break;}
if((P1&0x0f)==0x0b) {DAT=15;break;}
if((P1&0x0f)==0x07) {DAT=16;break;}
for(x=0;x<400;x++);
P1=0x0f;
switch(DAT)
{
case 1:P0=‘1‘; break;
case 2:P0=‘2‘; break;
case 3:P0=‘3‘; break;
case 4:P0=‘+‘; break;
case 5:P0=‘4‘; break;
case 6:P0=‘5‘; break;
case 7:P0=‘6‘; break;
case 8:P0=‘-‘; break;
case 9:P0=‘7‘; break;
case 10:P0=‘8‘; break;
case 11:P0=‘9‘; break;
case 12:P0=‘*‘; break;
case 13:P0=‘0‘; break;
case 14:P0=‘C‘; break;
case 15:P0=‘E‘; break;
case 16:P0=‘/‘; break;
default: break;
}
for(x=0;x<20;x++);
P3 = 0x01;
P3 = 0x09;
// dlms();
// for(x=0;x<50000;x++);
// lcd_init();
}
}
}