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

一、独立按键:

简介:

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

在这里插入图片描述

这里是引用

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

该图为理想状态下的按键波形,无抖动
这里是引用

该图为实际中按键波形,存在抖动在这里插入图片描述
一般抖动时间为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 数据,在按键表中查询,确定是哪个按键按下


按键对照表:

手算真累!!!
在这里插入图片描述


三、矩阵键盘实验

效果展示:

51单片机 矩阵键盘 行列扫描法

仿真电路图:

简略仿真一下,接线粗糙,大神勿喷!!
在这里插入图片描述

代码:

#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 字码表的数
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章