任务3独立按键的实现课案_第1页
任务3独立按键的实现课案_第2页
任务3独立按键的实现课案_第3页
任务3独立按键的实现课案_第4页
任务3独立按键的实现课案_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、任务 3.3 独立按键的实现任务 3.3 独立按键3.3.1 任务介绍在数字钟中有四个独立按键,功能分别是调整、加、减、确定,用以调整系统的时间。 在单片机系统中,键盘是基本和常用的接口,它是构成人机对话通话的一种常用方式,实现 向单片机系统输入数据、传送命令等功能,是人工干预、设置和控制系统运行的主要手段。本节的任务要求:利用开发板上的四个按键,配合任务 3.2 数码管显示程序,实现数字钟的调时,为了简 化程序,用 3 个 LED的亮灭来代替对应数码管的闪烁(数码管的闪烁在这里有些难)。正常走时,3个 LED都不点亮,当按下“调整”键时, “小时”对应的 LED点亮,再次按下“调整” 键,则

2、“分”对应的 LED点亮,然后再按下“调整”键,则“秒”对应的LED点亮,依次循环,直到按下“确定”键,三个LED返回到不点亮的状态。当按下“调整”键后,按下“加”或者“键”按键,则对应的数码管的显示值每次加1 或者减 1。3.3.2 知识准备1、轻触按键的认识键盘分为编程键盘和非编程键盘。键盘上闭合键的识别由专用的硬件编码器来实现的为 编程键盘,如计算机键盘;闭合键的识别由软件来实现的为非编程键盘 , 轻触按键属于非编程 键盘。轻触按键具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统中。图 3.3.1 所示的是市面常见的轻触按键,从封装来区分,有贴片的,也有直插的;从引脚的数量来区

3、分,有 2 个引脚的, 也有 4 个引脚的。 开发板上使用的按键时 4 引脚直插按键, 尺寸为 665, 如图 3.3.2 所示。图 3.3.3 各种形状的按键图 3.3.2 开发板使用的按键任务 3.3 独立按键的实现2、按键的硬件电路和识别方法图 3.3.3 是轻触按键的内部结构图,按键的 4 个引脚两两连通(可以用万用表测量) ,不 连通的引脚,当按键被按下时,在金属弹片和反作用弹簧的作用下也会连通,当按键释放后, 弹簧不起作用,引脚不连通。图 3.3.3 轻触按键内部结构图 3.3.4 轻触按键的接口电路图 3.3.4 是轻触按键的单片机接口电路,按键一端接地,另外一端接 I/O 口,

4、同时通过 上拉电阻接电源(上拉电阻大小5K 10K)。简单分析一下按键检测的原理:当按键没有按下的时候,单片机 I/O 通过上拉电阻 R接到 VCC,我们在程序中读取该 I/O 的电平的时候,其值 为 1( 高电平 ); 当按键按下的时候, 该 I/O 被短接到 GND,在程序中读取该 I/O 的电平的时候, 其值为 0( 低电平 ) 。这样,按键的按下与否,就和与该按键相连的 I/O 的电平的变化相对应 起来。 结论:我们在程序中通过检测到该 I/O 口电平的变化与否,即可以知道按键是否被按 下,从而做出相应的响应。3、检测按键按下按键的检测原理看起来比较简单,我们按照上述的原理先试着写一段

5、任务中的程序看看运行效果怎么样。程序实现的内容为:百位数内的计数器, ,按键每按下一次,计数器加1,将计数器的值显示在开发板的两位数码管上。程序如下:#incldue#define uchar unsigned char#define uint unsigned intsbit KeyInput=P10;/按键接口/段码uchar code Seg7Code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar code Seg7Posit=0xfe,0xfd;/位码uchar DispBuffer2;/ 缓冲区任务 3.3 独立按键的

6、实现/void DelayMs(uint xms ) ms级延时函数,省略/void Seg7Display() 2位数码管显示函数,省略void main(void)uchar DispCnt=0; / while(1)Seg7Display();if(KeyInput=0) /DispBuffer0=DispCnt/10;DispBuffer1=DispCnt%10; / if(+DispCnt=100) /按键加 1 计数器/ 动态扫描检测到按键按下计数值的个位和十位的分解每按一次,计数器加 1, 超过 99,归 0DispCnt=0;程序编译好后烧录到单片机中,看一下运行效果。上电后,

