51单片机LM1602的数据只能显示一个字符,在使用矩形键盘送数据的时候不能显示出来而是在显示初始位置上,达不到密码锁的效果,求解答。
#include<reg51.h>
sbit lcd_RS=P2^0;
sbit lcd_RW=P2^1;
sbit lcd_E=P2^2;
char key[]={0,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30}; //键值
char key2[]={0,0xc6,0xc7,0xc8,0xc9};
char table[]="password";
char table1[]="input:";
delay(unsigned int x) //延时
{ unsigned int i;
for(x=0;x<100;x++)
for(i=0;i<x;i++);
}
write_com(unsigned char com ) //写指令
{while(lcd_busy());
lcd_RS=0;
lcd_RW=0;
delay(200);
P0=com;
delay(200);
lcd_E=1;
delay(200);
lcd_E=0;
}
write_dat(unsigned char dat ) //写数据
{while(lcd_busy());
lcd_RS=1;
lcd_RW=0;
P0=dat;
delay(200);
lcd_E=1;
delay(200);
lcd_E=0;
}
lcd_busy()
{ unsigned char temp;
lcd_RS=0;
lcd_RW=1;
delay(20);
P0=0xff;
delay(20);
lcd_E=1;
delay(20);
temp=P0;
delay(20);
lcd_E=0;
return(temp&0x80);
}
init() //lcd 初始化
{ write_com(0x01);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
}
juxingjianpan() //矩形键盘
{ unsigned char KeyNumber,x,y;
P1=0x0f;
x=P1;
P1=0xf0;
y=P1;
switch(x+y)
{ case 0xee: KeyNumber=1;break;
case 0xde: KeyNumber=2;break;
case 0xbe: KeyNumber=3;break;
case 0x7e: KeyNumber=4;break;
case 0xed: KeyNumber=5;break;
case 0xdd: KeyNumber=6;break;
case 0xbd: KeyNumber=7;break;
case 0x7d: KeyNumber=8;break;
case 0xeb: KeyNumber=9;break;
case 0xdb: KeyNumber=10;break;
}
if(P1==0Xee)
{ if(P1==0Xee)
{ delay(5);
}
}
if(P1==0Xed)
{ if(P1==0Xed)
{ delay(5);
}
}
if(P1==0Xeb)
{ if(P1==0Xeb)
{ delay(5);
}
}
if(P1==0Xe7)
{ if(P1==0Xe7)
{ delay(5);
}
}
if(P1==0Xde)
{ if(P1==0Xde)
{ delay(5);
}
}
if(P1==0Xdd)
{ if(P1==0Xdd)
{ delay(5);
}
}
if(P1==0Xdb)
{ if(P1==0Xdb)
{ delay(5);
}
}
if(P1==0Xd7)
{ if(P1==0Xd7)
{ delay(5);
}
}
if(P1==0Xbe)
{ if(P1==0Xbe)
{ delay(5);
}
}
if(P1==0Xbd)
{ if(P1==0Xbd)
{ delay(5);
}
}
return KeyNumber;
}
main() //主函数;
{ unsigned int i,KeyNum,password;
init();
write_com(0x80);
for(i=0;i<8;i++)
{ write_dat(table[i]);
}
write_com(0xc0);
for(i=0;i<6;i++)
{ write_dat(table1[i]);
}
while(1)
{
write_com(0xc6);
KeyNum=juxingjianpan();
if(KeyNum)
{ if(KeyNum<=10)
{
write_dat(key[KeyNum]);
delay(5);
}
}
}
}