bokee.net

电子/电气工程师博客

正文 更多文章

简单、友好的按键处理程序设计

                                                    简单、友好的按键处理程序设计

 

                                                               王佰营  徐丽红

                                                         wbymcs51.blog.bokee.net

       在嵌入程序设计中,键处理程序在一定程度上决定着人机对话界面的友好程度。WINDOWS是公认的界面友好的典范,我们就借鉴WINDOWS的键处理的思想:

1.       当击键时WINDOWS立即作出响应;

2.       当按住键不放时,WINDOWS延迟一定时间来判断是否为连键;其间不作响应;

3.       当认为是连键时,会间隔一定时间重复作出响应;

(可以打开记事本,敲个‘h’键试验:瞬时敲击,即可出现‘h’,再按着键不放,无‘h’出现,当延迟一定时间‘h’,就以较快速度出现;)

在C8051F020和DSP编程中运用上述的思想所编的键处理程序非常简捷、高效和友好,以下为该程序的流程图:

 

根据该流程的51系列单片机程序和DSP程序:

1、C8051F020单片机程序如下:

;=================================================================
;  function: key_filter   ;键盘去抖程序--徐丽红
;  input:  a
;  output:  key.bsure  
;  usage:  a,b  
;=================================================================
key_filter: ;键盘去抖程序
           lcall scan_key
           jz    kf_no             ;a=0?
           jb    bfirst,  kf_1th   ;first down?
           mov   b,  a
           mov   a,  k_dly
           jnz   kf_ret            ;20ms到了吗?
           mov   a,  b             ;20ms到
           cjne  a,  key_tmp,kf_no ;a==k_tmp?
           mov   k_dly,  #10       ;a==k_tmp
           dec   dly_k
           jnb   bfast,  kf_nofast ;是连键吗?
kf_is0:    mov   a,  dly_k         ;是连键
           jnz   kf_ret            ;300ms/160ms?
           mov   dly_k,  #12       ;fast OK!
           sjmp  kf_ftok

kf_nofast:
           mov   a,    dly_k        ;不是连键
           cjne  a,    #24, kf_is0  ;延时了1次吗?
kf_ftok: 
           mov   key,  key_tmp      ;first OK!
           setb  bkey_do
           setb  bfast
kf_ret:    ret

kf_1th:    mov   k_dly,  #10       ;first down
           mov   key_tmp, a
           mov   dly_k,  #25
           clr   bfirst
           clr   bfast
           ret

2、LF2407型DSP程序如下:

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

; function:  judge_key              键值判断

; input:             ---

; output:           ---

; usege:            ACC

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

judge_key: ;键值判断

                  ldp          #PEDATDIR>>7

                  lacl         PEDATDIR

                  cmpl

                  and         #00110110b

 

                  ldp          #DP_B01

                  sacl         key_tmp

 

                  bcnd       k_down,     NEQ       ;CATCH KEY?

                 ldp          #DP_B01

                 splk        #00h,           bknot1

                 ret

k_down:    lacl         bknot1

                 bcnd       not_first,        NEQ       ;first?

 

                 lacl          key_tmp

                 sacl         key_ok

                 splk        #04,               key_clk

                 splk        #50,               key_dly

                 splk        #11h,             bknot1

                 splk        #00h,             bksure

                 splk        #00h,             bcontinue

                 ret

 

not_first:   lacl          key_clk                        ;N times

                bcnd       T_over,         EQ          ;12ms?

                ret

T_over:    lacl          key_ok                         ;12ms

                xor         key_tmp

                bcnd       Is_same,        EQ          ;same key?

                splk        #00h,             bknot1

                ret

Is_same:  splk        #4,                 key_clk

               lacl          bcontinue

               bcnd       Is_fast,           NEQ       ;continue?

OK_key: splk        #11h,             bcontinue

               splk        #11h,             bksure

              ret

Is_fast:   lacl          key_dly                         ;key_dly--

              sub         #01h

              sacl         key_dly

              bcnd       tuch_set,        EQ          ;500/300ms?

              ret

tuch_set: splk        #25,               key_dly

              b            OK_key

     该程序中:防抖时间是12ms;是否为连键延迟时间是500ms,连键重复处理时间是300ms;在实际中,根据具体情况调节时间,达到最佳效果。

     注:以上两个程序中的延时均为非阻塞式延时,没有原地绕圈子式的延时,不会对主程序造成大影响。

 

 

分享到:

上一篇:注意F2407REGS.H文件中的错

下一篇:C8051F020单片机初始化程序

评论 (7条) 发表评论

  • 甘小姐
    甘小姐 : 希望看到更多的单片机程序设计!

    2012-05-21 10:30

  • 请教 (游客) : 谢谢王工

    2011-07-29 12:02

  • wby
    wby : kf_no: ret a=0,说明没有键按下,转到结束;

    2011-07-27 20:37

  • 请教 (游客) (游客) : 想必是没有按键按下的意思?lzyilpp(at)qq.com

    2011-07-26 15:32

  • 请教 (游客) : 老师,你好。我是一名电子类学生,我想问 jz kf_no ;a=0? 这个kf_no在那?能给我完整的51程序吗?

    2011-07-26 15:28

  • wby
    wby : 系统学习马忠梅老师的书,就会了。

    2010-07-26 12:54

  • 赵磊
    赵磊 : 请问,第一个8051的程序如果转换成C语言又当如何写呢!

    2010-07-26 10:02

发表评论
验证码