帮忙解释按键防抖动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
*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。