关于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;
}
问题是,我按下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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28