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。

相关推荐
Polanda。8 分钟前
ADC-定时器触发
单片机·嵌入式硬件
Polanda。13 分钟前
ADC-常规序列的单通道转换
stm32·单片机·嵌入式硬件
紫竹苑主16 分钟前
VS Cose + PlatformIO +ESP32-S3 + ESPIDF开发环境安装卡壳持续等待问题解决
vscode·python·嵌入式硬件·物联网·硬件架构
weixin_4568083827 分钟前
【沁恒蓝牙开发】 LDE(外设)输出互补的PWM
单片机·嵌入式硬件
悠哉悠哉愿意1 小时前
【物联网学习笔记】按键
笔记·单片机·嵌入式硬件·物联网·学习
DLGXY1 小时前
STM32——PWM驱动舵机和直流电机、测量PWM频率和占空比、旋转编码器测速(十二)
stm32·单片机·嵌入式硬件
VekiSon1 小时前
Linux内核驱动——Ubuntu 网络启动环境配置与操作
linux·arm开发·嵌入式硬件·ubuntu
范纹杉想快点毕业2 小时前
嵌入式实时系统架构设计:基于STM32与Zynq的中断、状态机与FIFO架构工程实战指南,基于Kimi设计
c语言·c++·单片机·嵌入式硬件·算法·架构·mfc
恒锐丰小吕2 小时前
屹晶微 EG2003 中压200V半桥驱动芯片技术解析
嵌入式硬件·硬件工程
神一样的老师2 小时前
【RT-Thread Titan Board 开发板】RGB LCD屏测试
单片机·嵌入式硬件