嵌入式技术及应用(STM32CubeMX版)课件 任务12 用键盘控制秒表的运行_第1页
嵌入式技术及应用(STM32CubeMX版)课件 任务12 用键盘控制秒表的运行_第2页
嵌入式技术及应用(STM32CubeMX版)课件 任务12 用键盘控制秒表的运行_第3页
嵌入式技术及应用(STM32CubeMX版)课件 任务12 用键盘控制秒表的运行_第4页
嵌入式技术及应用(STM32CubeMX版)课件 任务12 用键盘控制秒表的运行_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务12用键盘控制秒表的运行任务要求在任务11的基础上增加S0、S1两个按键。S0键作启动/停止键,奇数次按S0键,启动秒表走时,秒表在当前显示秒数的基础上计时。例如,当前数码管显示的是05,第1次或者第3次按S0键后,秒表在5秒的基础上计时,依次显示06,07,……。偶数次按S0键,秒表停止走时,显示时间一直保持不变。S1键为清0键,按S1键,秒表停止走时,显示数值为0。上电时,秒表停止计时,数码管显示0秒。知识储备

1.键盘的基本知识(1)键盘处理流程单片机系统中所用的键盘有独立式键盘和矩阵式键盘两种。键盘接口的基本任务主要有4个方面:⑴判断是否有键按下;⑵去抖动;⑶确定所按下键的键值,即确定是何键按下;⑷对按键功能进行解释。在一次按键操作中,由于按键的机械特性的原因,键按下或释放都有一个弹跳的抖动过程,抖动的时间一般为5~15ms,其波形图如图5-16所示。图5-16

抖动波形图

1.键盘的基本知识(1)键盘处理流程按键抖动必须消除,否则会引起按键识别错误。去抖动的方法有硬件去抖动和软件去抖动两种方法。硬件去抖动的方法是,在按键两端并上一个小电容,或者用R-S触发器组成的闩锁电路来去抖动。软件法是采取延时的方法来回避抖动期,其具体的做法是,检测到有键按下或者有键释放后,延时5ms~15ms左右的时间,再去读按键输入情况,此时抖动期已过,所读的按键输入是按键稳定按下或释放状态。键盘处理的一般流程如图5-17所示。图5-17

键盘处理流程

1.键盘的基本知识(2)独立式键盘接口⑴独立式键盘的接口电路其电路如图5-18所示,其中,图a为所有按键接在同一个GPIO口上的键盘电路,图b为按键接在不同的GPIO口上的键盘电路。图中,K1~K4为按键,R1~R4为上拉电阻,其作是,将按键按下与释放的机械动作转换成单片机可识别的高低电平,例如,在图b中,K1按下后,PC13=0,K1释放后,PC13=1。电容C1~C4为去抖动滤波电容,它们分别与各按键并联。从图5-18可以看出,独立键盘电路的特点是,按键的一端接地,另一端接并行口的某一根I/O口线,I/O口线外接上拉电阻。若并行口内部有上拉电阻,可不接上拉电阻。

1.键盘的基本知识(2)独立式键盘接口(a)按键位于同一GPIO口中(b)按键位于不同GPIO口中图5-18

独立式键盘接口电路

1.键盘的基本知识(2)独立式键盘接口⑵独立式键盘的处理程序键盘处理程序的执行时间一般在几毫秒以内,而一次按键按下的时间一般为几十毫秒乃至上百毫秒。键盘处理需要注意的问题是,要防止一次按键按下被多次解释执行(连击键除外)。键盘处理可以放在main函数中,也可以放在10ms定时中断服务函数中。

1.键盘的基本知识(2)独立式键盘接口键盘的处理方法是,用位变量keytreated标识按键是否已处理,该变量可以是全局变量,也可以是静态的局部变量。keytreated=0表示按键未处理,keytreated=1表示按键已处理。用keytreated标志位与按键是否按下来控制按键解释程序的执行,延时去抖动后,如果无键按下或者是键按下已处理(keytreated=1),则不进行按键功能的解释处理。如果检测到有键按下,并且键按下未处理(keytreated=0),则确定按键的位置后再对按键进行解释处理,按键解释处理结束后再将keytreated位置1,以阻止下一次循环时,对同一键按下进行重复解释。另外,为了保证下次有键按下时程序能正常处理按键,按键释放后,还需要将keytreated清0。按键处理的流程如图5-19所示。

1.键盘的基本知识(2)独立式键盘接口图5-19

键盘处理的流程图

