0引言

参考郭天祥老师的矩阵键盘讲解视频,前几天看了郭老师的视频学习到了一些有用的知识,因此写篇博客记录一些知识与程序,作为储备。

1按键原理


按键的工作原理就是按下按键则闭合端口,松开按键则断开端口,这里讲的是按键抖动原理。(上图取自郭老师的ppt)

1.1硬件消抖

当按键未按下时,输出为1;当键按下时,输出为0。使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形,因为当B端口输入0以后,RS锁存器将保持上一个状态。
也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。

1.2软件消抖

软件消抖主要使用增加延时函数和增加标志位两种方法

1.2.1延时函数

通过if或者while语句进行检测按键是否按下,若按下则进入相关语句,通过延时5ms进行消抖,再次检测是否按下按键,若确实按下则进行相应操作,最后使用whlie语句来判断按键是否松开。

void delay(unint z)
{unint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);//延时1ms
}
if(key1==0){delay(5);//消除抖动if(key1==0){//具体操作}while(!key1);//松手判断delay(5);//松手消抖while(!key1);}

1.2.2标志位消抖

这是通过设定一个标志位来代替延时函数的方法,当判断按键按下进入if语句后对标志位进行赋值,而后通过标志位与key状态同时判断。

void key_config()
{//按下输入状态为0,按键外接上拉电阻//赋初值flag=0if(key0==0&&flag==0){flag=1;//改变标志位}if(flag==1&&key0==1){//具体操作flag=0;//重置标志位相当于松手检测}
}

2按键键盘原理


上图是按键键盘的原理图,同样参考郭老师的PPT,采用了行扫描,大致的原理即将P1口赋4次初值,而后进行四次扫描P1的高四位若有相应位被拉低,则得到某行某列按键被按下。

3实际例子

按下16个矩阵键盘依次在数码管上显示1到f。如按下第一个显示1,第二个显示2…
由于这个例子较简单,直接上代码,将键盘扫描的实现封装到一个函数中。

#include "reg52.h"
#define unchar unsigned char
#define unint unsigned int
sbit dula=P2^6;//段选信号
sbit wela=P2^7;//位选信号unchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0,
0x36,0x79,0x38,0x3f,0};//1到F数组 code将数组中的数据放程序存储器中
unchar num=17,temp,num1;
unchar keyscan();//封装好的按键键盘函数
void display(unchar num11);
void init();
void delay(unint z)
{unint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);//1ms
}int main()
{init();while(1){display(keyscan());}}
unchar keyscan()
{P3=0xfe;temp=P3;while(temp!=0xfe){delay(5);temp=P3;while(temp!=0xfe){switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xfe){temp=P3;}}}P3=0xfd;temp=P3;while(temp!=0xfd){delay(5);temp=P3;while(temp!=0xfd){switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xfd){temp=P3;}}}P3=0xfb;temp=P3;while(temp!=0xfb){delay(5);temp=P3;while(temp!=0xfb){switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xfb){temp=P3;}}}P3=0xf7;temp=P3;while(temp!=0xf7){delay(5);temp=P3;while(temp!=0xf7){switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}while(temp!=0xf7){temp=P3;}}}return num;
}void display(unchar num11)
{dula=1;P0=table[num11-1];dula=0;
}
//初始化
void init()
{   dula=1;P0=0;dula=0;wela=1;P0=0xc0;wela=0;}

可以看到主要的思想是先将P3口赋值(这里TX-1C开发板的按键键盘与P3口相连),而后将P3口状态输出到temp变量中,通过while语句判断temp的值是否改变,while(真)则进入循环并且一直进行循环直到while(假)跳出循环。若temp值(高四位)改变,说明有按键被按下经过延时与反复检测,确定有某行按键按下,而后使用switch/case语句,进行判断是哪行那列按键按下,不断对比过程中可输出相应按键编号,最后使用while语句进行判断按键是否松开,如果松开则说明一次按键检测结束,将松开按键后的P3口状态再次赋值给temp变量用于跳出while循环,通过函数的封装可以返回一个值,该值即被按下按键的编号。

4感悟

学完按键键盘后主要掌握了switch语句,熟悉了一下相关按键消抖与while语句应用,最后就是记录了函数封装。

