松翰单片机之按键处理《二》软件部分

[复制链接]
查看5914 | 回复7 | 2010-1-15 17:32:55 | 显示全部楼层 |阅读模式
;;****************************************
;;长短按键处理,及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
S33 | 2010-8-13 20:48:01 | 显示全部楼层
好东西,学习中。。。
海涯普照 | 2010-1-18 10:15:23 | 显示全部楼层
谢谢,版主分享,辛苦了。
jayrong | 2010-4-9 12:46:25 | 显示全部楼层
现在还看不懂。呵呵。。。先学习了。
lanshuiwang | 2010-4-9 16:58:57 | 显示全部楼层
谢谢楼主!
lin135 | 2010-4-17 11:36:07 | 显示全部楼层
发现楼主的软件编写和我的很相似。不知道是不是同出一师门,呵呵
发我的出来对照下,用到了些自己编写的宏指令,你们可能看不懂,可流程是一样的


;;==============================================;;
;;                 按键扫描程序   
;;==============================================;;
.data
        key_scan_code         ds   1            ;;扫描时代码寄存器
        key_pop_tim           ds   1            ;;松开时间寄存器
        key_push_tim          ds   1            ;;按下时间寄存器

        f_key                 ds   1
        f_key_pop_ok          equ  f_key.0
        f_key_push_short_ok1  equ  f_key.1      ;;短按成功标志1,长按检测用到
        f_key_push_short_ok   equ  f_key.2
        f_key_push_long_ok    equ  f_key.3

.const
        pop_ok_tim            equ  17  ;;70ms   ;;按键松开成功时间     ,一般为100ms,70ms较好
        push_short_ok_tim     equ  17  ;;70ms   ;;按键短按下成功时间   ,一般为100ms,70ms较好
        push_long_ok_tim      equ  250 ;;1s     ;;按键长按按键成功时间 ,一般按下1S后为长按成功
        push_long_again_tim   equ  225 ;;900ms  ;;长按重复一次成功时间 ,一般长按成功后100ms为一次

;;----------------------------------------------;;
.code
key_scan:

        mov     a,#0
/*
        b0bts1  io_key_1                        ;;根据按键所接的硬件
        mov     a,#1                            ;;这里灵活改变,

        b0bts1  io_key_2
        mov     a,#2               

        b0bts1  io_key_3
        mov     a,#3               

        b0bts1  io_key_4
        mov     a,#4               
*/
        mov     key_scan_code,a                 ;;看按键代码是否为0
        cmprs   a,#0                            ;;为0时没有按键按下
        jmp     key_push_tim_process
;;----------------------------------------------;;
key_pop_tim_process:                            ;;松开防抖动
        into    key_pop_tim,#pop_ok_tim
        ret                                     ;;
        clr     key_push_tim                    ;;清按键按下时间计数器
        clr     key_pop_tim                     ;;清按键松开时间计数器
        bclr    f_key_push_short_ok1            ;;置UP_KEY_DOW_OK标志
        bset    f_key_pop_ok
        ret
;;----------------------------------------------;;
key_push_tim_process:                           ;;按下防抖动
        bts1    f_key_push_short_ok1            ;;是否有短按成功标志
        jmp     key_push_short
key_push_long:
        into    key_push_tim,#push_long_ok_tim
        ret                                     ;;push_long_again_tim=push_long_ok_tim-100ms                              
        mov8    key_push_tim,#push_long_again_tim;;again:重做一次,长按重复
        clr     key_pop_tim                     ;;清按键松开时间计数器
        bset    f_key_push_long_ok
        ret
key_push_short:
        into    key_push_tim,#push_short_ok_tim
        ret                                     ;;                  
        bset    f_key_push_short_ok             ;;置短按成功标志,按键处理用
        bset    f_key_push_short_ok1            ;;置另一个短按成功标志,长按检测用
        clr     key_pop_tim                     ;;清按键松开时间计数器
        mov8    key_scan_ok_code,key_scan_code                                
        
        ret
;;----------------------------------------------;;
ritammkk | 2010-5-20 21:53:11 | 显示全部楼层
顶下啦,哈哈,顶
fjsmfj | 2010-8-9 15:12:54 | 显示全部楼层
顶,,,,,,,,,顶,,,,,,,,,,,,,,,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则