单片机-独立按键矩阵按键实验
1、按键介绍
按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通
我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。其中延时10ms 就是软件消抖处理
2、独立按键
K1连在P3^1管脚, K2——P3^0, K3——P3^2, K4——P3^3
需求:通过开发板上的独立按键 K1 控制 D1 指示灯亮灭
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 ten_us){
while(ten_us--);
}
sbit LED1=P2^0; //控制D1指示灯
sbit LED2=P2^1; //控制D2指示灯
sbit LED3=P2^2; //控制D3指示灯
sbit LED4=P2^3; //控制D4指示灯
//使用宏定义的方法控制独立按键的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
//没有任何按键被按下
#define KEY_UNPRESS 0//定义按键对应的管脚口
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;//封装函数实现按键返回一个键值
//定义一个只能传递0或1的模式model
//0单次扫描,1连续扫描
u8 key_scan(u8 model){
//打一个标志
static u8 key=1; //static 静态变量
if(model==1){
key=1;
}
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){
//消抖处理,使用延迟操作 5ms~10ms
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 value=0;
while(1){
value=key_scan(0);
if(value==KEY1_PRESS){
LED1=!LED1;
//delay_10us(50000); //加一下延时可以验证,单次扫描和连续扫描的情况
}
else if(value==KEY2_PRESS){
LED2=!LED2;
}
else if(value==KEY3_PRESS){
LED3=!LED3;
}
else if(value==KEY4_PRESS){
LED4=!LED4;
}
}
}
3、矩阵按键
矩阵键盘两端都与单片机 I/O 口相连,因此在检测时需编程通过单片机 I/O 口送出低电平。
4*4 矩阵键盘的工作原理和检测方法。开发板上将 16 个按键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个键。
单片机 I/O 口送出低电平检测方法有多种,最常用的是行列扫描法和线翻转法。
(1)行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的
(2)线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值,由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部按键
3.1行列扫描法