1.键盘的基本知识(2)独立式键盘接口不同的电路实现上述流程图的代码略有不同,其差别在于判断是否有键按下、确定按键的位置以及按键功能解释的方法不同。按键位于同一个GPIO口时,一般是读GPIO口的输入,然后判断输入值中按键所在位是否为1来确定是否有键按下,再用switch-case语句确定是何键按下并进行按键功能解释。以图5-18(a)所示的电路为例,在main函数中进行键盘处时,main函数的框架结构详写链接文档。

1.键盘的基本知识(2)独立式键盘接口【说明】①本程序也适合于后面介绍的矩阵式键盘处理。不同的键盘其获取键值的方法不同,在实际使用中需要根据具体情况作适当变换。②在key()函数中,第23行代码的功能是,读PE口的输入,并消除PE0~PE7、PE13~PE15的输入影响。本例中,读按键输入读的是PE口的输入,由于PE0~PE7、PE13~PE15并不是有效的按键输入引脚,它们的输入是不确定的(与其外接电路有关),为了方便后续的分析判断,我们必须将这些不确定的无效位设置成0或者1,本例中,我们是将其设置成1。

1.键盘的基本知识(2)独立式键盘接口③对于按键位于同一GPIO口的独立式键盘而言,按键的输入值中包含了按键的键值信息,即按键的输入值实际上就是按键的编码值。输入值的某位为0,则表示对应的按键按下。对于图5-18(a)所示电路,按键接在PE8~PE12引脚上,在PE口的输入值中,D0~D7、D13~D15为无效位。去掉无效位的输入后,若PE口输入值为1111101011111111B,则是K1、K3键按下。程序中可以不单独使用scan()函数获取键值。

1.键盘的基本知识(2)独立式键盘接口【例】STM32的PE口外接3只按键,PD口外接一位数码管显示电路,如图5-20所示。编写程序实现以下功能:上电时数码显示0,按S1显示数据加1,按S2显示数据减1,按S3显示数据清0。图5-20

例题中电路图

1.键盘的基本知识(2)独立式键盘接口【解】电路中,数码管的位选脚(com脚)接正电源VCC,因此数码为共阳极数码管。实现本例功能的思路是,用全局变量num保存数码管的显示值,在键盘处理程序中依按键的功能对num分别进行加1、减1或清0处理,然后在数码管显示程序中对num中的数进行显示,这样就可以实用按键调整数码管的显示值。本例的程序详见链接文档例题程序按键位于不同GPIO口时,一般用if语句直接判断各按键是否按下,再用if-else语句确定是何键按下并进行按键功能解释。以图5-18(b)所示的电路为例,键盘处理程序的框架结构详见链接文档。

1.键盘的基本知识(3)矩阵式键盘接口⑴矩阵式键盘的接口电路由PE8~PE11、PE12~PE15口线与外部16个按键构成的矩阵式键盘电路如图5-21所示。由图可以看出,矩阵式键盘采用行列电路结构,行线为输入口(图中PE8~PE11口线),外接有上拉电阻,列线为输出口,按键位于行线与列线的交叉处,一端接行线,另一端接列线。图5-21

矩阵键盘接口电路

1.键盘的基本知识(3)矩阵式键盘接口(2)矩阵式键盘的处理程序1)判断是否有键按下判断矩阵式键盘是否有键按下的方法是,将列线全部输出0后再读行线输入,若行线输入为全1,则无键按下,否则有键按下。例如,在图5-21的矩阵式键盘中,若S5按下,PE12~PE15全部输出0(即二进制数0000)后读PE8~PE11的输入。这时,第1行与第1列因S5按下而导通,第1行被拉至低电平,PE9=0,行线PE8~PE11的输入就不再是全1了。必须注意的是,若PE9=0,并不能确定是S5键按下,因为S4、S5、S6、S7任意一键按下都会导致PE9=0。判断是否有键按下的程序段如下:

1.键盘的基本知识(3)矩阵式键盘接口123456789uint16_ttmp;HAL_GPIO_WritePin(GPIOE,0xf000,GPIO_PIN_RESET);//4根列线(PE12~PE15)输出0tmp=GPIOE->IDR|0xf0ff; //读4根行线(PE8~PE11)的输入,并将无效位置1if(tmp!=0xffff) //判断是否有键按下{ //有键按下时的处理}else{ //无键按下时的处理}

1.键盘的基本知识(3)矩阵式键盘接口2)确定按键的位置确定按键位置的方法是,先将第0列输出低电平,其他列输出高电平,读行线输入,这时检查的是S0、S4、S8、S12这4个按键的状态。若读得的行输入为全1,则表示与第0列相接的4个键无键按下。再将第1列输出低电平,其他各列输出高电平,读行线输入,这时检查的是S1、S5、S9、S13这4个按键的状态。若读得的行输入仍为全1,则表示与第1列相接的4个键无键按下。依此类推,再查下一列,直到所有列检查完毕,则必有一列输出低电平时,行输入不为全1。

