51单片机第4篇章-独立按键

追求以通俗的语言让小白可以更容易上手学单片机,在此同时巩固知识(很多图片来自江科大和普中,作者也是学这个来的,只是通过自己的语言想把它复述出来)。

独立按键的入门学习

什么是独立按键?

简介

独立按键
如图所示

51单片机第4篇章-独立按键_第1张图片

 

在单片机的位置

 

独立按键,按键,顾名思义就是按键按下松开会有一定作用;独立则区分于后面的矩阵按键,独立就是指按键单纯由某个引脚端控制,不收其他的干扰,后面矩阵按键会提及。

硬件引脚图

51单片机第4篇章-独立按键_第2张图片

 

可见独立按键的输入端接入到了单片机芯片的P3^0-P3^3四个脚。
四个端为上拉电阻,默认为高电平,按钮的另一端接了地
当按下按键时,P3~X=0
当松开按键时,P3~X=1

区别于前面的LED,蜂鸣器,数码管

前面的这些部件,都是用编程去驱动,通过高低电平去驱动部件的工作
而独立按键的设计,是用外部(按下按键或松开),监测高低电平的同时通过条件判断去执行操作
所以,这部分的学习,核心是掌握如何用编程实现检测是哪个按键按下了,松开了

独立按键的独特点

抖动的电平

与理想预期的波形不同,独立按键受硬件自身影响,按下时会有抖动,成为一个重要的知识点
它的影响是,如果你根据去判断按下按键否,抖动的过程有多个高低电平的波动,
那么监测了多次0/1,会导致执行操作时,让操作不符合预期地执行很多次。所以必须实现“消抖”!

51单片机第4篇章-独立按键_第3张图片

 

如何消抖

硬件消抖

怎么实现呢,博主没有深入去学,根据视频的理解,就是外接一个含电容的电路,由于电容的特性,
从接通到饱和,从饱和到接通,都会有效果的延迟,所以读者可以理解为电容使得延迟,避开了抖动
但由于电容电路的设置不适合单片机小白,所以不考虑用此硬件消抖。

51单片机第4篇章-独立按键_第4张图片

 

软件消抖

怎么实现呢,前面可能也看过博主文章中写了延时函数,后面会补充延时函数的语法和用法
这里直接用。
由测试知道,大概每次抖动会有10ms以内,那么当按下时,先进行10ms的延时函数,再执行按键识别0/1,
则可以跳过这个抖动,到稳定的状态,如果没有按下/松开--则为高电平,如果按下了--则为低电平

51单片机第4篇章-独立按键_第5张图片

{Delay(10);while(P3_2=0);Delay(10);key=3;}
这是一个完整的识别过程
如果按键一直没有松开,但又不确定要按下多久,后面要返回东西,那就while(P3_2=0);
当松开时,while就没了,就可以继续走下去消除下个抖动
最好把key赋值,整个函数返回一个key,这个key就代表这第几个按键按下了对应的值,
利于后面的操作

独立按键实现小设计

  1. 最简单的-监测第一或第二个按键亮对应的LED灯(无消抖,比较粗糙,适合新人先get独立按键效果)

    while(1) {
	if(P3_1==0||P3_0==0) {
		if(P3_1==0) {
			P2_1=0;
		}
		if(P3_0==0) {
			P2_0=0;
		}
	}
	else{P2=0XFF;}
    }

2.实现有消抖的监测按键亮对应的LED灯

   #include 
#include "Delay.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit key1=P3^1;
sbit key2=P3^0;


u8 key_scan(){
if(key1==0||key2==0||key3==0||key4==0){
Delay(10);//消抖
if(key1==0)
{return 1;}
else if(key2==0)
{return 2;}
}
else return 0;
 }
void main(){
u8 key=0;
P2=0XFF;
while(1)
{
key=key_scan();
 if(key==1)
{
 LED1=0;
}
else if(key==2)
{
 LED2=0;
}
else P2=0XFF;
}
 }

你可能感兴趣的:(单片机,嵌入式硬件,51单片机)