松翰单片机之按键处理《一》

[复制链接]
查看12113 | 回复10 | 2010-1-9 13:19:43 | 显示全部楼层 |阅读模式
单片机应用中,按键是经常要用到的,而按键的种类也是多样的。所以对于不同的按键,处理方法也是不一样的。下面我就介绍下,在按键
处理中常遇到的几种按键处理方法。不足的地方,望大家多指点。
1.单按键处理
   单按键是按键处理中最简单的但也是用的最广的。是指按键按下去后松开对应的功能将被执行,处理时一定要注意消抖,在这里我就不介绍消
抖处理了,我会专门介绍消抖程序是专门处理的。而且是在按键弹起才有效。有很多人在处理单按键时在按键没有弹起就对按键处理了这样是不好
的。
2.连击处理
   连击指的是当确认某个按键按下后,如果操作者还没有释放按键,则对应的功能将反复执行。连击在很多地方时不允许的,因为它会是操作者很
难把握,容易造成错误操作。解决连击问题就需要对每次按键执行一次功能处理。
  利用多次检测的方法可以有效处理连击问题,当检测一个按键确实按下后,可以直接清除按键按下标志,而且要等到按键状态变化时再进行下次按键
的检测,这样就可以有效的避免连击的发生。
  在某些设备中,连击又是比较实用的,可以大大简化流程的操作。在一些智能仪器中,未设置0-9的数字键,这是就需要加减来调整参数。当调整的
参数比较大时,就需要多次按键来完成处理,如果允许连击,则需要连续按住调整键,直到调整到目标参数后再放手,就给操作者带来很多方便。
  允许连击可以用时间计数法来实现,在多次检测程序中,假定检测时间为80ms,如果确定有键按下,则执行第一次处理;若检测到键依然按下,则继续
计时,当计时时间达到500ms,判为连击,第二次处理改建;如果键仍为按下,则每100ms重复处理一次,直到按键状态发生变化,开始新的按键检测。
3.长安处理
   长按是指当按键按下去时,如果再持续一段时间,则会执行其他的功能。列如电话中的清除键,如果短按下,则功能为删去一位号码;而长按的功能是
全部删去。这就要求按键处理程序对长按短按有不同的响应。
   长按的处理方法与连击的处理方法相似,当按键第一次按下确认后,如果按键没有弹起,则继续计时,直到长按时间到,清除短按的标志,置长按标志,
或赋予不同的键值。
下面两种按键处理下次再介绍,有点累了
4.串键处理
5,三角按键问题
海涯普照 | 2010-1-18 10:11:09 | 显示全部楼层
版主,辛苦了。。
andychencc | 2010-3-23 10:57:48 | 显示全部楼层
感谢感谢!
kodec2104 | 2010-7-20 14:30:38 | 显示全部楼层
感谢,楼主辛苦了
fjsmfj | 2010-8-9 15:10:38 | 显示全部楼层
谢谢,学习了。。.
S33 | 2010-8-13 20:45:38 | 显示全部楼层
辛苦楼主,给个程序例子就更好了。
lsmfr | 2010-8-14 15:34:43 | 显示全部楼层
我的论坛的资料下载哪里也教程啊,大家可以去看看,学习下
C+C | 2010-8-14 15:56:05 | 显示全部楼层
松翰单片机之按键处理 软件部分



;;****************************************
;;长短按键处理,及LED灯与按键复用,处理程序
;;按键处理
;;描述:5个按键,开关(f_key_on),时间加(f_key_up)
;;        时间减(f_key_down),水果键(f_key_friut)
;;        熟菜键(f_key_vag)
;;input:        
;;output:
;;               
;;****************************************
;;
        

key_pro:
        bts1        f_key_scan                ;;10ms扫描一次
        jmp        key_pro90
        bclr        f_key_scan