1.键盘的基本知识(3)矩阵式键盘接口若第j列输出低电平,其他列输出高电平时,读行线输入不是全1,则表示按键位于第j列,此时应退出循环,再查看是哪一根行线为低电平,如果是第i根行线为低电平,则按键位于第i行,按键的键值keyval=i×每行按键数+j。上述方法可以概括为,列线逐列输出低电平,然后检查行线输入,若行线输入为全1,则继续下一列输出。若第j列输出0时,行输入不为全1,则查输入为0的行线号。确定按键位置的流程图如图5-22所示。图5-22

确定按键位置程序流程图

1.键盘的基本知识(3)矩阵式键盘接口确定按键位置的程序【说明】

第15行~第33行的功能是,检查第j列是否有键按下,并确定按键所在的行号。这部分代码也可以用逐根行线判断的方式来实现,其代码如链接所示。实现方法与步骤任务12的硬件电路如图5-23所示。

1.搭建电路图5-23

任务12的电路图

实现方法与步骤任务12只是在任务11的基础上添加了2只按键电路,其硬件初始化代码可通过修改任务11的硬件初始化代码而成,其生成过程如下:步骤(1)在“D:\ex”文件夹中新建Task12子文件夹。(2)将任务11的STM32CubeMX工程文件Task11.ioc(位于“D:\ex\Task11”文件夹中)复制到Task12文件夹中,并将其改名为Task12.ioc。2.生成硬件初始化代码

实现方法与步骤步骤(3)双击Task12.ioc文件图标,打开任务12的STM32CubeMX工程文件,然后按照任务5中介绍的方法,在STM32CubeMX工程文件中将PC13、PD13配置成输入引脚,并将其设置为上拉输入模式。(4)保存STM32CubeMX工程文件,然后点击“GENERATECODE”按钮,STM32CubeMX就会生成任务12的初始化代码。2.生成硬件初始化代码

实现方法与步骤任务12需要控制秒表的启动、停止以及清0。其编程思路是,用变量sec保存秒表的秒时间,用变量entim控制秒表的运行,entim=0时,秒表停止运行,entim=1时,秒表走时。在其他模块中,只需要控制entim、sec的值,就可以实现秒表的启动、停止和清0。由于entim和sec这2个变量需在多个模块中使用,程序中要将这2个变量定义成全局变量。任务12中,仍然是在main.c文件中编写秒表程序,其修改后的程序如链接所示。(其中,第4~5行、第21~22行、第30行为修改部分。)3.修改秒表程序

实现方法与步骤步骤(1)将D:\ex\Task11文件夹中的User子文件夹以及文件夹中的文件(任务11中的显示程序文件)复制到D:\ex\Task12文件夹中。(2)按照任务11中介绍的方法在任务12的Keil工程中新建User组,并将User文件夹中的Display.c文件添加至User组中。(3)将User文件夹添加到include目录中。(4)按照程序编写规范的要求将上述程序代码添加至main.c文件的对应位置处。再将程序下载至开发板中并运行程序,我们可以看到数码显示的是00,秒表处于停止状态,如果将程序中第4行代码改为“uint8_tentim=1;”,则秒表与任务11一样可以正常计时。

实现方法与步骤任务12中,S1键为清0键,它只有一种功能,可以直接照按前面介绍的方法编写程序。S0键为启动/停止键,它有2种功能,与S0键按下的次数有关。其编程思路是,用变量keycnt记录S0键按下的次数,当S0按下且没处理过时,就将keycnt的值加1,然后对keycnt的值进行判断,若为奇数,则启动秒表走时,若为偶数,就停止秒表走时。其中,判断keycnt的值是否为奇数的方法可以是,判断keycnt的最低位是否为1。用key.c文件保存按键处理程序,其接口文件为key.h。按照上述思路,key.c文件的内容如链接所示。4.添加键盘处理程序

实现方法与步骤【思考】去掉第21行代码会是什么结果?去掉第22行代码会是什么结果?去掉第21、22行代码又是什么结果?请先分析再上机实践。(key.h文件)

实现方法与步骤步骤(1)新建key.c和key.h文件,并将其保存至D:\ex\Task12\User文件夹中,然后在key.c和key.h文件中添加上述程序代码。(2)将key.c文件添加至User组中。(3)在main.c文件添加调用键盘处理函数key()的相关代码,添加代码后main.c文件的结构如下:

实现方法与步骤123456789101112…#include"Display.h"#include"key.h"…i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论