按键(独立按键、矩阵键盘)——附带程序

按键

  • 一、独立按键:
    • 简介:
    • 消抖:
    • 代码:
  • 二、矩阵键盘 :
    • 行列反转扫描法:
    • 按键对照表:
  • 三、矩阵键盘实验
    • 效果展示:
    • 仿真电路图:
    • 代码:

一、独立按键:

简介:

接触式按键,又叫轻触开关

按键(独立按键、矩阵键盘)——附带程序_第1张图片

按键(独立按键、矩阵键盘)——附带程序_第2张图片

接触式按键是靠机械的接触来实现开和关。这种接触方式存在接触不稳定的状态,即存在抖动。

该图为理想状态下的按键波形,无抖动
按键(独立按键、矩阵键盘)——附带程序_第3张图片

该图为实际中按键波形,存在抖动按键(独立按键、矩阵键盘)——附带程序_第4张图片
一般抖动时间为10~20ms
按键(独立按键、矩阵键盘)——附带程序_第5张图片

消抖:

①硬件消抖:
成本高;影响产品集成度,一般不采用。

按键(独立按键、矩阵键盘)——附带程序_第6张图片

②软件消抖:
编程实现,不增加硬件成本,不影响产成品集成度。

代码:

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 资源,所以当需要大量按键时,常采用矩阵键盘。
按键(独立按键、矩阵键盘)——附带程序_第7张图片

矩阵键盘的检测方法有很多,本文介绍行列反转扫描法。

行列反转扫描法:

①先进行行扫描
P2 ^0 ~ P2 ^3 置低电平,P2 ^4 ~ P2 ^7置高电平,按键,保存 P0 口状态到 temp1

②再进行列扫描
P2 ^0 ~ P2 ^3 置高电平,P2 ^4 ~ P2 ^7置低电平,按键,保存 P0 口状态到 temp2

③计算
将 temp1 与 temp2 进行或运算,将结果 result 转化为 HEX 数据,在按键表中查询,确定是哪个按键按下


按键对照表:

手算真累!!!
按键(独立按键、矩阵键盘)——附带程序_第8张图片


三、矩阵键盘实验

效果展示:

[video(video-9waz29yE-1590068690607)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=710793514)(image-https://ss.csdn.net/p?http://i2.hdslb.com/bfs/archive/bfceacc396ee7f946c5ab7cef344aa321d533a80.jpg)(title-51单片机 矩阵键盘 行列扫描法)]

仿真电路图:

简略仿真一下,接线粗糙,大神勿喷!!
按键(独立按键、矩阵键盘)——附带程序_第9张图片

代码:

#include

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 字码表的数
		}
	}
}

你可能感兴趣的:(51单片机)