想要实现的是矩阵键盘某键按下时,其键值显示于动态数码管,且每按一个键数字向左移动一位,新的数字出现在最右侧
但连接后矩阵键盘显示的数字不对应 且输入一个数字后所有的数字都变为同一数字
矩阵键盘的判断是按照课上讲的写的不知道有没有问题 但是显示数码管的函数测试是没问题的
问题大概率出在Keydown里
#include "REG51.h"
#include "intrins.h"
#define Key P1
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2; //定义数码管位选信号控制脚(和138译码器)
unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//动态数码管显示0~F
unsigned char Dig[8]={0,0,0,0,0,0,0,0};
void Keydown(void); //按键扫描函数
char KeyValue;
char j;
void delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void InitTimer1(void)//timer1初始化
{
TMOD |= 0x10; //设置TMOD值,定时器1,工作方式1
TH1 = 0xEC;
TL1 = 0x78; //初值5ms
EA = 1; //全局中断开
ET1 = 1; //定时器1中断开
TR1 = 1; //启动定时器1
}
main()
{
while(1)
{
Keydown();
}
}
void Keydown()
{
int a=0;//计算按键时间 t=10ms*a
Key=0x0f;
if(Key!=0x0f)//读取按键是否按下
{
delay10ms();//消抖
if(Key!=0x0f)
{ //测试列
Key=0X0F;
switch(Key)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
}
Key=0XF0;
switch(Key)
{//测试行
case(0X70): KeyValue+=3;break;
case(0Xb0): KeyValue+=2;break;
case(0Xd0): KeyValue+=1;break;
case(0Xe0): break;
}
while((a<50)&&(Key!=0xf0))//松手检测
{
delay10ms();//延时10ms,500ms后开始新的检测
a++;
}
for(j=0;j<7;j++)
{
Dig[j]=Dig[j+1];//更新显示值
}
Dig[7]=KeyValue;
InitTimer1();
}
}
}
void Timer1(void)interrupt 3 //定时器1 用于显示动态数码管
{
static char i;
TH1 = 0xEC;
TL1 = 0x78; //初值5ms
P0=0x00;
switch(i)
{
case 0:LSC=1;LSB=1;LSA=1;
if(Dig[7]!=16)
{
P0=num[Dig[7]];
}
break;
case 1:LSC=1;LSB=1;LSA=0;
if(Dig[6]!=16)
{
P0=num[Dig[6]];
}
break;
case 2:LSC=1;LSB=0;LSA=1;
if(Dig[5]!=16)
{
P0=num[Dig[5]];
}
break;
case 3:LSC=1;LSB=0;LSA=0;
if(Dig[4]!=16)
{
P0=num[Dig[4]];
}
break;
case 4:LSC=0;LSB=1;LSA=1;
if(Dig[3]!=16)
{
P0=num[Dig[3]];
}
break;
case 5:LSC=0;LSB=1;LSA=0;
if(Dig[2]!=16)
{
P0=num[Dig[2]];
}
break;
case 6:LSC=0;LSB=0;LSA=1;
if(Dig[1]!=16)
{
P0=num[Dig[1]];
}
break;
case 7:LSC=0;LSB=0;LSA=0;
if(Dig[0]!=16)
{
P0=num[Dig[0]];
}
break;
}
i++;
if(i>=8) i=0;
}