;------------------------------ 中断向量
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