帮忙解释按键防抖动51汇编程序语句

2020-01-18 18:40发布

各位大侠,
我刚刚从事单片机这一行,需要写按键控制开关功能的汇率程序,但是用的是义隆单片机,在网上找了一个例程,是51单片机的,不能很好的理解,请熟悉51单片机的大侠能否写每一个语句的解释。我想按这个程序搬到义隆的单片机上。先谢过!
网上找的例程如下:
经典按键防抖动51汇编程序
;四独立按键控制四LED;
;四个独立按键对应四个独立的LED;
;当某一个按键按下时对应的LED亮,当第二次按下时灭。
;四个LED只有一个亮,初学者可以参考以下程式:
;当一直按下某一按键时对应的LED会闪动。
;————————————————————————
        K1        BIT        P1.4
        K2        BIT        P1.5
        K3        BIT        P1.6
        K4        BIT        P1.7

        FLAG0         BIT        20H.0        ;LED0标记
        FLAG1        BIT        20H.1        ;LED1标记
        FLAG2        BIT        20H.2        ;LED2标记
        FLAG3        BIT        20H.3        ;LED3标记

        K_OLD        EQU        30H
        K_NEW        EQU        31H
;______________________________________________________________
        ORG        0000H
        JMP        MAIN
        ORG        0030H
;_______________________________________________________________
MAIN:
        MOV         SP,#60H
        MOV         P1,#0FFH
        MOV         P0,#0FFH
        MOV        K_OLD,#00H
        MOV        20H,#0FFH
MAIN1:
        CALL        K_SCAN                ;键扫描
        MOV        A,K_NEW
        CJNE        A,K_OLD,        MAIN2
        JMP        MAIN1
MAIN2:
        CALL        DELAY                ;延时除去抖动
        CALL        K_SCAN                ;再判断键是否按下
        MOV        A,K_NEW
        CJNE        A,K_OLD,MAIN3
        JMP        MAIN1
MAIN3:
        JB         ACC.0,LOOP1                ;K1按下
        JB         ACC.1,LOOP2                ;K2按下
        JB         ACC.2,LOOP3                ;K3按下
        JB         ACC.3,LOOP4                ;K4按下
        JMP        MAIN1
LOOP1:
        JNB        FLAG0,LOOP1A
        MOV        P0,#0FEH
        MOV        20H,#0EH        ;FLAG0=0
        JMP        MAIN1
LOOP1A:
        MOV        P0,#0FFH
        MOV        20H,#0FH       
        JMP        MAIN1       
LOOP2:
        JNB         FLAG1,LOOP1A
        MOV         P0,#0FDH
        MOV        20H,#0DH        ;FLAG1=0
        JMP        MAIN1
LOOP2A:
        MOV        P0,#0FFH
        MOV        20H,#0FH
        JMP        MAIN1
LOOP3:
        JNB         FLAG2,LOOP3A
        MOV        P0,#0FBH
        MOV         20H,#0BH        ;FLAG2=0
        JMP        MAIN1
LOOP3A:
        MOV        P0,#0FFH
        MOV        20H,#0FH
        JMP        MAIN1
LOOP4:
        JNB         FLAG3,LOOP4A
        MOV        P0,#0F7H
        MOV         20H,#07H        ;FLAG3=0
        JMP        MAIN1
LOOP4A:
        MOV        P0,#0FFH
        MOV        20H,#0FH
        JMP        MAIN1
;_______________________________________________________________
;键扫描子程序
;———————————————————————————
K_SCAN:
        MOV        P1,#0FFH
        MOV        K_NEW,#00H
        MOV        A,#00H
        MOV        C,K4
        CPL        C
        RLC        A
        MOV        C,K3
        CPL        C
        RLC        A
        MOV        C,K2
        CPL        C
        RLC        A
        MOV        C,K1
        CPL        C
        RLC        A
        MOV        K_NEW,A
        RET
;__________________________________
;延时子程序
;——————————————————————————
DELAY:
        MOV        R6,#200
DEL:
        MOV        R7,#0FFH
        DJNZ        R7,$
        DJNZ        R6,DEL
        RET       
