基于STC89C52汇编指令的旋转编码器驱动2.0

;------------------------------ 中断向量

ORG 0003H   ; INT0 (A端)
LJMP I0SUB

ORG 0013H   ; INT1 (C端)
LJMP I1SUB

;------------------------------ 中断子程序

ORG 0020H

Acom BIT P3.2
Ccom BIT P3.3
; A : INT0 : P3.2
; C : INT1 : P3.3

D0 BIT 20H.0
D1 BIT 20H.1
D2 BIT 20H.2
D3 BIT 20H.3
D4 BIT 20H.4
D5 BIT 20H.5
; 状态储存字节 20H

I0SUB: ; (I0中断号/SUB中断子程序)

    I0CAif10or00T0: ; (I0中断号/CA-if=10or00逻辑/T0排名)
        ACALL delay
        JB Ccom, I0if1T1
        JNB Ccom, I0if0T2
        ; 由 (Ccom = 1 or 0) 分别跳转到 (Acom = 0 or 0) 判断程序

            I0if1T1: ; (I0中断号/if=1逻辑/T1排名)
                JNB Acom, I0save10T3

            I0if0T2: ; (I0中断号/if=0逻辑/T2排名)
                JNB Acom, I0while10T4
            
        ;-----------------------------------------------------------------
         ; 并列 if条件判断

        I0save10T3: ; (I0中断号/save10逻辑/T3排名)
            CLR D0
            SETB D1
            AJMP I0while11T7
            ; 储存 D1,0 = 10 / 跳转到 Y线程I0while11T7

        ;-----------------------------------------------------------------
        ; 由此分为两条独立分支程序


    ; 分支X 开始
    ;------------------------------------------------------

    I0while10T4: ; (I0中断号/while=10逻辑/T4排名)
        ACALL delay
        JB Acom, I0while10T4
        JNB Ccom, I0while10T4
        ; while (CA = 10) 则向下执行

    I0save10T5: ; (I0中断号/save10逻辑/T5排名)
        CLR D4
        SETB D5
        ; 储存 D5,4 = 10

    I0while11T6: ; (I0中断号/while=11逻辑/T6排名)
    ACALL delay
        JNB Acom, I0while11T6
        JNB Ccom, I0while11T6
        SJMP I0EXT
        ; while (CA = 11) 则向下执行 / 跳转到 I0中断子程序出口
    
    ;------------------------------------------------------
    ; 分支X 结束


    ; 分支Y 开始
    ;------------------------------------------------------

    I0while11T7: ; (I0中断号/while=11逻辑/T7排名)
        ACALL delay
        JNB Acom, I0while11T7
        JNB Ccom, I0while11T7
        SJMP I0EXT
        ; while (CA = 11) 则向下执行 / 跳转到 I0中断子程序出口

    ;------------------------------------------------------
    ; 分支Y 结束


    I0EXT:
        RETI
        ; 返回断点处



I1SUB: ; (I1中断号/SUB中断子程序)

    I1CAif01or00T0: ; (I1中断号/CA-if=01or00逻辑/T0排名)
        ACALL delay
        JB Acom, I1if1T1
        JNB Acom, I1if0T2
        ; 由 (Acom = 1 or 0) 分别跳转到 (Ccom = 0 or 0) 判断程序

            I1if1T1: ; (I1中断号/if=1逻辑/T1排名)
                JNB Ccom, I1save01T3

            I1if0T2: ; (I1中断号/if=0逻辑/T2排名)
                JNB Ccom, I1save00T4
                ; 由 (Ccom = 0 or 0) 分别跳转到 (save 01 or 00) 储存程序
    ;-----------------------------------------------------------------
    ; 并列 if条件判断

        I1save01T3: ; (I1中断号/save01逻辑/T3排名)
            SETB D0
            CLR  D1
            AJMP I1while00T7
            ; 储存 D1,0 = 01

        I1save00T4: ; (I1中断号/save00逻辑/T4排名)
            CLR D2
            CLR D3
            AJMP I1while01T5
            ; 储存 D3,2 = 00 / 跳转到 I1while01T5
    ;-----------------------------------------------------------
    ; 由此分为两条独立分支程序


    ; 分支X 开始
    ;------------------------------------------------------

    I1while01T5: ; (I1中断号/while=01逻辑/T5排名)
        ACALL delay
        JNB Acom, I1while01T5
        JB  Ccom, I1while01T5
        ; while (CA = 01) 则向下执行

    I1save01T6: ; (I1中断号/save01逻辑/T6排名)
        SETB D4
        CLR  D5
        AJMP I1EXT
        ; 储存 D5,4 = 01 / 跳转到 I1中断子程序出口

    ;------------------------------------------------------
    ; 分支X 结束



    ; 分支Y 开始
    ;------------------------------------------------------

    I1while00T7: ; (I1中断号/while=00逻辑/T7排名)
        ACALL delay
        JB Acom, I1while00T7
        JB Ccom, I1while00T7
        ; while (AC = 00) 则向下执行

    I1save00T8: ; (I1中断号/save00逻辑/T8排名)
        CLR D2
        CLR D3
        AJMP I1EXT
        ; 储存 D3,2 = 00 / 跳转到 I1中断子程序出口
    
    ;------------------------------------------------------
    ; 分支Y 结束

    I1EXT:
        RETI
        ; 返回断点处


;------------------------------ 主程序

ORG 0000H
LJMP main

ORG 0100H
main:

    I0sfc:
        I0sfrIE:
            SETB EA  ; 总中断允许
            SETB EX0 ; I0 中断允许

        I0sfrTCON:
            SETB IT0 ; I0 下降沿触发

        I0sfrIP:
            CLR PX0 ; I0 低优先级

        ; INT0 特殊功能寄存器  8B 4MC

    
    I1sfc:
        I1sfrIE:
            SETB EX1 ; I1 中断允许

        I1sfrTCON:
            SETB IT1 ; I1 下降沿触发

        I1sfrIP:
            SETB PX1 ; I1 高优先级

        ; INT1 特殊功能寄存器  8B 4MC


    start:
        MOV 20H, #0FFH

    lift:
        MOV A, #11100001B
        CJNE A, 20H, right
    LiftOperate:
        CLR P1.1
        SETB P1.0
        MOV 20H, #0FFH

    right:
        MOV A, #11010010B
        CJNE A, 20H, none
    RightOperate:
        SETB P1.1
        CLR P1.0
        MOV 20H, #0FFH

    none:
        SJMP lift


    delay:
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        RET

临时版,还没做完。控制基本没问题了,不会出现跳变或不识别的情况。实际电路需要并连约3nf的滤波电容,实测基本完美。

分支程序的delay可以拿掉,没影响

直接加电容一端被拉低后另一端波形会过冲,然后震荡一段时间,不知道为啥倒是对结果没影响。要完美的在io上再串个小电阻可解

VID_20241224_144116

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值