0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

函数进阶与按键(2)

冬至子 来源:金沙滩工作室 作者:金沙滩工作室 2023-06-14 10:54 次阅读

8.4.5 矩阵按键的扫描

我们讲独立按键扫描的时候,大家已经简单认识了矩阵按键是什么样子了。矩阵按键相当于4组每组各4个独立按键,一共是16个按键。那我们如何区分这些按键呢?想一下我们生活所在的地球,要想确定我们所在的位置,就要借助经纬线,而矩阵按键就是通过行线和列线来确定哪个按键被按下的。那么在程序中我们又如何进行这项操作呢?

前边讲过,按键按下通常都会保持100ms以上,如果在按键扫描中断中,我们每次让矩阵按键的一个KeyOut输出低电平,其它三个输出高电平,判断当前所有KeyIn的状态,下次中断时再让下一个KeyOut输出低电平,其它三个输出高电平,再次判断所有KeyIn,通过快速的中断不停的循环进行判断,就可以最终确定哪个按键按下了,这个原理是不是跟数码管动态扫描有点类似?数码管我们在动态赋值,而按键这里我们在动态读取状态。

至于扫描间隔时间和消抖时间,因为现在有4个KeyOut输出,要中断4次才能完成一次全部按键的扫描,显然再采用2ms中断判断8次扫描值的方式时间就太长了(248=64ms),那么我们就改用1ms中断判断4次采样值,这样消抖时间还是16ms(144)。下面就用程序实现出来,程序循环扫描板子上的K1~K16这16个矩阵按键,分离出按键动作并在按键按下时把当前按键的编号显示在一位数码管上(用0~F表示,显示值=按键编号-1)。

图片

图片

图片

图片

图片

图片

这个程序完成了矩阵按键的扫描、消抖、动作分离的全部内容,希望大家认真研究一下,彻底掌握矩阵按键的原理和应用方法。在程序中还有两点值得说明一下。

首先,可能你已经发现了,中断函数中扫描KeyIn输入和切换KeyOut输出的顺序与前面提到的顺序不同,程序中我首先对所有的KeyIn输入做了扫描、消抖,然后才切换到了下一次的KeyOut输出,也就是说我们中断每次扫描的实际是上一次输出选择的那行按键,这是为什么呢?因为任何信号从输出到稳定都需要一个时间,有时它足够快而有时却不够快,这取决于具体的电路设计,我们这里的输入输出顺序的颠倒就是为了让输出信号有足够的时间(一次中断间隔)来稳定,并有足够的时间来完成它对输入的影响,当你的按键电路中还有硬件电容消抖时,这样处理就是绝对必要的了,虽然这样使得程序理解起来有点绕,但它的适应性是最好的,换个说法就是,这段程序足够“健壮”,足以应对各种恶劣情况。

其次,是一点小小的编程技巧。注意看keyout = keyout & 0x03;这一行,在这里我是要让keyout在0~3之间变化,加到4就自动归零,按照常规你可以用前面讲过的if语句轻松实现,但是你现在看一下这样程序是不是同样可以做到这一点呢?因为0、1、2、3这四个数值正好占用2个二进制的位,所以我们把一个字节的高6位一直清零的话,这个字节的值自然就是一种到4归零的效果了。看一下,这样一句代码比if语句要更为简洁吧,而效果完全一样。

8.5 简易加法计算器

学到这里,我们已经掌握了一种显示设备和一种输入设备的使用,那么是不是可以来做点综合性的实验了。好吧,那我们就来做一个简易的加法计算器,用程序实现从板子上标有0~9数字的按键输入相应数字,该数字要实时显示到数码管上,用标有向上箭头的按键代替加号,按下加号后可以再输入一串数字,然后回车键计算加法结果,并同时显示到数码管上。虽然这远不是一个完善的计算器程序,但作为初学者也足够你研究一阵子了。

