MOV A,R3
CLR A
SUBB A,R2
MOV R2,A
L_AutoZero_1:
CLR C ;Calculate [R2 R3] - #20,if(k >= 20)
MOV A,R3
SUBB A,#20
MOV A,R2
SUBB A,#00H
JC L_AutoZero_2 ;[R2 R3] ,20, Jump
MOV A,#LOW (TouchZeroCnt) ; If the change is large, clear the counter TouchZeroCnt[i] = 0;
ADD A,R5
MOV R0,A
MOV @R0,#0
JNB F0,L_AutoZero_3
MOV A,R5
ADD A,ACC
ADD A,#LOW (TouchZero)
MOV R0,A
MOV @R0,6
INC R0
MOV @R0,7
SJMP L_AutoZero_3
L_AutoZero_2: ; If the change is relatively small, then creep, track 0-point automatically
; Continuously detect small changes 20 times/4 = 5 seconds.
MOV A,#LOW (TouchZeroCnt)
ADD A,R5
MOV R0,A
INC @R0
MOV A,@R0
CLR C
SUBB A,#20
JC L_AutoZero_3 ;if(TouchZeroCnt[i] < 20), jump
MOV @R0,#0 ;TouchZeroCnt[i]= 0;
MOV A,R5 ; Use slowly changing values as 0 points
ADD A,ACC
ADD A,#LOW (adc_prev)
MOV R0,A
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
MOV A,R5
ADD A,ACC
ADD A,#LOW (TouchZero)
MOV R0,A
MOV @R0,2
INC R0
MOV @R0,3
L_AutoZero_3: ; Save the sampled value adc_prev[i] = j;
MOV A,R5
ADD A,ACC
ADD A,#LOW (adc_prev)
MOV R0,A
MOV @R0,6
INC R0