+ -
当前位置:首页 → 问答吧 → 关于4*4键盘输入的问题???

关于4*4键盘输入的问题???

时间:2011-11-29

来源:互联网

在4*4键盘上输入0-F,在lcd上全部显示。
问题是,我按下1个键值但是再按其他的键时,前面的字符就不见了,直接显示按下的数值,我要的是在1排上显示0-F。
求高手指教!!谢谢!
下面附上我的程序:(应该怎么改)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
uchar code tab[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
uchar n=0,key;
void lcd_disp();
void lcd_init();
void write_com(uchar);
void write_data(uchar);
void delay(uint);
uchar key_scan();


void main()
{lcd_init();
while(1)
{P1=0x0f;
while(P1!=0x0f)  
{key=key_scan();
lcd_disp();
}
}
}
void lcd_disp()
{
write_com(0x80);
write_data(tab[key]);

}
void lcd_init()
{
write_com(0x38);
write_com(0x08);
write_com(0x06);
write_com(0x01);
write_com(0x0c);
}
void write_com(uchar com)
{
delay(20);
lcdrs=0;
lcdrw=0;
lcden=1;  
P0=com;
lcden=0;
}
void write_data(uchar dat)
{
delay(20);
lcdrs=1;
lcdrw=0;
lcden=1;
P0=dat;
lcden=0;
}
void delay(uint k)
{ uint i,j;
for(i=k;i>0;i--)
for(j=100;j>0;j--);
}

uchar key_scan()
{ unsigned char x,y,z,k;
 P1=0x0f;
 if(P1!=0x0f)
 {delay(10);
 if(P1!=0x0f)
 {x=P1;
  P1=0xf0;

 if(P1!=0xf0)
  {
  delay(10);
  if(P1!=0xf0)
  {
  y=P1;
  }

 z=x|y;
  }

while(P1!=0xf0);
switch(z)
{
case 0xee:k=0;break;
case 0xde:k=1;break;
case 0xbe:k=2;break;
case 0x7e:k=3;break;
case 0xed:k=4;break;
case 0xdd:k=5;break;  
case 0xbd:k=6;break;
case 0x7d:k=7;break;
case 0xeb:k=8;break;
case 0xdb:k=9;break;
case 0xbb:k=10;break;
case 0x7b:k=11;break;
case 0xe7:k=12;break;
case 0xd7:k=13;break;
case 0xb7:k=14;break;
case 0x77:k=15;break;  
}
 }
 }
 return k;
}  

作者: wfdzh   发布时间: 2011-11-29

呵呵,51的c代码你发这里,你太油菜了

作者: zzbinfo   发布时间: 2011-11-29

油菜

作者: cankoo   发布时间: 2011-11-29

和lcd间啥通讯协议?

作者: lhylhy   发布时间: 2011-11-29