首先,本程序相对于之前的例程要复杂得多,需要完成的工作也多得多,所以我们把各个子功能都做成独立的函数,以使程序便于编写和维护。大家分析程序的时候就从主函数和中断函数入手,随着程序的流程进行就可以了。大家可以体会体会划分函数的好处,想想如果还是只有主函数和中断函数来实现的话程序会是什么样子。

其次,大家可以看到我们再把矩阵按键扫描分离出动作以后,并没有直接使用行列数所组成的数值作为分支判断执行动作的依据,而是把抽象的行列数转换为了一种叫做标准键盘键码(就是电脑键盘的编码)的数据,然后用得到的这个数据作为下一步分支判断执行动作的依据,为什么多此一举呢?有两层含义:第一,尽量让自己设计的东西(包括硬件和软件)向已有的行业规范或标准看齐,这样有助于别人理解认可你的设计,也有助于你的设计与别人的设计相对接,毕竟标准就是为此而生的嘛。第二,有助于程序的层次化而方便维护与移植,比如我们现在用的按键是44的,但如果后续又增加了一行成了45的,那么由行列数组成的编号可能就变了,我们就要在程序的各个分支中查找修改,稍不留神就会出错,而采用这种转换后,我们则只需要维护KeyCodeMap这样一个数组表格就行了,看上去就像是把程序的底层驱动与应用层的功能实现函数分离开了,应用层不用关心底层的实现细节,底层改变后也无需在应用层中做相应修改,两层程序之间是一种标准化的接口。这就是程序的层次化,而层次化是构建复杂系统的必备条件,那么现在就先通过简单的示例来学习一下吧。

作为初学者针对这种程序的学习方式是,先从头到尾读一到三遍,边读边理解,然后边抄边理解,彻底理解透彻后,自己尝试独立写出来。完全采用记忆模式来学习这种例程,一两个例程你可能感觉不到什么提高,当这种例程背过上百八十个的时候,厚积薄发的感觉就来了。同时,在抄读的过程中也要注意学习编程规范,这些可都是无形的财富,可以为你日后的研发工作加分的哦。

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

8.6 练习题

1、理解单片机最小系统三要素电路设计规则。

2、掌握函数间相互调用的方法和规则。

3、学会独立按键和矩阵按键的电路设计方法和软件编程思路。

4、用一个按键实现一个数码管数字从F~0递减的变化程序。

5、用矩阵按键做一个简易减法计算器。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6037

    文章

    44558

    浏览量

    635191
  • 数码管
    +关注

    关注

    32

    文章

    1882

    浏览量

    91105
  • 计算器
    +关注

    关注

    16

    文章

    437

    浏览量

    37342
  • 矩阵按键
    +关注

    关注

    0

    文章

    28

    浏览量

    8370
