ORG 0000H
MOV SP, #7FH
main:
MOV SPsum, #100
MOV SPLvDE, #8
LCALL Sampling
MOV P1, SPcorrectStatus
SJMP main
;------------------------------------------------------ 子程序文档
; Sampling (采样总数, 消抖等级) / return - 正确的状态
; 执行周期 = 89+(2[采样总数+1])+(4[采样总数-1])+A+B
; A --- 预期在计数中占多数的状态
; 1,0 = 7*(采样总数-1)
; 0,1 = 10*(采样总数-1)
; 0,0 = 13*(采样总数-1)
; 1,1 = 16*(采样总数-1)
; B --- 预期超过阈值的状态
; 1,0 = 62
; 0,1 = 114
; 0,0 = 170
; 1,1 = 226
;------------------------------------------------------ 内部变量声明
SPsum DATA 30H ; 采样总数 ---- input
SPLvDE DATA 31H ; 消抖等级 ---- input
SPcorrectStatus DATA 32H ; 正确的状态 --- return
;------------------------------------------------------ Sampling-子程序
Sampling: ; (单段连续采样+消抖等级设定) [缩写SP]
;------------------------------------------------------ 现场保护 PUSH
SPpush:
PUSH ACC
PUSH PSW
PUSH 20H
PUSH 21H
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
;------------------------------------------------------ 内部工作寄存器设定
; input
; 20H -- 采样总数
; 21H -- 消抖等级
SPsetRn:
MOV A , #00H ; 清零
MOV PSW, #00H
MOV 20H, SPsum ; 传入
MOV 21H, SPLvDE
INC 20H ; 修正
;------------------------------------------------------ 子程序开始 [从中断到此处需34MC]
SPuseRnT0:
MOV R0, 20H
SPwhileT1:
DJNZ R0, SPsamplingT2 ; 采样次数--
LJMP SPuseRnT7
SPsamplingT2: ; 采集状态
MOV C, P3.2
MOV ACC.0, C
MOV C, P3.3
MOV ACC.1, C
SPifT3:
CJNE A, #00000010B, SPifT4
INC R1
LJMP SPwhileT1
SPifT4:
CJNE A, #00000001B, SPifT5
INC R2
LJMP SPwhileT1
SPifT5:
CJNE A, #00000000B, SPifT6
INC R3
LJMP SPwhileT1
SPifT6:
CJNE A, #00000011B, SPwhileT1
INC R4
LJMP SPwhileT1
SPuseRnT7:
MOV R0, 20H
MOV R5, 21H
SPthresholdT8: ; 阈值
MOV A, R0
MOV B, #10
DIV AB
MOV B, R5
MUL AB
MOV R6, A
SPcompareT9:
MOV DEvalueB, R6
SPifT10: ; 返回 10
MOV DEvalueA, R1
LCALL decide
MOV R0, DEdecideResult
CJNE R0, #2, SPifT11
MOV R5, #00000010B
LJMP SPreturn
SPifT11: ; 返回 01
MOV DEvalueA, R2
LCALL decide
MOV R0, DEdecideResult
CJNE R0, #2, SPifT12
MOV R5, #00000001B
LJMP SPreturn
SPifT12: ; 返回 00
MOV DEvalueA, R3
LCALL decide
MOV R0, DEdecideResult
CJNE R0, #2, SPifT13
MOV R5, #00000000B
LJMP SPreturn
SPifT13: ; 返回 11
MOV DEvalueA, R4
LCALL decide
MOV R0, DEdecideResult
CJNE R0, #2, SPreturn
MOV R5, #00000011B
LJMP SPreturn
;------------------------------------------------------ return
SPreturn:
MOV SPcorrectStatus, R5
;------------------------------------------------------ 现场保护 POP
SPpop:
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
POP 21H
POP 20H
POP PSW
POP ACC
;------------------------------------------------------ RET
SamplingRET:
RET
;------------------------------------------------------ 子程序文档
; decide (比较数 A,比较数 B) / return - 判断返回值(大于=2/等于=1/小于=0)
; 返回 大于or等于 [52MC]
; 返回 小于 [50MC]
;------------------------------------------------------ 内部变量声明
DEvalueA DATA 33H ; 判断数 A ---- input
DEvalueB DATA 34H ; 判断数 B ---- input
DEdecideResult DATA 35H ; 判断返回值 ---- return
;------------------------------------------------------ 大小于比较-子程序
decide: ; (大小于比较) [缩写DE]
;------------------------------------------------------ 现场保护 PUSH
DEpush:
PUSH ACC
PUSH PSW
PUSH 20H
PUSH 21H
PUSH 00H
PUSH 01H
;------------------------------------------------------ 内部工作寄存器设定
; input
; R2 -- 判断数 A
; R3 -- 判断数 B
DERnSET:
MOV A , #00H ; 清零
MOV PSW, #00H
MOV 20H, DEvalueA ; 传入
MOV 21H, DEvalueB
;------------------------------------------------------ 子程序 开始
DEuseRnT0:
MOV R0, 20H
MOV R1, 21H
DEifT1:
MOV A, R0
SUBB A, R1
JC DEsmallT2
JNC DEifT3
DEsmallT2: ; 判定 A < B
MOV R0, #0
LJMP DEreturn
DEifT3:
JZ DEequalT4
JNZ DEbigT5
DEequalT4: ; A = B
MOV R0, #1
LJMP DEreturn
DEbigT5: ; A > B
MOV R0, #2
LJMP DEreturn
;------------------------------------------------------ return
DEreturn:
MOV DEdecideResult, R0
;------------------------------------------------------ 现场保护 POP
DEPOP:
POP 01H
POP 00H
POP 21H
POP 20H
POP PSW
POP ACC
;------------------------------------------------------ RET
decideRET:
RET
END