简单键盘扫描静态数码管显示总结
一、矩阵按键扫描
程序采用行列翻转扫描
void Key_Scan() //行列翻转式扫描
{
uchar a;
KEY=0x0F;
if(KEY!=0x0F)
{
Delayms(10); //消抖
if(KEY!=0x0F)
{
KEY=0x0F; //低四位为低电平;高四位为高电平
switch(KEY)
{
case(0x1f):Key_Value=0;break;
case(0x2F):Key_Value=1;break;
case(0x4F):Key_Value=2;break;
case(0x8F):Key_Value=3;break;
default:break;
}
KEY=0xf0; //低四位为高电平;高四位为低电平
switch(KEY)
{
case(0xf1):Key_Value=Key_Value;break;
case(0xf2):Key_Value=Key_Value+4;break;
case(0xf4):Key_Value=Key_Value+8;break;
case(0xf8):Key_Value=Key_Value+12;break;
default:break;
}
while((a<50)&&(KEY!=0x0f)) //检测按键是否松开
{
Delayms(100);
a++;
}
}
}
}
仿真现象:一般高电平置低容易,低电平置高难,而此仿真现象就为按键按下,I/O端口读取的就为高电平;(原因还未明白)
矩阵键盘扫描显示
二、独立键盘扫描显示
说明:数码管显示内容为00-59,其中有一个按键是定时器控制自加1
键盘扫描程序:
void Key_Scan()
{
if(ADD_1==0)
{
Delayms(10);
if(ADD_1==0)
{
Key_Units++;
if(Key_Units>9)
{
Key_Units=0;
Key_Tens++;
if(Key_Tens>5)
Key_Tens=0;
}
}
while(!ADD_1);
}
if(MINUS_1==0)
{
Delayms(100);
if(MINUS_1==0)
{
Key_Units--;
if(Key_Units<0)
{
Key_Units=9;
Key_Tens--;
if(Key_Tens<0)
{
Key_Tens =5;
}
}
}
while(!MINUS_1);
}
if(RESET==0)
{
Delayms(100);
if(RESET==0)
{
Key_Units=0;
Key_Tens =0;
}
while(!RESET);
}
if(AUTO_ADD_1==0)
{
Delayms(100);
if(AUTO_ADD_1==0)
{
TR0=~TR0;
}
while(!AUTO_ADD_1);
}
}
**注意:**我的困难在于当显示到59时,按键再次按下怎么让其显示到00;
总结:
1、为了能从59减到00,在做if条件语句判断的时候用到小于零的语句,考虑要把个位、十位定义为有符号的变量,在无符号变量的情况下程序实现的效果时不正确的。
2、加到大于九要清零,而非是等于九的时候清零;当为59加到00时,程序实现是在前面判断大于九个位清零的前提下;十位大于的时候也要清零,同样的不是在等于5的时候清零;
3、本次代码较好的思想是通过按键控制定时器0的运行控制位语句是用取反语句完成。