问题遇到的现象和发生背景
矩阵键盘按键 数码管显示0-F
问题相关代码,请勿粘贴截图
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
// 按键0—F静态显示
sbit dula=P2^6; //申明U1锁存器锁存端
sbit wela=P2^7; //U2
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num) //显示函数只送段选数据
{
P0=table[num];
dula=1;
dula=0;
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe; //选中第一行1111 1110
temp=P3; //读数据
temp=temp&0xf0; //与1111 0000相与,高四位有低电平,temp值发生改变
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: key=0;break; // 1110 1110 1行1列
case 0xde: key=1;break; // 1101 1110 2行1列
case 0xbe: key=2;break; // 1011 1110 3行1列
case 0x7e: key=3;break; // 0111 1110 4行1列
}
while(temp!=0xf0) //等待按键释放 等高四位无低电平跳出while
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/***************************************/
P3=0xfd; //选中第2行1111 1101
temp=P3; //读数据
temp=temp & 0xf0; //与1111 0000相与,高四位有低电平,temp值发生改变
if(temp != 0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp != 0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: key=4;break; // 1110(低四位) 1101(高四位) 1列2行
case 0xdd: key=5;break; // 1101 1101 2列2行
case 0xbd: key=6;break; // 1011 1101 3列2行
case 0x7d: key=7;break; // 0111 1101 4行2列
}
while(temp!=0xf0) //等待按键释放 等高四位无低电平跳出while
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/***************************************/
P3=0xfb; //选中第3行1111 1011
temp=P3; //读数据
temp=temp&0xf0; //与1111 0000相与,高四位有低电平,temp值发生改变
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: key=8;break; // 1110(低四位) 1011(高四位) 1列3行
case 0xdb: key=9;break; // 1101 1011 2列3行
case 0xbb: key=10;break; // 1011 1011 3列3行
case 0x7b: key=11;break; // 0111 1011 4行3列
}
while(temp!=0xf0) //等待按键释放 等高四位无低电平跳出while
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
/***************************************/
P3=0xf7; //选中第4行1111 0111
temp=P3; //读数据
temp=temp&0xf0; //与1111 0000相与,高四位有低电平,temp值发生改变
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: key=12;break; // 1110(低四位) 0111(高四位) 1列4行
case 0xd7: key=13;break; // 1101 0111 2列4行
case 0xb7: key=14;break; // 1011 0111 3列4行
case 0x77: key=15;break; // 0111 0111 4行4列
}
while(temp!=0xf0) //等待按键释放 等高四位无低电平跳出while
{
temp=P3;
temp=temp & 0xf0;
}
display(key);
}
}
}
void main()
{
P0=0; //关闭所有数码管段选
dula=1;
dula=0;
P0=0xc0; //位选中所有数码管
wela=1;
wela=0;
while(1)
{
matrixkeyscan(); //不停的调用键盘扫描
}
}
//0xc0 1100 0000
运行结果及报错内容
仿真仅第一行按键有效,其他行按下为0,或者没反应
我的解答思路和尝试过的方法
进行相同模块代码对照,未发现错误i