【51单片机】程序实验5&6.独立按键-矩阵按键

主要参考学习资料:B站【普中官方】51单片机手把手教学视频

前置知识:C语言

单片机套装:普中STC51单片机开发板A4标准版套餐7

码字不易,求点赞收藏加关注(´•ω•̥`)

有问题欢迎评论区讨论~

独立按键

按键介绍

一个按键拥有四个脚,其中①和②、③和④之间初始导通,而①和③、②和④之间只有按下按键才会导通。

在下拉电阻作用下,按键所处管脚默认为高电平,当按下按键时线路接地变成低电平。

在实际情况中,按键的状态切换过程存在抖动,而不是在高低电平之间瞬时、稳定地切换。由于抖动过程中的电平变化会造成按键状态的误判,因此需要采取消抖措施,有软件消抖和硬件消抖两种方法:

软件消抖根据实际经验估计抖动时间在5~10ms,于是可以在检测到第一次低电平后延时10ms再次检测,若仍为低电平可认为按键已处于按下状态。

硬件消抖在电路上并联滤波电容,利用按下按键后给电容充电的时间来滤除抖动影响。

由于硬件消抖占用的电路面积较大且产生的成本较高,在实际开发应用中通常使用软件消抖。

实验5 独立按键

实现功能:通过开发板上的独立按键K1控制D1指示灯的亮灭。

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

//定义四个按键的控制管脚
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;

//定义D1指示灯的控制管脚
sbit LED1 = P2^0;

//延时函数
void delay_10us(u16 time)
{
   
   
	while(time --);
}

/*
按键扫描函数
扫描有两种方式:一种只对按下瞬间扫描,不考虑按下后是保持还是松开(点按控制);另一种为持续扫描按键按下的状态(长按控制)
mode参数决定该函数采用哪种扫描,0为点按,1为长按
*/
u8 key_scan(u8 mode)
{
   
   
    //定义控制是否检测按下状态的变量,1检测,0不检测,注意静态变量赋值只生效一次
	static u8 key = 1;
    //如果为长按扫描则检测按下状态
	if(mode)
		key = 1;
    //如果需要检测按下状态且有按键按下(低电平),则消抖后再检测具体是哪个按键被按下
	if(key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))
	{
   
   
		key = 0; //重置key变量默认下一次不需要检测按下状态
		delay_10us(1000); //消抖
        
        //检测到哪个按键按下则返回对应的按键序号
		if(KEY1 == 0)
			return 1;
		else if(KEY2 == 0)
			return 2;
		else if(KEY3 == 0)
			return 3;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值