独立按键,按下时为0,松开时为1。
下面结合数码管,编写一段程序。按键按下时,数码管加1显示,显示到9时,从0再开始计数。
#include <reg52.h>
#define uint8 unsigned char
//段选锁存控制位p2.6 位选锁存控制位p2.7
sbit DU=P2^6;
sbit WE=P2^7;
//数码管0-9的16进制
uint8 num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit KEY =P3^4;
void main()
{
int i=0;
/*选定一个数码管显示0*/
DU=1;
P0=num[0];
DU=0;
WE=1;
P0=0xfe;
WE=0;
while(1)
{
if(KEY==0)//按键按下时
{
i++;
if(i==10)
i=0;
DU=1;
P0=num[i];
DU=0;
}
}
}
按照理想状态下,程序会按照我们所想的执行,但是在实际实验现象中,却不是这样,按下按键时候,数码管显示却好像是随机数据,为什么这样呢?
原来在按键按下和松开时,会有一定时间的抖动,造成数据不稳定,如图所示
所以我们应该在按键处于稳定状态在进行判断操作即可。抖动的事件大概在10ms左右。我们可以做个延迟来进行消抖。
#include <reg52.h>
#define uint8 unsigned char
//段选锁存控制位p2.6 位选锁存控制位p2.7
sbit DU=P2^6;
sbit WE=P2^7;
//数码管0-9的16进制
uint8 num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void Delay()//简单的10ms延时
{
int i=1000;
for(;i>0;i--);
}
sbit KEY =P3^4;
void main()
{
int i=0;
bit kb=0;//暂存按键值
bit kk=0;//最后按下的状态
/*选定一个数码管*/
DU=1;
P0=num[0];
DU=0;
WE=1;
P0=0xfe;
WE=0;
while(1)
{
kb=KEY;//存取当前按键状态
if(kb!=kk)//和上一次按键动作做比较,如不相等则按键有动作
{
Delay();//延迟10ms
if(KEY==1 && KEY==kb)
{/*按键经过10ms无变化,说明经过了按键弹起*/
i++;
if(i==10)
i=0;
DU=1;
P0=num[i];
DU=0;
}
kk=KEY;
}
}
}
这次在经过实验即可得到我们想要的结果。