大家好,上一篇我们一起学习了数码管的理论基础和代码书写思路,并学会数码管如何应用——多参数分时显示,今天我们将一起学习独立按键的基本理论和相关应用。
我的人生格言:“尽最大努力,做最好的自己!”
独立按键1
一、按键介绍
1.按键图
独立按键一端接I/O口,另一端接地。
看下图为独立按键模块,按键左端统一接P3口,右端均接地:
key1接P3^0,
key2接P3^1,
key3接P3^2,
key4接P3^3。
2.按键抖动
按键写代码一定要注意抖动。
按键按下时,由于一端接地,会使按键接IO端变成低电平,相反,当按键被松开时,由于按键接IO端与接地端断开,会变成高电平。值得注意的是,按键是有一定弹性的,按键在按下时,按键接IO端变成低电平需要时间,这段时间按键会发生前沿抖动,同理,松开按键,按键接IO端变成高电平也需要一段时间,这段时间按键会发生后沿抖动,整个抖动需要5ms-10ms时间。 |
3.按键消抖
按键抖动大致有两个方向解决,分别为硬件消抖和软件消抖
1.硬件消抖
加一个电路,可以利用触发器等进行电路过滤。
2.软件消抖
(1)利用延时函数消抖。
(2)利用定时器精准消抖。
(2)中断法消抖
本章先我们简单使用延时函数进行代码讲解,后续会讲其他方法。
二、相关运用
1.简单实现按键控制8个LED的亮灭
(1)仿真图1
(2)代码1
key.c
这是按键控制模块,当按下key1的按键时,该模块函数key()会返回一个值,这个值表示第一个按键被按下。
#include "key.h"//独立键盘头文件
#include "delay.h"//延时头文件
/******************************************************************************************
函数名:key
功能: 独立键盘函数
参数: 无
返回值:unsigned char
******************************************************************************************/
unsigned char key()//独立键盘按键函数
{
unsigned char temp=0;
if(key1==0)//判断是否按下键盘
{
delay(10);//消抖
if(key1==0)//再次判断是否按下键盘
{
temp=1;//键盘按下,中间值temp赋为1
}while(key1==0);//松手等待
}
return temp;//返回中间值
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include <reg51.h>//51头文件
sbit key1=P3^0;//与键盘连接的IO设置为key1
unsigned char key();//独立键盘函数声明
#endif
main.c
#include <reg51.h>//51头文件
#include "key.h"//独立键盘头文件
void main()
{
while(1)
{
if(1==key())//判断返回值是否为1
{
P1=~P1;
}
}
}
2.按键显示数值
(1)仿真图2
开始默认界面:
按第二个按键key2,显示数值2:
(2)代码2
key.c
/******************************************************************************************
函数名:key
功能: 独立键盘函数
参数: 无
返回值:unsigned char
******************************************************************************************/
unsigned char key()//独立键盘按键函数
{
static unsigned char temp=0;
//方法一:
/***if(key1==0)//判断是否按下键盘
{
delay(10);//消抖
if(key1==0)//再次判断是否按下键盘
{
temp=1;//键盘按下,中间值temp赋为1
}while(key1==0);//松手等待
}
if(key2==0)
{
delay(10);
if(key2==0)
{
temp=2;
}while(key2==0);
}
if(key3==0)
{
delay(10);
if(key3==0)
{
temp=3;
}while(key3==0);
}
if(key4==0)
{
delay(10);
if(key4==0)
{
temp=4;
}while(key4==0);
}
**/
//方法二:
if(key1==0||key2==0||key3==0||key4==0)
{
delay(10);
if(key1==0||key2==0||key3==0||key4==0)
{
if(key1==0)
temp=1;
if(key2==0)
temp=2;
if(key3==0)
temp=3;
if(key4==0)
temp=4;
}while(key1==0||key2==0||key3==0||key4==0);
}
return temp;//返回中间值
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include <reg51.h>//51头文件
sbit key1=P3^0;//与键盘连接的IO设置为key1
sbit key2=P3^1;//与键盘连接的IO设置为key2
sbit key3=P3^2;//与键盘连接的IO设置为key3
sbit key4=P3^3;//与键盘连接的IO设置为key4
unsigned char key();//独立键盘函数声明
#endif
main.c
#include <reg51.h>
#include "display.h"
#include "key.h"
void key_service();
void main()
{
LEDBuf[0]=23;
LEDBuf[1]=23;
LEDBuf[2]=23;
while(1)
{
key_service();
display();
}
}
void key_service()
{
switch(key())
{
case 0:break;
case 1:
LEDBuf[3]=1;
break;
case 2:
LEDBuf[3]=2;
break;
case 3:
LEDBuf[3]=3;
break;
case 4:
LEDBuf[3]=4;
break;
default:break;
}
}
三、按键模块书写思路
按键模块主要有四步,即判断是否按下—>延时1ms—>再次判断是否按下—>松手等待,书写该按键函数,作用在于通过返回值判断哪个按键按下。