九层妖塔 起于垒土

蓝桥杯模块矩阵键盘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相关推荐

  1. 学蓝桥Chapter6:矩阵键盘KBD练习

    学蓝桥Chapter6:矩阵键盘KBD练习 前提条件 矩阵键盘接线图及简要介绍 练习 前提条件 先将CT107D的J5键帽跳到KBD那边(或者拿一根导线短路kbd一端管脚和中间那跟管脚) 矩阵键盘接线 ...

  2. 蓝桥杯模块四路运算放大器LM324

       九层妖塔 起于垒土 蓝桥杯模块四路运算放大器LM324

  3. 蓝桥杯模块学习17——AT24C02存储器(深夜学习——单片机)

    一.硬件电路: 1.引脚功能: (1)A0-A2:决定不同设备的地址码: (2)WP:写保护 二.通讯方式(IIC协议) 通讯方式与PCF8591相同,可参考以下文章: 蓝桥杯模块学习16--PCF8 ...

  4. java蓝桥杯练习 矩阵加法

    java蓝桥杯练习 矩阵加法 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定两个N×M的矩阵,计算其和.其中: N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000 ...

  5. Ti AM335X工控模块矩阵键盘电路的设计与驱动移植

    本内容的验证使用的盈鹏飞嵌入式CoM-335x核心模块及评估板EAC-335X,简要介绍如下: 前言 与按键相比,矩阵按键(键盘)使用更少的GPIO实现更多按键接口.以下,基于COM-335x核心模块 ...

  6. 蓝桥杯模块之NE555

    NE555模块 NE555模块简介: NE555内部结构及应用电路 - 百度文库  这是NE555分析比较详细的一篇文章,可以仔细看一下,当然蓝桥杯要求没有那么严格,总归来说蓝桥杯的设计就是将它作为了 ...

  7. 算法笔记_094:蓝桥杯练习 矩阵相乘(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性 ...

  8. 蓝桥杯模块学习9——PWM脉冲宽度调制(深夜学习——单片机)

    一.什么是PWM脉冲宽度调制: 对PWM简单理解(佛科院--深夜学习)_佛科院深夜学习的博客-CSDN博客 二.脉冲宽度调制实验: 1.代码思路: (1)我们可以利用定时器规定周期为10ms(100H ...

  9. 蓝桥杯模块学习10——串口通信(深夜学习——单片机)

    一.什么是串口通信? 51单片机--串口通信详解(STC89C51为例)_佛科院深夜学习的博客-CSDN博客 二.IAP15F2K60S2与STC89系列的区别: 1.16位自动重装载模式下波特率的计 ...

最新文章

  1. 队列:实用程序服务和数据结构
  2. mysql锁与程序锁_数据库加锁(转)
  3. html中如何等比缩小图片,css如何将图片等比缩放
  4. 地平线:黎明时分中的云渲染技术
  5. 包装类型与包装类别_包装的重要性
  6. python函数应用_python 函数应用
  7. oracle11g中用asmlib配置磁盘组,ASM学习笔记_配置ASMLIB磁盘组
  8. python 枚举类型_Python枚举类
  9. Android 自定义下拉框的实现 Spinner
  10. svn导入 ubuntu_ubuntu搭建SVN服务器详细教程
  11. 2022国内十大工业级三维视觉引导企业一览
  12. 手动删除Mac版迅雷无用的功能,让迅雷软件更清爽无广告纯粹下载
  13. KMS模拟器VLMCSD再次更新
  14. vCenter资源池
  15. 第4章_1——SQL语句实现MySQL增删改查
  16. springboot海纳部门人事管理系统毕业设计源码
  17. [万字长文] 图神经网络的解释性综述
  18. PostgreSQL的GROUP BY问题
  19. Qt自定义一个简单的ToolTip提示框
  20. ArcGIS 点、线、面要素转换

热门文章

  1. UDP网络编程和URL编程
  2. ZOJ2770,火烧连营,差分约束
  3. 虚拟机服务器如何关机命令行,安卓虚拟机如何关机命令行
  4. 最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程)(持续更新中)
  5. 京东从net转Java_转!京东架构师熬夜录制,献给Java路上最最迷茫的你!赠教程...
  6. 新劳动法关于员工罚款的规定有哪些
  7. BP神经网络数据预测
  8. TSN中流的路由与调度的研究
  9. 电脑故障维修大全 [2]
  10. 电大2019计算机基础客观题,2019电大计算机应用基础试题及答案必考重点