判断按键是否按下,当按下时I/O口电平为低,不按时为高。
它的检查过程是:先给对应的I/O口置1,再读这个I/O口,若还是1,说明没按下,若是0说明按下了。
左是软件消抖,右是硬件消抖;
代码实现:按键按下数码管改变,二极管闪亮
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;//一个按键IO
sbit led0=P0^0;//发光二极管IO
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{
uchar num;
P3=0xff;
while(1)
{
//检查是否按下
if(key1==0)
{
delay_50us(200);//第一阶段消抖
if(key1==0)
{
num++;//数码管控制
led0=0;//二极管发亮
//只有一个二极管发亮所以不能超过10
if(num==10)
num=0;
while(!key1);//检查是否松开按键
}
delay_50us(200);//第二阶段消抖
while(!key1);//再次确认是否松开按键
}
else
led0=1;
P1=smg_du[num];
}
}