7、数码管显示“ 00”,按一下按 键,数码管向上加数,但是每按一下,向上加好几个数,如果按键不弹起,会连续加 1,程序 中没有实现我们想要的按一下加 1 的效果。我们回到刚才编写的程序中,在大循环 while(1) 中,不停的监测按键是否按下,如果按下 则加 1,逻辑是正确的。按键按下到按键释放大约需要0.2 秒到 0.5 秒,而程序扫描的速度非常快,按键每按下一次,程序中已经扫描多次了,所以才会出现上述的现象。怎样才能实现 按键每按一次加 1 的效果呢?4、等待按键释放我们在之前按键检测程序上结尾加这样一条语句: While(!key_value); 编译后烧录到单片 机中,就可以实现按一次按

8、键加 1 的效果了。if(KeyInput=0) /DispBuffer0=DispCnt/10;DispBuffer1=DispCnt%10; if(+DispCnt=100) / DispCnt=0;While(!KeyInput); / /检测到按键按下每按一次,计数器加 1,超过 99,归零如果按键没有弹起,程序指针就会停在这里,直到按键释放任务 3.3 独立按键的实现While(!key_value); 这个语句是怎么消除了按一下加多个数的问题呢?程序中初次检测到 了按键按下,则执行数值分解语句和加 1 语句,最后执行 While(!key_value); 按键按下后, key_va

9、lue 的值为 0,取反后,为 1,则 while 语句的条件为真,程序指针会停在这里,不停的 检测按键是否释放,按键释放后, key_value 的值变为 1,取反后变为 0,条件为假,程序指针 向下执行。这样实现了按下一次加 1 的效果了。如果不停的按下按键,我们会发现,大多数按下的时候会加1,但有的时候还是会出现按一下加几个数的现象,这又是什么原因造成的呢?5、按键消抖动 按键的开关为机械弹性触点开关,它是利用机械点接触和分离实现电路的通断。由于机 械点的弹性作用,加上人们按键时的力度、方向的不同以,按键开关从按下到接触稳定要经 过数毫秒的弹跳抖动,即在按下的几十毫秒里会连续产生多个脉冲

10、。释放按键时,电路也不 会一下断开,同样会产生抖动。这两次抖动的时间分别为 10-20ms 左右,而按键的稳定闭合 通常大于 0.3-0.5 秒。因此,为了确保 MCU 对一次按键动作只确认一次,按键闭合时,必须 要进行消抖处理。 否则由于 MCU 执行的速度较快, 会将抖动的多个脉冲误认为为多次的按键。 图 3.3.5 是按键按下抖动示意图。图 3.3.5 按键按下抖动示意图按键的消抖动既可以采用硬件方法,也可以采用软件的方法。使用硬件消抖的方式,需 要在按键连接的硬件设计上增加硬件消抖电路,如RS触发器或者 RC 积分电路等。采用硬件消抖方式增加了系统的成本,而利用软件方式消抖则是比较经济

11、的做法,但增加了软件设计 的复杂性。软件方式消抖的基本原理是在软件中对按键进行两次确认,既在第一次检测到按键按下 后,间隔 10ms 左右再次检测该按键是否按下,只有两次都检测到按键按下时才最终确认有键 按下,从而跳过了按键的抖动,消除了抖动的影响。程序如下:任务 3.3 独立按键的实现if(KeyInput=0) /DelayMs(10);if(KeyInput=0)DispBuffer0=DispCnt/10;DispBuffer1=DispCnt%10;if(+DispCnt=100) /DispCnt=0;while(!KeyInput); /检测到按键按下/ 延时消抖/ 再次检测按键

12、是否按下每按一次,计数器加 1, 超过等待按键释放检测按键按下, 10ms 消抖,等待按键弹起,称之为按键检测三部曲,但本节教程的程序 仅能作为功能演示用,在实际项目中有很大的弊端,第 4 单元任务 1 给出了按键高效扫描方 法。3.3.2 任务实施本节的任务实现程序如下include#define uchar unsigned char #define uint unsigned int / 按键接口sbit KeyInput1=P20;/“调整”键sbit KeyInput2=P21;/“增减”键sbit KeyInput3=P22;/“减少”键sbit KeyInput4=P23;/“确

