目录
1.按键介绍

当P0.0接在开关一端,同时还接一个上拉电阻拉高电平,开关另一端接地,当如果开关是理想状态下,刚开始是高电平,然后按下开关,变成低电平,松开按钮,变成高电平,这个是理想状态下,但是实际中的开关,当按下开关瞬间有一个抖动,并不是马上就是低电平,而是一个不稳定状态的电平,可能刚开始低电平,然后变成高电平,又变成低电平,可能会执行多次低电平。
解决办法,一般按键抖动时间是5到10毫秒,所以需要延时一个5到10秒后再判断按键是否按下。
2.代码
c
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_POST P0
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY0_UNPRESS 0
void delay_50ms(u16 us) {
while(us--);
}
u8 key_scan(u8 mode) {
static u8 key = 1; //单次按下
if (mode) key = 1; //连续按下
if (key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)) {
delay_50ms(1000);
key = 0;
if (KEY1 == 0)
return KEY1_PRESS;
else if (KEY2 == 0)
return KEY2_PRESS;
else if (KEY3 == 0)
return KEY3_PRESS;
else if (KEY4 == 0)
return KEY4_PRESS;
}
else if (KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1) {
key = 1;
}
return KEY0_UNPRESS;
}
void main() {
u8 key = 0;
while(1) {
key = key_scan(0);
if (key == KEY1_PRESS)
LED1 =! LED1;
else if (key == KEY2_PRESS)
LED2 =! LED2;
else if (key == KEY3_PRESS)
LED3 =! LED3;
else if (key == KEY4_PRESS)
LED4 =! LED4;
}
}
3. 原理图

实现功能,当按键按下点亮LED,当按键按下熄灭LED。