一、独立按键:
简介:
接触式按键,又叫轻触开关
接触式按键是靠机械的接触来实现开和关。这种接触方式存在接触不稳定的状态,即存在抖动。
该图为理想状态下的按键波形,无抖动
该图为实际中按键波形,存在抖动
一般抖动时间为10~20ms
消抖:
①硬件消抖:
成本高;影响产品集成度,一般不采用。
②软件消抖:
编程实现,不增加硬件成本,不影响产成品集成度。
代码:
void delay(int xms){ //延时函数 x ms
unsigned int i, j;
for(i=0; i<xms; ++i)
for(j=0; j<110; ++j)
;
}
void key(){
if(key_down==0){ //第一次检测按下
delay(20); //一般延时20ms,进行消抖
if(key_down==0){ //第二次检测按下,按键是真正的按下了
.
. //按键处理
.
}
while(!key_down); //检测按键是否松开(弹起),按键松开则退出
}
}
二、矩阵键盘 :
当按键较少时,可以采用独立按键,
但当需要多个按键时,接独立按键就会占用单片机珍贵的 I/O 资源,所以当需要大量按键时,常采用矩阵键盘。
矩阵键盘的检测方法有很多,本文介绍行列反转扫描法。
行列反转扫描法:
①先进行行扫描
P2 ^0 ~ P2 ^3 置低电平,P2 ^4 ~ P2 ^7置高电平,按键,保存 P0 口状态到 temp1
②再进行列扫描
P2 ^0 ~ P2 ^3 置高电平,P2 ^4 ~ P2 ^7置低电平,按键,保存 P0 口状态到 temp2
③计算
将 temp1 与 temp2 进行或运算,将结果 result 转化为 HEX 数据,在按键表中查询,确定是哪个按键按下
按键对照表:
手算真累!!!
三、矩阵键盘实验
效果展示:
仿真电路图:
简略仿真一下,接线粗糙,大神勿喷!!
代码:
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code num[16]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0E}; // 0~f 字码
uchar code key_check[16]={0xEE, 0xDE, 0xBE, 0x7E, 0xED, 0xDD, 0xBD, 0x7D, 0xEB, 0xDB, 0xBB, 0x7B, 0xE7, 0xD7, 0xB7, 0x77}; // 按键检查表
void delay(int xms){ // 延时函数
uint i, j;
for(i=0; i<xms; ++i)
for(j=0; j<110; ++j)
;
}
void main(){
uchar i, temp, result;
P3 = 0xff; // 未按键时,数码管不显示
while(1){
P2 = 0xf0; // 行扫描
if(P2 != 0xf0){
delay(15); // 延时消抖
if(P2 != 0xf0){
temp = P2;
P2 = 0x0f; //列扫描
result = temp | P2; //计算结果,与按键检查表对照
for(i=0; i<16; ++i){ // 检查按键表, 找出是哪个按键按下
if(result == key_check[i]){
break; // 保留 i 值
}
}
}
while(P2==0xf0) ;
P3 = num[i]; // i 值对应 num 字码表的数
}
}
}