📄 ir_rx.asm
字号:
$MOD51
ORG 00H
AJMP START
START: ACALL FLASH ; TURN OFF PORT 2 ALL LED
MOV P1,#0FFH
CR_LOOP: MOV R0,#30H
ACALL IR_IN
MOV A,31H
CPL A
MOV B,30H
CJNE A,B,EXIT
OUT: MOV P2,A
EXIT: AJMP CR_LOOP
;DECODE IR SIGNAL
IR_IN:
I1: JNB P1.0,I2 ; WAIT FOR IR SIGNAL
AJMP I1
I2: MOV R5,#70 ; DELAY FOR CHECK IR START POINT (7mS)
I20: ACALL DEL0_1
DJNZ R5,I20
JB P1.0,I1
CLR P1.1 ; TURN ON LED INDICATE IR SIGNAL REC.
I21: JB P1.0,I3
ACALL DEL0_1
AJMP I21
I3: MOV R3,#0 ; CLEAR 8BIT VALUE
I31: JNB P1.0, I4
ACALL DEL0_1
AJMP I31
I4: JB P1.0,LL
ACALL DEL0_1
AJMP I4
LL: MOV R2,#0 ; 0.1mS CALCULATION
L1: ACALL DEL0_1
JB P1.0,N1 ; WAIT SIGNAL TO LOW AND EACH 0.1mS PUT R2+1
MOV A,#8 ; CHECK R2 COUNT VALUE
CLR C
SUBB A,R2 ; IDENTIFY 1 OR 0 BIT, IF C=0, BIT=0
MOV A,@R0
RRC A
MOV @R0,A ; COMPLETE 1 BIT PROCESS
JNB P1.0,$
INC R3
CJNE R3,#8,LL ; NEED PROCESS 8 BIT
MOV R3,#0 ; PROCESS NEXT 8 BIT
INC R0
CJNE R0,#32H,LL
AJMP OK
N1: INC R2
CJNE R2,#30, L1 ; IF HIGH VALUE TIME MORE THAN 3mS AUTO EXIT
OK: SETB P1.1
RET
FLASH: MOV P2,#00H
ACALL DELAY_1S
MOV P2,#FFH
RET
DEL0_1: MOV R7, #23 ; DELAY 0.1mS
DL: NOP ; inserted NOPs to cause delay
NOP
DJNZ R7, DL ; decrement R7, if not zero loop back
RET
DELAY_1S: MOV R6,#250 ; DELAY 1S
DL2: MOV R7,#250
DL1: DJNZ R7,DL1
DJNZ R6,DL2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -