根据线反转法扫描键盘返回的键值编码,查键值编码表,从而得到键值并送数码管显示,开机时显示“-”

行线接P1.0---P1.3, 列线接P1.4--P1.7,我这个程序编译没有错误,但是下载到单片机的时候,不管按哪个键,显示都是“0”,什么原因呢
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P27=P2^7;
uchar key;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e,0xbf};
uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};

void delay(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++);
}
}

uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0)
{
scan1=P1;
delay(30);

if((scan1&0xf0)!=0xf0)
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2;
for(j=0;j<16;j++)
{
if(keycode=key_code[j])
{
key=j;
return(key);
}
}
}
}
else
{
P1=0xff;
return(16);
}

}
void main()
{
P0=0xbf;
P27=0;
P1=0XFF;
while(1)
{

P1=0xf0;

if((P1&0xf0)!=0xf0)
{
keyscan();
P0=table[key];
}
}
}

if(keycode=key_code[j]) --应该是双等号。

试试下面的:

uchar keyscan()
{
uchar scan1, scan2;
P1 = 0xf0;
scan1 = P1;
if((scan1 & 0xf0) != 0xf0) {
scan1 = P1;
delay(30);
if((scan1 & 0xf0) != 0xf0) {
P1 = 0x0f;
scan2 = P1;
scan1 = scan1 | scan2;
for(scan2 = 0; scan2 < 16; scan2++)
if(scan1 == key_code[scan2]) return(scan2);
}
}
return(16);
}
void main()
{
uchar key;
P0 = 0xbf;
P27 = 0;
while(1) {
key = keyscan();
if(key < 16) P0 = table[key];
}
}
温馨提示:内容为网友见解,仅供参考
无其他回答

单片机中的4×4矩阵键盘的键值怎么求?
\/\/获取键值编码,由于确定哪个按键按下 uchar keyscan(void)\/\/键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;\/\/行列值 P3=0x0f; \/\/行线输出全为0 cord_h=P3&0x0f; \/\/读入列线值 if(cord_h!=0x0f) \/\/先检测有无按键按下 { delay(100); \/\/去抖 if(cord_...

一个四层电梯的PLC程序,毕业设计用!最好讲讲思路,谢谢!
由于电梯逻辑控制部分程序最大,而PLC运行采用周期扫描制,因而采用通常的查表方法,每次查表的指令时间间隔过长,不能满足给定曲线的精度要求。在PLC运行过程中,其PLC与各设备之间的信息交换、用户程序的执行、信息采集、控制量的输出等操作都是按照固定的顺序以循环扫描的方式进行的,每个循环都要对所有功能进行查询、判断...

一个四层电梯的PLC程序,毕业设计用!最好讲讲思路,谢谢!
由于电梯逻辑控制部分程序最大,而PLC运行采用周期扫描制,因而采用通常的查表方法,每次查表的指令时间间隔过长,不能满足给定曲线的精度要求。在PLC运行过程中,其PLC与各设备之间的信息交换、用户程序的执行、信息采集、控制量的输出等操作都是按照固定的顺序以循环扫描的方式进行的,每个循环都要对所有功能进行查询、判断...

相似回答