234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> 基础教程 >> 浏览文章

    25课:单片机键盘接口程序设计

    作者:佚名   来源:本站原创   点击数:x  更新时间:2007年08月14日   【字体:

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

    按钮开关的一抖动问题

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

    <键盘结构图>

    图1

    图2

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

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

    键盘与单片机的一连接


    <键盘连接>

    图3


    <单片机与键盘接口图>

    图4

    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 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所示 。各个按钮都接到一个与非上    ,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的一中断,它的一好处是不 用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的一处理

    发表评论】【告诉好友】【收藏此文】【关闭窗口

    文章评论