蓝桥杯模块矩阵键盘Part_1
九层妖塔 起于垒土
蓝桥杯模块矩阵键盘Part_1
- 矩阵键盘
- 一、理论
- 1、矩阵键盘的识别与编码:
- 2、矩阵键盘的工作方式:
- 二、原理图
- 三、Template1
- 1、矩阵键盘扫描函数:
- 2、定时器初始化及定时器服务函数:
- 3、部分主程序:
- 4、Notes:
- 附、按键的识别方法_状态法进行按键扫描_流程图|状态转换图
矩阵键盘
一、理论
1、矩阵键盘的识别与编码:
step1:判断键盘中有无按键按下
因为矩阵键盘的接口中只有四个行线是在一组I/O口上的,为了便于识别,所以将行拉高,列拉低 若四个行线不全为高电平,则表示有按键按下。
step2:判断闭合按键的所在的位置
在确认有按键按下后,即可进入确定具体闭合键的过程。
①扫描法:依次将行线置为低电平即在置某根行线为低电平时,其他线全为高电平。再逐个检查列线的状态。
②反转法:行全扫描,读取列码;列全扫描,读取行码。将行、列码组合在一起,得到按键的键码。
step3:根据闭合键的键码,采用查表法或者计算法得到自定义的键值。
2、矩阵键盘的工作方式:
①查询扫描
把键盘扫描子程序和其他子程序并列在一起,单片机循环分时运行各个子程序。当按键按下并且单片机查询到的时候立即响应键盘输入操作。
②定时扫描
定时器,灵活多样,方法较多。
③中断扫描
依赖于硬件(如四路与门等),利用外部中断。
二、原理图
三、Template1
Template1使用状态机的方法进行按键的扫描识别,用定时器来替代软件延时,没必要纠结于反转法还是行扫描法。
无法实现长按短按以及多个同时按下的识别,但写法较为简单,适用于要求较少的情况。
来自国信长天官方电子版例程的改编。
1、矩阵键盘扫描函数:
//--------------------------矩阵键盘扫描--读取矩阵键盘键值--------------//
void keyscan16(void) //每隔10ms扫描一次
{static uchar hang; //行static uchar key_state=0;if(key_flag==1)key_flag = 0;else return;switch(key_state){case 0:{P44=0;P42=0;P3=0X0F; //行拉高,列拉低if(P3 != 0X0F) //有按键按下key_state=1;}break;case 1:{P44=0;P42=0;P3=0X0F; //行拉高,列拉低if(P3 != 0X0F) //有按键按下{if(P30 == 0) hang = 1;if(P31 == 0) hang = 2;if(P32 == 0) hang = 3;if(P33 == 0) hang = 4;//确定列switch(hang){case 1:{P44=1;P42=1;P3=0XF0; //列拉高,行拉低if(P44 == 0) {key_value=7;key_state=2;} //S7else if(P42 == 0) {key_value=11;key_state=2;} //S11else if(P35 == 0) {key_value=15;key_state=2;} //S15else if(P34 == 0) {key_value=19;key_state=2;} //S19}break;case 2:{P44=1;P42=1;P3=0XF0; //列拉高,行拉低if(P44 == 0) {key_value=6;key_state=2;} //S6else if(P42 == 0) {key_value=10;key_state=2;} //S10else if(P35 == 0) {key_value=14;key_state=2;} //S14else if(P34 == 0) {key_value=18;key_state=2;} //S18}break;case 3:{P44=1;P42=1;P3=0XF0; //列拉高,行拉低if(P44 == 0) {key_value=5;key_state=2;} //S5else if(P42 == 0) {key_value=9;key_state=2;} //S9else if(P35 == 0) {key_value=13;key_state=2;} //S13else if(P34 == 0) {key_value=17;key_state=2;} //S17}break;case 4:{P44=1;P42=1;P3=0XF0; //列拉高,行拉低if(P44 == 0) {key_value=4;key_state=2;} //S4else if(P42 == 0) {key_value=8;key_state=2;} //S8else if(P35 == 0) {key_value=12;key_state=2;} //S12else if(P34== 0) {key_value=16;key_state=2;} //S16} break; }}else{key_state=0; }}break;case 2:{P44=0;P42=0;P3=0X0F; //行拉高,列拉低if(P3 == 0X0F) //按键放开key_state=0;}break;}}
2、定时器初始化及定时器服务函数:
//----------------------------定时器1服务函数,数码管显示&按键消抖----------------//
void Timer1_Service()
{static uchar in_T1=0; //1ms定时器T1计满溢出的次数TR1 = 1; //定时器1开始计时if(TF1 == 1) //TF1为1,1ms定时时间已到{Timer1Init(); //关定时器;重装初值;清除TF1标志SEG_Disp(SEG_Code,SEG_Position); //动态数码管显示,1ms执行一次if(++SEG_Position == 8) SEG_Position=0;if(++in_T1 == 10){in_T1=0;key_flag = 1; //10ms按键扫描标志位置1}TR1 = 1; //定时器1开始计时}
}//------------------------------------定时器1初始化,------------//
void Timer1Init(void) //1毫秒@12.000MHz
{TR1 = 0; //关定时器1AUXR |= 0x40; //定时器时钟1T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0x20; //设置定时初值TH1 = 0xD1; //设置定时初值TF1 = 0; //清除TF1标志//TR1 = 1; //定时器1开始计时
}
3、部分主程序:
bit key_flag = 0; //按键10ms扫描标志位
uchar key_value=0; //按键值void main(void)
{All_Init();Timer1Init(); //1毫秒@12.000MHz定时器1初始化while(1){keyscan16();sprintf(SEG_Buf,"%04u",(uint)key_value);SEG_Tran(SEG_Buf,SEG_Code); //动态数码管显示转换Timer1_Service(); //定时器1服务函数,数码管显示}
}
4、Notes:
●key_flag
按键扫描标志位,初始值为0。
○在定时器服务函数Timer1_Service()
中定时10ms到key_flag
被置1;
○进入矩阵键盘扫描函数keyscan16()
中先判断key_flag
是否为1,若为1则先将key_flag
置0再继续执行,若为0则跳出。
○key_flag
按键扫描标志位保证了10ms进行一次按键扫描
●矩阵键盘扫描函数keyscan16()
每10ms执行一次按键扫描,子函数里的静态局部变量按键状态 key_state
有0,1,2三个值,初始值为0。
○一次按键识别要进行三次按键扫描。
○ key_state
为0表示本次按键识别还未开始。10ms到进行第一次按键扫描,有无按键按下,若检测到低电平,将key_state
置1,表示又可能有按键按下;若无低电平,则继续保持为0,等待下一个10ms。
○ key_state
为1表示已经扫描到一次低电平。10ms到进行第二次按键扫描,先检测有无按键按下,若检测到低电平就继续进行按键值的判断,并将key_state
置为2;若没检测到低电平,则将 key_state
置零,本次按键识别结束。
○ key_state
为2表示已经进行完按键是否按下和具体按键键值的判断,进行松手检测,防止重入。若按键以放开,将key_state
置0,本次按键识别结束。
●定时器溢出响应依旧使用的是查询法,担心如果用中断法响应定时器溢出,会对其他部分产生影响。自拟了一个定时器服务子函数Timer1_Service()
,通过查询定时器1的溢出标志位TF1
来决定是否进入定时器服务子函数Timer1_Service()
。使用静态局部变量in_T1
来判断计时溢出的次数,10次时,10ms时间到。实现数码管和按键公用一个定时器。
●采用状态法进行按键识别扫描,系统实时性好,且每10ms扫描可以防止抖动。
●无法实现长按短按以及多个同时按下的识别,但写法较为简单。
●来源于国信长天的电子版例程,原为中断法响应定时器溢出,改为查询标志位法。还有其他细节和习惯的修改。
附、按键的识别方法_状态法进行按键扫描_流程图|状态转换图
蓝桥杯模块矩阵键盘Part_1相关推荐
- 学蓝桥Chapter6:矩阵键盘KBD练习
学蓝桥Chapter6:矩阵键盘KBD练习 前提条件 矩阵键盘接线图及简要介绍 练习 前提条件 先将CT107D的J5键帽跳到KBD那边(或者拿一根导线短路kbd一端管脚和中间那跟管脚) 矩阵键盘接线 ...
- 蓝桥杯模块四路运算放大器LM324
九层妖塔 起于垒土 蓝桥杯模块四路运算放大器LM324
- 蓝桥杯模块学习17——AT24C02存储器(深夜学习——单片机)
一.硬件电路: 1.引脚功能: (1)A0-A2:决定不同设备的地址码: (2)WP:写保护 二.通讯方式(IIC协议) 通讯方式与PCF8591相同,可参考以下文章: 蓝桥杯模块学习16--PCF8 ...
- java蓝桥杯练习 矩阵加法
java蓝桥杯练习 矩阵加法 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定两个N×M的矩阵,计算其和.其中: N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000 ...
- Ti AM335X工控模块矩阵键盘电路的设计与驱动移植
本内容的验证使用的盈鹏飞嵌入式CoM-335x核心模块及评估板EAC-335X,简要介绍如下: 前言 与按键相比,矩阵按键(键盘)使用更少的GPIO实现更多按键接口.以下,基于COM-335x核心模块 ...
- 蓝桥杯模块之NE555
NE555模块 NE555模块简介: NE555内部结构及应用电路 - 百度文库 这是NE555分析比较详细的一篇文章,可以仔细看一下,当然蓝桥杯要求没有那么严格,总归来说蓝桥杯的设计就是将它作为了 ...
- 算法笔记_094:蓝桥杯练习 矩阵相乘(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性 ...
- 蓝桥杯模块学习9——PWM脉冲宽度调制(深夜学习——单片机)
一.什么是PWM脉冲宽度调制: 对PWM简单理解(佛科院--深夜学习)_佛科院深夜学习的博客-CSDN博客 二.脉冲宽度调制实验: 1.代码思路: (1)我们可以利用定时器规定周期为10ms(100H ...
- 蓝桥杯模块学习10——串口通信(深夜学习——单片机)
一.什么是串口通信? 51单片机--串口通信详解(STC89C51为例)_佛科院深夜学习的博客-CSDN博客 二.IAP15F2K60S2与STC89系列的区别: 1.16位自动重装载模式下波特率的计 ...
最新文章
- 队列:实用程序服务和数据结构
- mysql锁与程序锁_数据库加锁(转)
- html中如何等比缩小图片,css如何将图片等比缩放
- 地平线:黎明时分中的云渲染技术
- 包装类型与包装类别_包装的重要性
- python函数应用_python 函数应用
- oracle11g中用asmlib配置磁盘组,ASM学习笔记_配置ASMLIB磁盘组
- python 枚举类型_Python枚举类
- Android 自定义下拉框的实现 Spinner
- svn导入 ubuntu_ubuntu搭建SVN服务器详细教程
- 2022国内十大工业级三维视觉引导企业一览
- 手动删除Mac版迅雷无用的功能,让迅雷软件更清爽无广告纯粹下载
- KMS模拟器VLMCSD再次更新
- vCenter资源池
- 第4章_1——SQL语句实现MySQL增删改查
- springboot海纳部门人事管理系统毕业设计源码
- [万字长文] 图神经网络的解释性综述
- PostgreSQL的GROUP BY问题
- Qt自定义一个简单的ToolTip提示框
- ArcGIS 点、线、面要素转换
热门文章
- UDP网络编程和URL编程
- ZOJ2770,火烧连营,差分约束
- 虚拟机服务器如何关机命令行,安卓虚拟机如何关机命令行
- 最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程)(持续更新中)
- 京东从net转Java_转!京东架构师熬夜录制,献给Java路上最最迷茫的你!赠教程...
- 新劳动法关于员工罚款的规定有哪些
- BP神经网络数据预测
- TSN中流的路由与调度的研究
- 电脑故障维修大全 [2]
- 电大2019计算机基础客观题,2019电大计算机应用基础试题及答案必考重点