本站首页 | 资讯中心 | 软件分类 | 最近更新 | 推荐软件 | 热门软件 | 热门文章   
设为主页
收藏本站
联系我们
| 电子基础 | 单片机学习 | 经验漫谈 | 电子制作 | 网络知识 | 电脑知识 | 建站心得 | 硬件维护 |
绿色软件搜索:   发布软件 | 发布文章 | 雷火范文
当前位置:雷火软件站文章首页电子基础基础文章→键盘接口与编程
 精彩推荐
 总热门文章排行
 本类热门文章排行
键盘接口与编程
作者:不详  来源于:8621家园  发布时间:2006-7-19 10:55:57 [ 字体: ]

键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。

1.       按键开关的抖动问题

组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。在下图中,当开

S未被按下时,P10输入为高电平,S闭合后,P10输入为低电平。由于按键是机械触点,当机械触点断开、闭合时,会有抖动动,P10输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全可以感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个漫长的时间了。前面我们讲到中断时曾有个问题,就是说按键有时灵,有时不灵,其实就是这个原因,你只按了一次按键,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。

为使CPU能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。单片机中常用软件法,因此,对于硬件方法我们不介绍。软件法其实很简单,就是在单片机获得P10口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P10口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P10为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是消除键抖动的原则。

2.       键盘与单片机的连接

1、通过1/0口连接。将每个按键的一端接到单片机的I/O口,另一端接地,这是最简单的方法,如图3所示是实验板上按键的接法,四个按键分别接到P3.2 P3.3P3.4P3.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      StartEnd  ;第一个键按下后的处理

       AJMP     KEY_RET

KeyOver:

       CLR StartEnd  ;第二个键按下后的处理

       AJMP     KEY_RET

KeyUp:    SETB      UpDown        ;第三个键按下后的处理

       AJMP     KEY_RET

KeyDown:

       CLR UpDown        ;第四个键按下后的处理

KEY_RET:RET

KEY:

       CLR F0          ;F0,表示无键按下。

       ORL       P3,#00111100B      ;P3口的接有键的四位置1

       MOV      A,P3              ;P3的值

       ORL       A,#11000011B ;将其余4位置1

       CPL A            ;取反

       JZ    K_RET           ;如果为0则一定无键按下

       ACALL   DELAY          ;否则延时去键抖

       ORL       P3,#00111100B

       MOV      A,P3

       ORL       A,#11000011B

       CPL A

       JZ    K_RET

       MOV      B,A         ;确实有键按下,将键值存入B

       SETB      F0          ;设置有键按下的标志

K_RET:                       

       ORL       P3,#00111100B      ;此处循环等待键的释放

       MOV      A,P3

       ORL       A,#11000011B

       CPL A

       JZ    K_RET1         ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回

       AJMP     K_RET

K_RET1:

       RET

;-----------------------------------   

D500MS:                      ;流水灯的延迟时间

       PUSH      PSW

       SETB      RS0

       MOV      R7,#200

D51:       MOV      R6,#250

D52:       NOP

       NOP

       NOP

       NOP

       DJNZ      R6,D52

       DJNZ      R7,D51

       POP PSW

       RET

;-----------------------------------

LAMP:

       JB    StartEnd,LampStart       ;如果StartEnd=1,则启动

       MOV      P1,#0FFH

       AJMP     LAMPRET            ;否则关闭所有显示,返回

LampStart:

       JB    UpDown,LAMPUP ;如果UpDown=1,则向上流动

       MOV      A,LAMPCODE

       RL   A            ;实际就是左移位而已

       MOV      LAMPCODE,A     

       MOV      P1,A

       LCALL    D500MS

       AJMP     LAMPRET

LAMPUP:

       MOV      A,LAMPCODE

       RR   A            ;向下流动实际就是右移

       MOV      LAMPCODE,A

       MOV      P1,A

       LCALL    D500MS

LAMPRET:    

       RET

END

以上程序功能很简单,但它演示了一个键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按键反应迟钝,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家可以仔细考虑一下这些问题,再想想有什么好的解决办法。

2、采用中断方式:如图4所示。各个按键都接到一个与非上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。

[ ] [告诉好友] [发表评论] [打 印]
上篇文章:简历模板一(供应届毕业生参考) 
下篇文章:80端口的入侵
相关文章
· 矩阵式键盘接口技术及编程
相关软件
特别声明
本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
关于本站 - 下载声明 - 下载帮助 - 广告联系 - 友情连接 - 用户注册
辽ICP备05000878号--丹东市铁通公司提供网络带宽--
个人建站站长邮箱:dd1314666@163.com
Copyright 2005-2008 521n.comAll Rights Reserved
广告咨询QQ8301848有事请留言QQ:1143898512有事Q我