C_RX_PORT EQU
C_RX_PIN EQU
C_HEAD_NUM EQU 4
C_DU_HEAD_CHECK EQU 0001B
C_DU_LOW_LEVEL_FILTER EQU 1000B
C_DU_CLEAR_LOW_LEVEL_FILTER EQU 0111B
C_RX_HEAD1_HIGH_NUM EQU 1
C_RX_HEAD_TIMER0 EQU 15
C_RX_HEAD_TIMER1 EQU 15 ;ERROR>=31.35*15^2=8000US=8MS
C_RX_HEAD_TIMER2 EQU 0
C_RX_HEAD_TIMER3 EQU 2 ;2*500=1MS
C_RX_HEAD_TIMER4 EQU 0
C_RX_HEAD_TIMER5 EQU 4 ;4*500=2MS
C_RX_DATA_TIMER0 EQU 7
C_RX_DATA_TIMER1 EQU 0 ;ERROR<=7*31.25=220US
C_RX_DATA_TIMER2 EQU 0
C_RX_DATA_TIMER3 EQU 4 ;ERROR>=4*500=2MS
C_RX_DATA_TIMER4 EQU 0
C_RX_DATA_TIMER5 EQU 2 ;1_0 //1>=1000uS
MACRO_RECEIVER MACRO
RECEIVER:
LDPCH RECEIVER
LDMAH #0
LD A,(R_IR_TX_RX);//BIT3=1收到码后,等待处理再收下一组码
AND A,#1000B
JNZ EXIT_RECEIVER
CLR C
INC (M0_RX_TIMER0);0~500US
ADR (M0_RX_TIMER1);500US~8000US(8MS)
LD A,(M0_RX_INDEX)
AND A,#C_DU_LOW_LEVEL_FILTER
JNZ LOW_LEVEL_FILTER ;1
LD A,(M0_RX_INDEX)
AND A,#C_DU_HEAD_CHECK
JNZ CHECK_DATA ;1
JMP CHECK_HEAD ;0
LOW_LEVEL_FILTER:
LD A,(C_RX_PORT)
AND A,#C_RX_PIN
JZ CLEAR_RECEIVER_TIMER_AND_EXIT
LD A,(M0_RX_INDEX)
AND A,#C_DU_CLEAR_LOW_LEVEL_FILTER
LD (M0_RX_INDEX),A
JMP CLEAR_RECEIVER_TIMER_AND_EXIT
CHECK_HEAD:
LD A,(C_RX_PORT)
AND A,#C_RX_PIN
JZ RX_HEAD1_LEVEL_HOP ;JZ EXIT:CHECK HIGH _ JNZ EXIT :CHECK LOW
CLR C
LD A,(M0_RX_TIMER0)
SBC A,#C_RX_HEAD_TIMER0 ;OVERFLOW CHECK
LD A,(M0_RX_TIMER1)
SBC A,#C_RX_HEAD_TIMER1
JNC RECEIVER_IS_ERROR
JMP RECEIVER_EXIT
RX_HEAD1_LEVEL_HOP:
CLR C
LD A,(M0_RX_TIMER0)
SBC A,#C_RX_HEAD_TIMER2
LD A,(M0_RX_TIMER1)
SBC A,#C_RX_HEAD_TIMER3
JC RECEIVER_IS_ERROR ;<JUMP
CLR C
LD A,(M0_RX_TIMER0)
SBC A,#C_RX_HEAD_TIMER4
LD A,(M0_RX_TIMER1)
SBC A,#C_RX_HEAD_TIMER5
JNC RECEIVER_IS_ERROR ;>JUMP
;HEAD RIGHT
LD A,(M0_RX_INDEX)
OR A,#C_DU_LOW_LEVEL_FILTER ;HEAD AVOID LOW LEVEL
LD (M0_RX_INDEX),A
INC (M2_HEAD_NUM_CNT)
LD A,(M2_HEAD_NUM_CNT)
CMP A,#C_HEAD_NUM
JNZ CLEAR_RECEIVER_TIMER_AND_EXIT
;HEAD NUM RIGHT
LD A,(M0_RX_INDEX)
OR A,#C_DU_HEAD_CHECK
LD (M0_RX_INDEX),A
JMP CLEAR_RECEIVER_TIMER_AND_EXIT
CHECK_DATA:
LD A,(C_RX_PORT)
AND A,#C_RX_PIN
JZ DATA_PROCESS
JMP EXIT_RECEIVER
DATA_PROCESS:
CLR C
LD A,(M0_RX_TIMER0)
SBC A,#C_RX_DATA_TIMER0
LD A,(M0_RX_TIMER1)
SBC A,#C_RX_DATA_TIMER1
JC CHECK_DATA_ORDER ;<JUMP
CLR C
LD A,(M0_RX_TIMER0)
SBC A,#C_RX_DATA_TIMER2
LD A,(M0_RX_TIMER1)
SBC A,#C_RX_DATA_TIMER3
JNC CHECK_DATA_ORDER ;>JUMP
;DATA IS RIGHT
CLR C
INC (5FUC_CNT_DATA0)
ADR (5FUC_CNT_DATA1)
LD A,(M0_RX_INDEX)
OR A,#C_DU_LOW_LEVEL_FILTER ;HEAD AVOID LOW LEVEL
LD (M0_RX_INDEX),A
JMP CLEAR_RECEIVER_TIMER_AND_EXIT
CHECK_DATA_ORDER:
LD A,(5FUC_CNT_DATA1)
JZ FORWARD
CMP A,#0001B
JZ CHECK_F_LEFT_AND_MORPH
CMP A,#0010B
JZ CHECK_BACK_FRIGHT_BRIGHT
CMP A,#0011B
JZ CHECK_LEFT_BLEFT
CMP A,#1000B
JZ RIGHT
JMP RECEIVER_IS_ERROR
CHECK_F_LEFT_AND_MORPH:
LD A,(5FUC_CNT_DATA0)
CMP A,#0110B
JZ MORPH
CMP A,#1100B
JZ FORWAR_LEFT
JMP RECEIVER_IS_ERROR
CHECK_BACK_FRIGHT_BRIGHT:
LD A,(5FUC_CNT_DATA0)
CMP A,#0010B
JZ FORWAR_RIGHT
CMP A,#1000B
JZ BACK
CMP A,#1110B
JZ BACK_RIGHT
JMP RECEIVER_IS_ERROR
CHECK_LEFT_BLEFT:
LD A,(5FUC_CNT_DATA0)
CMP A,#0100B
JZ BACK_LEFT
CMP A,#1010B
JZ LEFT
JMP RECEIVER_IS_ERROR
FORWARD:
LD A,#0010B
JMP GET_A_DIRECTION_ORDER
BACK:
LD A,#0001B
JMP GET_A_DIRECTION_ORDER
LEFT:
LD A,#0100B
JMP GET_A_DIRECTION_ORDER
RIGHT:
LD A,#1000B
JMP GET_A_DIRECTION_ORDER
FORWAR_LEFT:
LD A,#0110B
JMP GET_A_DIRECTION_ORDER
FORWAR_RIGHT:
LD A,#1010B
JMP GET_A_DIRECTION_ORDER
BACK_LEFT:
LD A,#0101B
JMP GET_A_DIRECTION_ORDER
BACK_RIGHT:
LD A,#1001B
JMP GET_A_DIRECTION_ORDER
MORPH:
;LDMAH #0
LD A,#0010B ;变形
LD (R_RX_DATA0),A
LD A,#0
LD (R_RX_DATA1),A
JMP RECEIVED_SUCCESSFUL
GET_A_DIRECTION_ORDER:
;LDMAH #0
LD (R_RX_DATA1),A
LD A,#0
LD (R_RX_DATA0),A
RECEIVED_SUCCESSFUL:
LD A,(R_IR_TX_RX)
OR A,#1000B ;SUCCESSFUL
LD A,#0
LD (M0_RX_INDEX),A
LD (DU_CNT_DATA0),A
LD (DU_CNT_DATA1),A
LD (M0_HEAD_NUM_CNT),A
JMP CLEAR_RECEIVER_TIMER_AND_EXIT
RECEIVER_IS_ERROR:
LD A,#0
LD (M0_HEAD_NUM_CNT),A
LD (M0_RX_INDEX),A
LD (R_IR_TX_RX),A
LD (DU_CNT_DATA0),A
LD (DU_CNT_DATA1),A
LD (R_RX_DATA0),A
LD (R_RX_DATA1),A
CLEAR_RECEIVER_TIMER_AND_EXIT:
LD A,#0
LD (M0_RX_TIMER0),A
LD (M0_RX_TIMER1),A
EXIT_RECEIVER:
ENDM
|