- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机教学第四部分
单片机教学第二十四课 键盘接口与编程
键盘是由若干按键组成的开关矩阵 它是微型计算机最常用的输入设备 用户可以通过
键盘向计算机输入指令 地址和数据 一般单片机系统中采和非编码键盘 非编码键盘是由
软件来识别键盘上的闭合键 它具有结构简单 使用灵活等特点 因此被广泛应用于单片机
系统
按键开关的抖动问题
组成键盘的按键有触点式和非触点式两种 单片机中应用的一般是由机械触点构成的 在下
图中 当开
图1
图2
关S 未被按下时 P1 0 输入为高电平 S 闭合后 P1 0 输入为低电平 由于按键是机械
触点 当机械触点断开 闭合时 会有抖动动 P1 0 输入端的波形如图2 所示 这种抖动
对于人来说是感觉不到的 但对计算机来说 则是完全可以感应到的 因为计算机处理的速
度是在微秒级 而机械抖动的时间至少是毫秒级 对计算机而言 这已是一个 漫长 的时
间了 前面我们讲到中断时曾有个问题 就是说按键有时灵 有时不灵 其实就是这个原因
你只按了一次按键 可是计算机却已执行了多次中断的过程 如果执行的次数正好是奇数次
那么结果正如你所料 如果执行的次数是偶数次 那就不对了
为使CPU 能正确地读出P1 口的状态 对每一次按键只作一次响应 就必须考虑如何去
除抖动 常用的去抖动的方法有两种 硬件方法和软件方法 单片机中常用软件法 因此
对于硬件方法我们不介绍 软件法其实很简单 就是在单片机获得P1 0 口为低的信息后
不是立即认定S1 已被按下 而是延时 10 毫秒或更长一些时间后再次检测P1 0 口 如果
仍为低 说明S1 的确按下了 这实际上是避开了按键按下时的抖动时间 而在检测到按键
释放后 P1 0 为高 再延时 5-10 个毫秒 消除后沿的抖动 然后再对键值处理 不过一
般情况下 我们通常不对按键释放的后沿进行处理 实践证明 也能满足一定的要求 当然
实际应用中 对按键的要求也是千差万别 要根据不同的需要来编制处理程序 但以上是消
除键抖动的原则
键盘与单片机的连接
图4
图3
1 通过1/0 口连接
将每个按键的一端接到单片机的I/O 口 另一端接地 这是最简单的方法 如图3 所示
是实验板上按键的接法 四个按键分别接到P3.2 P3.3 P3.4 和P3.5 对于这种键各程序
可以采用不断查询的方法 功能就是 检测是否有键闭合 如有键闭合 则去除键抖动 判
断键号并转入相应的键处理 下面给出一个例程 其功能很简单 四个键定义如下
P3.2 开始 按此键则灯开始流动 由上而下
P3.3 停止 按此键则停止流动 所有灯为暗
P3.4 上 按此键则灯由上向下流动
P3.5 下 按此键则灯由下向上流动
UpDown EQU 00H ;上下行标志
StartEnd EQU 01H ;起动及停止标志
LAMPCODE EQU 21H ;存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown ;启动时处于向上的状态
CLR StartEnd ;启动时处于停止状态
MOV LAMPCODE,#0FEH ;单灯流动的代码
LOOP:
ACALL KEY ;调用键盘程序
JNB F0,LNEXT ;如果无键按下 则继续
ACALL KEYPROC ;否则调用键盘处理程序
LNEXT:
ACALL LAMP ;调用灯显示程序
AJMP LOOP ;反复循环 主程序到此结束
;
DELAY:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;延时程序 键盘处理中调用
KEYPROC:
MOV A,B ;从B 寄存器中获取键值
JB ACC.2,KeyStart ;分析键的代码 某位被按下 则该位为1 因为在键盘程序中已取反
JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartE
文档评论(0)