【单片机】矩阵键盘函数相关推荐

  1. 51单片机矩阵键盘的控制原理-扫描及使用方式

    矩阵键盘 矩阵键盘一般和之前学的LCD1602液晶屏一起控制,建议先看一下之前的博客学习一下液晶屏的使用. 当然矩阵键盘也可以和数码管和LED等一起操作,但是数码管需要扫描,很费CPU,LED又不能直 ...

  2. c51单片机矩阵键盘1602计算器_51单片机矩阵键盘计算器.doc

    51单片机矩阵键盘计算器 51单片机矩阵键盘计算器 /**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD ...

  3. 【设计方案分享】基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-基于单片机乒乓球游戏机控制系统设计-基于单片机温度监测监控报警系统设计-基于单片机矩阵键盘的电子密码锁设计

    820基于单片机温度监测监控报警系统设计-设计资料 温度监测器功能描述: 1.主控芯片用的是51单片机(STC89C51). 2.使用温度传感器DS18b20采集温度. 3.用1602液晶显示显示温度 ...

  4. 基于单片机乒乓球游戏机控制系统设计-基于单片机矩阵键盘的电子密码锁设计-基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-设计资料【转发分享】

    819基于单片机乒乓球游戏机控制系统设计-设计资料下载 乒乓球游戏机设计任务为: (1)使用乒乓游戏机的甲乙双方各在不同的位置发球或击球. (2)乒乓球的位置和移动方向由灯亮及依次点燃的方向决定,球移 ...

  5. c51单片机矩阵键盘1602计算器_【Proteus】单片机配合矩阵键盘LCD1602制作简易计算器...

    前言 想出一个关于Protues仿真的系列,回想起在大学时做课程设计,大多数是用这个来做,这个系列就围绕一些常用的外设或者说课程设计题目来进行对以前知识的回顾,温故而知新,同时也希望能对新手读者的学习 ...

  6. c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作

    1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...

  7. 51单片机矩阵键盘——数码管显示

    1.前言 当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了. 1.1实验现象 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0:按下矩阵键盘S2并松开,数码管第一位显示 ...

  8. 单片机--矩阵键盘实验

    实验目的和任务 目的:利用"模块化单片机教学实验平台",加深对单片机与矩阵键盘的接口电路设计以及程序设计的理解. 任务:1.学习独立式按键的查询识别方法. 2.非编码矩阵键盘的行反 ...

  9. 51单片机矩阵键盘——LCD1602显示

    1.前言 本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86 ...

最新文章

  1. html5 漂亮的左右布局_欧式带小院10X16米,适合农村建房,比别墅还漂亮
  2. 3G网络关闭,4G还会远吗?
  3. Windows Phone 开发——相机功能开发
  4. hdu1505 暴力或dp优化
  5. golang字符串处理
  6. suse linux增加新磁盘分区,Virtualbox中Linux添加新磁盘并创建分区
  7. 如何解决Windows 10屏幕字体缩放模糊问题
  8. An internal error occurred during: Launching MVC on Tomcat 7.x.
  9. java转盘抽奖代码_Java 实现大转盘抽奖
  10. javascript模块化编程规范
  11. sql修改服务器标记,KB974006-SQL Server 查询优化程序修复程序模型4199服务模型
  12. 计算机输入法切换用户,输入法切换不出来电脑输入法不见了的最佳解决方案
  13. java 子类属性覆盖_java子类和父类属性重复问题
  14. 命令行导入mysql数据库
  15. xilinx-vipp驱动分析
  16. VBA WORD 段落前加空行
  17. Eclipse+webservice简单实例搭建
  18. CQL 函数及多深度关系节点
  19. 阿里技术大神「多隆」的成神之路
  20. 视频号如何做出美食爆款视频,美食类爆款技巧

热门文章

  1. 虚拟机mac 与主机的网络共享
  2. 服务主机DCOM占用cpu过高
  3. 频繁跳槽者收,简历就该这样写!
  4. VLC多媒体播放器将字幕srt等 内嵌在视频中且能合并到视频,保存为带字幕的新视频 自媒作首选工具
  5. 曾经被你亲手敲烂过的机械键盘
  6. 关于SQLAlchemy的警告Warning: (1366, “Incorrect string value: ‘\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...‘ for colu
  7. 克莱因瓶在现实中为什么不存在
  8. 微软苏菲rt能装鸿蒙,评测人员称Surface RT设计漂亮但系统存不足
  9. Bayer到RGB,格式转换原理及具体实现
  10. docker 搭建私人maven仓库