;_______________________________________________________
;可以将 K_SCAN 子程序更改为:
/*
K_SCAN:
        MOV        P1,#0FFH
        MOV         K_NEW,#00H
        MOV        A,P1
        CPL        A
        ANL        A,#0F0H
        SWAP        A
        MOV        K_NEW,A       
        RET
*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
taishandadi
1楼-- · 2020-01-18 23:27
每一天指令都简单,重要的是你要理解程序的思路。不知道你对51的汇编指令熟悉不?
xxbwang
2楼-- · 2020-01-19 04:16
我感觉用C比较方便吧   汇编的舞台不在51单片机上
grom
3楼-- · 2020-01-19 04:43
回复【1楼】taishandadi  
-----------------------------------------------------------------------
对51的只能是了解吧,要是都熟悉的话,就不用在此请教了。想总体的看一下这个程序 的功能和相关语句的作用。是其他单片机上要用
风雨无阻88
4楼-- · 2020-01-19 07:21
 精彩回答 2  元偷偷看……
jxchen
5楼-- · 2020-01-19 09:13
本帖最后由 jxchen 于 2016-4-3 22:15 编辑


;===============================================================


;我剛剛從事單片機這一行,需要寫按鍵控制開關功能的匯率程式,但是用的是義隆單片機,在網上找了一個例程,是51單片機的,不能很好的理解,請熟悉51單片機的大俠能否寫每一個語句的解釋。我想按這個程式搬到義隆的單片機上。先謝過!
;網上找的例程如下:
;經典按鍵防抖動51彙編程式
;;四獨立按鍵控制四LED;
;;四個獨立按鍵對應四個獨立的LED;
;;當某一個按鍵按下時對應的LED亮,當第二次按下時滅。
;;四個LED只有一個亮,初學者可以參考以下程式:
;;當一直按下某一按鍵時對應的LED會閃動。
;;————————————————————————
        K1        BIT        P1.4
        K2        BIT        P1.5
        K3        BIT        P1.6
        K4        BIT        P1.7

        FLAG         DATA       20H
        FLAG0        BIT        20H.0        ;LED0標記
        FLAG1        BIT        20H.1        ;LED1標記
        FLAG2        BIT        20H.2        ;LED2標記
        FLAG3        BIT        20H.3        ;LED3標記

        ORG       00H
        JMP       MAIN
        ORG       030H
;_______________________________________________________________
MAIN:
        CLR       EA
        MOV       R0,#7FH             ;清除內部記憶體
CLRRAM: MOV       @R0,#0
        DJNZ      R0,CLRRAM

        MOV       SP,#5FH             ;設定堆疊
        MOV       P0,#0FFH
        MOV       P1,#0FFH        
        MOV       P2,#0FFH        
        MOV       P3,#0FFH        
        MOV       FLAG,#0H
MAIN1:
        JNB       K1,_KEY1
        JNB       K2,_KEY2
        JNB       K3,_KEY3
        JNB       K4,_KEY4
        JMP       MAIN1
;-------------------------------------------------------------
_KEY1:
        CALL      DELAY                 ;延時除去抖動
        JB        K1,MAIN1              ;再判斷鍵是否按下
        JB        FLAG0,L0023A          ;檢查是否第一次按下
        SETB      FLAG0
        MOV       P0,#0FFH              ;LED ALL OFF
        MOV       P0,#0FEH              ;LED1 ON
        JMP       MAIN1
L0023A:
        CLR       FLAG0
        MOV       P0,#0FFH              ;LED1 OFF
        JMP       MAIN1
;;-------------------------------------------------------------
_KEY2:
        CALL      DELAY                 ;延時除去抖動
        JB        K1,MAIN1              ;再判斷鍵是否按下
        JB        FLAG1,L0023B          ;檢查是否第一次按下
        SETB      FLAG1
        MOV       P0,#0FFH              ;LED ALL OFF
        MOV       P0,#0FDH              ;LED2 ON
        JMP       MAIN1
L0023B:
        CLR       FLAG1
        MOV       P0,#0FFH              ;LED2 OFF
        JMP       MAIN1
;-------------------------------------------------------------
_KEY3:
        CALL      DELAY                 ;延時除去抖動
        JB        K1,MAIN1              ;再判斷鍵是否按下
        JB        FLAG2,L0023C          ;檢查是否第一次按下
        SETB      FLAG2
        MOV       P0,#0FFH              ;LED ALL OFF
        MOV       P0,#0FCH              ;LED3 ON
        JMP       MAIN1
L0023C:
        CLR       FLAG2
        MOV       P0,#0FFH              ;LED3 OFF
        JMP       MAIN1
;-------------------------------------------------------------
_KEY4:
        CALL      DELAY                 ;延時除去抖動
        JB        K1,MAIN1              ;再判斷鍵是否按下
        JB        FLAG3,L0023D          ;檢查是否第一次按下
        SETB      FLAG3
        MOV       P0,#0FFH              ;LED ALL OFF
        MOV       P0,#0FBH              ;LED4 ON
        JMP       MAIN1
L0023D:
        CLR       FLAG3
        MOV       P0,#0FFH              ;LED4 OFF
        JMP       MAIN1

DELAY:
        MOV       R5,#1
        MOV       R6,#40
LL:
        MOV       R7,#249
LABEL1:
        DJNZ      R7,LABEL1
        DJNZ      R6,LL
        DJNZ      R5,DELAY
        RET
        END

jxchen
6楼-- · 2020-01-19 09:49
請參考上述程式碼

一周热门 更多>