收藏 人收藏

    评论

    相关推荐

    函数进阶按键(1)

    用户与单片机之间的信息交互需要依赖于两类设备:输入设备和输出设备。
    的头像 发表于 06-14 10:50 931次阅读
    <b class='flag-5'>函数</b><b class='flag-5'>进阶</b>与<b class='flag-5'>按键</b>(1)

    按键函数分享!

    #defineKEY_InvalidState0#defineKEY_ShortState1#defineKEY_LongState2_UBYTEKEY_ReturnState(void);//用户调用,返回按键状态//清除按键
    发表于 10-23 04:37

    STM32入门(进阶)任务具体的要求

    这个小项目是来自参加电设时,老师发的STM32入门(进阶)任务,具体的要求 STM32入门(进阶)任务,具体的要求如下:软件设计要求编写简单I/O程序,能用板上的4个基本按键控制10个LED灯的亮灭
    发表于 08-09 08:09

    51单片机按键检测和信号函数仿真的详细资料说明

    本文档的主要内容详细介绍的是51单片机按键检测和信号函数仿真的详细资料说明,在单片机中会遇到识别按键的问题,常用的独立按键电路如下图:
    发表于 04-11 18:22 4次下载
    51单片机<b class='flag-5'>按键</b>检测和信号<b class='flag-5'>函数</b>仿真的详细资料说明

    单片机的按键处理框架资料和函数详细说明

    按键处理代码即可,言归正传,先简介一下几个文件,ringfifo.c提供了一个简单的环形缓冲队列,用以通知按键消息,key.c 实现的按键的框架处理(读取按键,调用
    发表于 09-12 17:23 1次下载
    单片机的<b class='flag-5'>按键</b>处理框架资料和<b class='flag-5'>函数</b>详细说明

    STM32实用的按键处理程序可移植的函数免费下载

    本文档的主要内容详细介绍的是STM32实用的按键处理程序可移植的函数免费下载
    发表于 04-28 08:00 2次下载
    STM32实用的<b class='flag-5'>按键</b>处理程序可移植的<b class='flag-5'>函数</b>免费下载

    C语言的进阶学习课件资料合集

    本文档的主要内容详细介绍的是C语言的进阶学习课件资料合集包括了:第1节-数据的存储,第2节-指针的进阶,第3节-字符串+内存函数的介绍,第4节-自定义类型详解(结构体+枚举+联合),第
    发表于 07-14 08:00 11次下载
    C语言的<b class='flag-5'>进阶</b>学习课件资料合集

    大疆发布 “御”2 行业进阶版:热成像传感器、可见光相机模块

    昨天,大疆发布了 “御”2 行业进阶版,拥有更高清、流畅的热成像传感器和更高像素的可见光传感器,支持 32 倍数码变焦,可搭载 RTK 模块实现厘米级定位,标准套装售价 36000 元。 IT之家
    的头像 发表于 12-16 09:15 3702次阅读

    【CC2530强化实训02】普通延时函数实现按键的单击与双击

    【题目要求】 用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来计算按键按下的时间是通用的做法,然而,使用普通的延时函数实现按键单击与双击的区分也
    发表于 11-29 20:21 19次下载
    【CC2530强化实训02】普通延时<b class='flag-5'>函数</b>实现<b class='flag-5'>按键</b>的单击与双击

    STM32 按键输入实验

    加粗样式一.实验目的1.熟悉使用STM32F4XX开发板2.掌握其GPIO的使用方法3.掌握按键的实现方法二.实现步骤(1)使能按键对应IO口时钟。调用函数
    发表于 12-27 18:53 4次下载
    STM32 <b class='flag-5'>按键</b>输入实验

    stm32按键实验讲解

    按键实验GPIO引脚图及相关配置按键初始化函数按键扫描函数按下按键给出对应响应GPIO引脚图及相
    发表于 12-27 19:09 6次下载
    stm32<b class='flag-5'>按键</b>实验讲解

    指针进阶第五站:函数指针!

    定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?下面哪个是正确的?
    发表于 08-17 15:58 535次阅读

    Python-函数进阶与递归

    在程序开发中,有时候,会希望一个函数执行结束后,告诉调用者 **一个结果** ,以便调用者针对结果作后续的处理,返回值是函数完成工作后,最后给调用者的一个结果,在函数中使用 return 关键字可以返回结果,**调用者** 可以
    的头像 发表于 02-16 15:19 770次阅读
    Python-<b class='flag-5'>函数</b>的<b class='flag-5'>进阶</b>与递归

    函数信号发生器按键介绍

    函数信号发生器是电子测试领域中不可或缺的重要工具,它能够模拟产生各种波形信号,如正弦波、方波、三角波等,广泛应用于电路测试、信号模拟、科学研究等多个领域。函数信号发生器的按键设计是其功能实现的重要组成部分,本文将对
    的头像 发表于 05-15 16:14 1916次阅读

    函数信号发生器的各类按键

    发生器的功能,了解其按键的功能和使用方法至关重要。本文将详细介绍函数信号发生器的各类按键,旨在为读者提供全面而深入的了解。
    的头像 发表于 05-30 16:05 1147次阅读