单片机  矩阵式按键

一、简述

在单片机应用系统中,通过按键实现数据输入及功能控制是非常普遍的,通常在所需按键数量不多时,系统常采用独立式按键。需要按键数量比较多,为了减少I/O口的占用,通常将按键排列成矩阵。测试环境为Win7-32bit-2G运存,Proteus8.5,Keil4

工程文件等:链接: https://pan.baidu.com/s/1kCf8jGU26GR_Nv1P7xxngQ 密码: 8ax7

二、效果

三、工程结构

1、Keil工程

2、仿真电路

三、编程思路

没有按键按下时,X0~X3是低电平,Y0~Y3是高电平。

某一个按键按下,设置其所在的行低电平,列就会变为低电平。

1、判断有无键被按下

方法是:将全部行线X0~X3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

2、确定哪个键按下

方法是:在确认有键按下后,依次将行线置为低电平,即在置某根行线为低电平时,其他线为高电平(其实就是屏蔽其他行的按键状态,只有当前检测行的按键状态有效);在确定某根行线位置为低电平后,再逐行检测各列线的电平状态,若某列为低(说明当前检测行有按键按下),则该列线与置为低电平的行线交叉处的按钮就是闭合的按键。

四、代码

key.c文件

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint key,key_num;//键盘扫描值,键盘键值
/********************************************************************/
//函数名:delay_1ms(uint x)
//功能:利用定时器0精确定时1ms; 自加 time_t的值为后面时间调整函数服务
//调用函数:
//输入参数:x,1ms计数
//输出参数:
//说明:延时的时间为1ms乘以x
/********************************************************************/
void delay_1ms(uint x)
{TMOD=0X01;//开定时器0,工作方式为1TR0=1;//启动定时器0;while(x--){TH0=0Xfc;//定时1ms初值的高8位装入TH0TL0=0X18;//定时1ms初值的低8位装入TL0while(!TF0);//等待,直到TF0为1TF0=0;}      TR0=0;//停止定时器0;
}/**********************************************************/
//函数名:keyscan()
//功能:得出4x4键盘的行列扫描值
//调用函数:delay_1ms(uint x)
//输入参数:
//输出参数:
//说明:通过P1口的扫描得出扫描值key,无键按下key为16
/**********************************************************/
uchar keyscan()
{uchar code_h;      //行扫描值uchar code_l;     //列扫描值P1=0XF0;          //P1.0-P1.3全为0,(行状态全为低电平)if((P1&0xF0)!=0XF0)   //如果P1.4-P1.7不全为1,可能有键按下(为准确识别按键动作){delay_1ms(5);    //廷时去抖动,为准确识别按键动作if((P1&0xF0)!=0XF0)//重读高4位(列状态),若还是不全为1,定有键按下{           code_h=0xfe;  //开始行扫描 (0xfe:11111110)while((code_h&0x10)!=0x00)//判断是否扫描四行(X0~X3)完毕,若不是,继续扫描(0x10:00010000)   {P1=code_h;   //第1次P1.0置为0,其余高电平;第2次P1.1置为0,其余高电平  ;第3次P1.2置为0,其余高电平;第4次P1.3置为0,其余高电平if((P1&0xF0)!=0XF0) //如果P1.4-P1.7不全为1,该行有键按下(0xF0:11110000){code_l=(P1&0xF0|0x0F);//保留P1口高4位,低4位变为1,作为列值return((~code_h)+(~code_l));//键盘编码=行扫描值+列扫描值 (取反后用,相当于改为按下按键对应的行、列标识为1,其它为0)                 }else                           //左移后补0,但是我们需要将其他位置1,所以+1code_h=(code_h<<1)|0x01;  //若该行无键按下,行扫描值左移+1,扫描下一行 }}}return(16);     //无键按下,返回16 }/**********************************************************/
//函数名:keynum()
//功能:得出4x4按键的键值
//调用函数:keyscan()
//输入参数:
//输出参数:
//说明:通过key的值确定按键键值
/**********************************************************/
void keynum()
{uchar i,j;uchar code tab[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; //4x4键盘各键值标注key=16;key = keyscan();//引入key值if((key&0x01)!=0) i=0; //判断出按下按键的行列号 (即找出低电平的行、列)if((key&0x02)!=0) i=1;if((key&0x04)!=0) i=2;if((key&0x08)!=0) i=3;if((key&0x10)!=0) j=0;if((key&0x20)!=0) j=1;if((key&0x40)!=0) j=2;if((key&0x80)!=0) j=3;if(key!=16) {key_num = tab[i][j];//通过比较得出4x4键盘的键值}
}void main()
{uint shi,ge;shi = 0;ge = 0;P2 = 0x16;//初始值 为16while(1){keynum(); //获取到键值if(key!=16){shi = key_num/10;//获得十位    ge = key_num%10;//获得个位if(shi){P2 = 0x10|ge;}else{P2 = ge;}}delay_1ms(10);//延时}
}

五、总结

方式二:当无按键按下时,4行均为低电平,4列电平均为高电平;按键按下时,按键所在行为高电平,所在列为低电平。这样子的情况可以使用以下方式扫描按键。

(此方式没有处理同时按下多个按键的问题)

key2.c文件 按键扫描代码

/**********************************************************/
//函数名:keyscan()
//功能:得出4x4键盘的行列扫描值
//调用函数:delay_1ms(uint x)
//输入参数:
//输出参数:
//说明:通过P1口的扫描得出扫描值key,无键按下key为16
/**********************************************************/
uchar keyscan()
{P1=0XF0;           //P1.0-P1.3全为0,(行状态全为低电平)if((P1&0xF0)!=0XF0)   //如果P1.4-P1.7不全为1,可能有键按下(为准确识别按键动作){delay_1ms(5);    //廷时去抖动,为准确识别按键动作if((P1&0xF0)!=0XF0)//重读高4位(列状态),若还是不全为1,定有键按下{   return(~P1);//键盘编码 (取反后用)}}return(16);   //无键按下,返回0 }

六、补充

1、 多个按键同时按下,可采取索引值较大者

单片机 矩阵式按键相关推荐

  1. 单片机矩阵式键盘扫描程序

    单片机矩阵键盘判断某个按键按下 这是我第一次发表文章,关于51单片机矩阵式键盘逐行逐列扫描是否有按键按下,以及把键号显示用七段数码管显示出来的程序,分享如下. 矩阵键盘 51单片机 数码管显示 程序代 ...

  2. 独立按键和矩阵按键c语言,单片机独立按键与矩阵按键原理图

    当前位置:电工之家 > 电工知识 > 单片机 > 正文 单片机独立按键与矩阵按键原理图 时间:2017-02-22 12:40 来源:电工之家 单片机独立按键与矩阵按键原理图 独立按 ...

  3. 单片机原理及其应用——单片机控制按键依次点亮8只发光二极管

    目录 一.实验要求 二.Proteus仿真软件画原理图 三.Keil编程软件编写程序 四.实验结果 (一)仿真结果 (二)连接电路 (三)烧录并观察实验现象 结语 一.实验要求 [实验目的] 1.了解 ...

  4. 单片机原理及其应用——单片机控制按键点亮发光二极管

    目录 一.实验要求 二.分析 (一)电路原理 (二)机械式按键的抖动时间与解决方法 三.Proteus仿真软件画原理图 四.Keil编程软件编写程序 五.实验结果 (一)仿真结果 (二)连接电路烧录 ...

  5. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...

    基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...

  6. 应广单片机PFS123按键中断控制数码管显示例程

    目录 应广单片机PFS123按键中断控制数码管显示视频 led数码管图片 应广单片机PFS123按键中断控制数码管显示代码 应广科技网址,开发工具,PMS123规格书:http://www.padau ...

  7. 51单片机——矩阵按键逐行扫描短按长按一直按方案1.2

    1.删减了<51单片机--独立按键.矩阵按键多种方案1.1>里的一些不怎么用的代码. 2.添加了逐行扫描按键(需要定时器20毫秒配合使用). 3.支持按键短按.长按.一直按,代码里只做了短 ...

  8. 单片机独立按键模块(含短按,长按,连发功能)

    最近看了很多按键扫描的文章,发现各有长处,后来自己花了一点时间做了一个单片机独立按键扫描的模块,此模块优点颇多,支持短按,长按,连发功能,只要配置相关结构体就可以实现这些功能,唯一的缺点是不支持多按键 ...

  9. 51单片机-独立按键控制LED

    1.   51单片机独立按键的位置: 独立按键的定义:独立按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开: 在整个51开发板的左下 ...

  10. 用51单片机实现按键控制LED灯亮灭

    用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...

最新文章

  1. 运行NER/formal_bert_lstm_crf.py“ 报错ModuleNotFoundError: No module named ‘keras_contrib‘
  2. 页面滚动事件和利用JS实现回到顶部效果
  3. python 自动补全函数括号_Python学习笔记(二)
  4. 如何求一个数的因数 c语言代码,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  5. JBoss Portal CAS 的配置
  6. B. super_log(2019ICPC区域网络赛南京站)
  7. 神策数据:从技术视角看,如何更多、更好、更快地实施A/B试验
  8. 【深度学习】总有些哪些大胆又新奇的卷积网络结构设计
  9. wxWidgets:wxListCtrl 示例
  10. net4.0 程序没反应_@Java程序员,精通Spring,你不得不知道的那些书
  11. 浅析Linux awk命令
  12. 将json转为map的两种方式及前后端开发json Api设计规范总结
  13. git从远程仓库gitLab上拉取指定分支到本地仓库
  14. php table td边框,怎样对table和td技巧性设置表格边框
  15. html+div+css+jquery+javascript的关系
  16. python爬取斗鱼礼物数据_Python---20行代码爬取斗鱼平台房间数据(上)
  17. 使用Simian工具扫描重复代码
  18. 攻克拖延症——经历记录与心得分享
  19. 怎么批量查询银行卡号是哪个银行?
  20. EMI、EMS以及EMC的区别

热门文章

  1. php 抽奖活动_php 实现活动人选抽奖功能代码
  2. 用户使用情况报告(附用户使用调查表)
  3. 【SVN】SVN创建分支
  4. c# vs2019 AForge简单使用
  5. STM32 USB接口 一键下载电路详解与过程分析
  6. Tomcat服务器端口修改,tomcat服务器配置端口 tomcat端口号修改操作步骤
  7. linux中高危端口,关闭高危端口方法[转载]
  8. 如何将APP安装包发布到360手机助手上
  9. jsonrpc php使用,php-JsonRPC
  10. 用NSSM把influxDB安装成windows后台服务