;;---------------------------------------
        mov        a,p1
        mov        b_save_p1,a                ;;保存p10的值
        mov        a,p5
        mov        b_save_p5,a                ;;保存p5的值

        bclr        com1
        bclr        com2
        bclr        com3
        bclr        com4
        bset        com5
        
        bclr        seg1
        bclr        seg2
        bclr        seg3
        bclr        seg4
        bclr        seg5
        bclr        seg6
        bclr        seg7
        


        
        
        bset        fp00
        mov        a,#11111110b                ;;p10输入上拉
        mov        p1m,a
        mov        a,#0efh
        mov        p1ur,a
        mov        a,#00000000b
        mov        p1,a

        mov        a,#11110000b                ;;p50-p53输入上拉
        mov        p5m,a
        mov        a,#0ffh
        mov        p5ur,a
        mov        a,#0
        mov        p5,a
        
        
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        

;;--------------------------------------
key_cvt:
        mov        a,#0
;;--------------------------------------;;
        bts1        f_key_on                ;;开关
        mov        a,#8
               
;;--------------------------------------
        bts1        f_key_fruit
        mov        a,#2                        ;;水果键
;;--------------------------------------
        bts1        f_key_vag                ;;熟菜键
        mov        a,#3
;;-------------------------------------
        bts1        f_key_up                ;;加
        mov        a,#4
;;-------------------------------------
        bts1        f_key_down                ;;减
        mov        a,#5
;;-------------------------------------
        mov        b_save_var,a
        cmprs        a,#0
        jmp        @f
        clr        b_key_40ms                ;;按键没按或释放
        clr        b_key_2s
        bclr        f_long_key
        bclr        f_up_buzzer
        bts1        f_short_key
        jmp        key_pro80
        bclr        f_short_key
        jmp        mn_key

        
        

        

;;-------------------------------------
@@:
                                                ;;

        incms        b_key_40ms
        nop
        cjb_        b_key_40ms,#4,key_pro80
        clr        b_key_40ms        

        bts0        f_long_key                        ;;
        jmp        @f                                ;;
        bset        f_short_key                        ;;不是长按键
        mov        a,b_save_var
        mov        b_key_var,a
        
        
        
        
               
;;-------------------------------------------------------
@@:
        
        bts0        f_key_on
        jmp        @f

        incms        b_key_2s
        nop
        cjb_        b_key_2s,#50,key_pro80                ;;2s
        clr        b_key_2s               
        bset        f_long_key
        bclr        f_short_key
        
        mov        a,#1
        mov        b_key_var,a
        jmp        mn_key        
        
        
@@:
        incms        b_key_2s                        ;;1s
        nop
        cjb_        b_key_2s,#25,key_pro80
        clr        b_key_2s
        bset        f_long_key
        bclr        f_short_key                        
;;----------------------------------------------------
@@:

        
        bts0        f_key_up                        ;;常加
        jmp        @f
        mov        a,#6
        mov        b_key_var,a
        bts0        f_up_buzzer
        jmp        mn_key                                ;;响一声
        mov        a,#1                                ;;
        mov        b_buzzer_var,a
        bset        f_buzzer_enb
        bset        f_up_buzzer
               
        jmp        mn_key
;;----------------------------------------------
@@:
        bts0        f_key_down                        ;;常减
        jmp        key_pro80
        mov        a,#7
        mov        b_key_var,a        

        bts0        f_up_buzzer
        jmp        mn_key                                ;;响一声
        mov        a,#1                                ;;
        mov        b_buzzer_var,a
        bset        f_buzzer_enb
        bset        f_up_buzzer        
               
        jmp        mn_key
;;---------------------------------------------
key_pro80:
        mov        a,#11110111b                ;;p10 p11 p12 复用,p13输入,p16,p17,p14输出0
        mov        p1m,a
        
        mov        a,b_save_p1
        mov        p1,a
        
        mov        a,b_save_p5
        mov        a,p5

        
;;---------------------------------------
        mov        a,#0ffh
        mov        p5m,a                        ;;p50-p53复用,p54-p57输出0
        mov        a,#0
        mov        p5,a

        
;;----------------------------------------
key_pro90:        
        
        ret
breave | 2010-10-25 15:47:33 | 显示全部楼层
ding  xuexi le
lsmfr | 2010-10-25 22:54:47 | 显示全部楼层
非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则