内容
通过开发板上的独立按键K1控制D1指示灯亮灭
按键简介
按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开关断开;
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动;抖动时间的长短由按键的机械特性决定的,一般为5ms到10ms;按键稳定闭合时间的长短则由操作人员的按键动作决定的,一般为零点几秒至数秒;
按键抖动会引起按键被误读多次,为了确保CPU对按键的一次闭合仅作一次处理,必须进行消抖;
按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖;为了使电路更加简单,通常采用软件消抖;
我们也是采用软件消抖:就是先读取按键的状态,如果得到按键按下之后,延时10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下;其中延时10ms就是软件消抖处理;
单片机常用的软件去抖动方法:
1 先设置IO口为高电平(由于开发板IO都有上拉电阻,所以默认IO为高电平)
2 读取IO口电平确认是否有按键按下
3 如有IO电平为低电平后,延时几个毫秒
4 再读取该IO电平,如果仍然为低电平,说明按键按下
5 执行按键控制程序
独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机IO口;
开始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令;
原理图
线路图
由线路图可知,当k1、k2、k3、k4按下,对应P31、P30、P32、P33管脚即为低电位;
思路
通过P31、P30、P32、P33管脚的电位,确定哪个按钮按下,并返回对应键值;
做好消抖处理;
区分当按钮持续按下时只做一次处理还是多次处理(单次扫描和多次扫描);
编码
main.c
/*
* @Description: 独立按键-K1控制D1指示灯亮灭
*/
#include "reg52.h"
typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;
// 定义独立按键控制脚
sbit KEY1 = P3 ^ 1;
sbit KEY2 = P3 ^ 0;
sbit KEY3 = P3 ^ 2;
sbit KEY4 = P3 ^ 3;
// 定义LED1控制脚
sbit LED1 = P2 ^ 0;
// 使用宏定义独立按键按下的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0 // 表示没按下
/**
* @description: 延时函数(循环一次大约10us)
* @param {u16} ten_us
* @return {*}
*/
void delay_10us(u16 ten_us)
{
while (ten_us--)
;
}
/**
* @description: 检测独立按键是否按下,并返回对应键值
* @param {u8} mode 1:单次扫描按键;2:连续扫描按键
* @return {u8} key的键值
*/
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_10us(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 KEY_UNPRESS;
}
void main()
{
u8 key = 0;
while (1)
{
key = key_scan(0);
if (key == KEY1_PRESS) // 检测按键K1是否按下
LED1 = !LED1; // LED1状态翻转
}
}
编译和结果
按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机
结果:按下k1键可以切换led1灯的亮灭