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。

相关推荐
FreakStudio8 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘13 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u1521096484913 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150013 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼13 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
wohoo_wangzi13 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘14 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展14 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司14 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑14 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习