51单片机独立按键

目录

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。

相关推荐
wuyk55530 分钟前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
梅名智34 分钟前
找不到libm.so, libc.so
嵌入式硬件
CPETW1 小时前
企业版配套软件介绍 ---- USB TO SPI 3.0-Slave
网络·科技·单片机·嵌入式硬件·电子
piaoyiren1 小时前
STM32 综合温控风扇控制系统
stm32·单片机·嵌入式硬件·oled·lcd1602·hc-05蓝牙
Echo_cy_3 小时前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
武汉万象奥科3 小时前
万象奥科OpenHarmony 6.1 LTS适配完成,RK3576核心板再添新生态
arm开发·嵌入式硬件·物联网·rk3576·arm核心板
亿道电子Emdoor4 小时前
【Arm】解决Keil MDK无法查看外设寄存器的问题
stm32·单片机·嵌入式硬件
BW.SU4 小时前
瑞佑RUI--工业UI,拖拽即成
stm32·单片机·51单片机·gui·人机界面·单片机可视化设计
染予6 小时前
上位机时间戳精度不够,时间无法对比怎么解决
单片机·嵌入式硬件
現実君6 小时前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发