13、定”键/ 状态灯sbit LedHour=P30; sbit LedMinute=P31;sbit LedSecond=P32;/段码uchar code Seg7Code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar code Seg7Posit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf;/uchar DispBuffer6; /位码 缓冲区/ms 级延时函数void DelayMs(uint xms) uint i,j;for(i=0;ixms;i+) for(j=0;j122;j+);/6 位数码管显示子

14、函数,在第二位和第四位上显示小数点 void Seg7Display()uchar i;for(i=0;i=4)AdjustNum=1;/AdjustNum/任务 3.3 独立按键的实现消隐 送段码/ 在第二位和第四位数码管上加小数点 送位选 延时时间计数器“小时”初值“分”初值“秒”初值按键值 按下“调整”按键时对应的调整值 三个状态灯初始时都不点亮检测按键是否按下,并返回键值按下确定键,进入到调整界面的取值为 1、 2、 3 分别对应 小时 、分、秒任务 3.3 独立按键的实现点亮 小时 对应的 LED点亮 分对应的 LED点亮 秒对应的 LED按下“增加”按键小时加 1分加 1秒加 1返

15、回正常界面if(AdjustNum=1) /LedHour=0;LedMinute=LedSecond=1;if(AdjustNum=2) /LedMinute=0;LedHour=LedSecond=1;if(AdjustNum=3) /LedSecond=0;LedHour=LedMinute=1;if(KeyValue=0x02) /if(AdjustNum=1) /if(+Hour=24)Hour=0;if(AdjustNum=2) /if(+Minute=60)Minute=0;if(AdjustNum=3) /if(+Second=60)Second=0;if(KeyValue=0

16、x04) /任务 3.3 独立按键的实现AdjustNum=0; /LedHour=LedMinute=LedSecond=0; 状态灯熄灭,把 AdjustNum 赋值为 0TimeToBuff(Hour,Second,Minute); /Seg7Display();if(+Cnt=166)Cnt=0;if(+Second=60)Second=0;if(+Minute=60) Minute=0;if(+Hour=24)Hour=0;把待显示的值送入缓冲区/ 动态扫描, 1ms 6=6ms/Cnt 计数 83 次 12=996ms/1 秒计数 60 次,为 1 分钟/1 分钟计数 60 次,为

17、 1 小时/24 小时后清零任务 3.3 独立按键的实现程序解释如下:(1)程序中加粗的是有关于本节按键程序的,其余部分是上一节中的内容,在这里我们 只解释和按键相关的程序。按键的程序分两部分, 一部分是按键检测函数,另外一部分是主 程序中的键值处理程序。( 2 )按键检测由两个子函数来完成。 KeyScan() 和 GetKeyValue() 。 KeyScan() 函数完成 按键状态的扫描,并返回状态值( temp), temp 取值为 0x01 、 0x02、 0x03 、 0x04 分别对应 4 个按键的按下,如果没有按键按下,则 temp 为 0xff 。在 GetKeyValue(

18、) 中依照按键检测“三部曲”来取出按键的键值。首先判断 KeyScan() 函 数返回的值是不是 0xff ,如果不是,则说明有按键按下,经过10ms 消抖后,再次执行 KeyScan() 函数判断有无按键按下,返回值不为 0xff ,则确定按键按下,返回键值,然后不停的检 测 KeyScan() 返回的值是否为 0xff ,如果不是,说明按键还没有释放,就一直不停地检测并 等待,直到按键释放。如果没有按键按下, GetKeyValue() 返回的键值为初值 0x00 ,如果有按键按下, 4 个按键 返回的键值依次为 0x01, 0x02,0x03, 0x04。获取了按键的键值后,就可以根据编写键值处 理函数了。(3)键值处理函数在主程序中完成,通过调节变量AdustNum 的值完成各个按键的任务。任务 3.3 独立按键的实现Adust

温馨提示

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

评论

0/150

提交评论