📄 irda2.asm
字号:
C8279 EQU 0F239H
D8279 EQU 0F238H
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP CTC1
ORG 0030H
MAIN: MOV SP,#60H
LCALL INIT8279 ;调用8279初始化子程序
LCALL IN0 ;调用单元初始化子程序
START: LCALL DIS0 ;待接收状态显示
LCALL READ ;调用数据接收子程序
LCALL CSTART ;调用接收处理子程序
LCALL DISP ;调用显示子程序
LCALL DELAY ;延时
SJMP START
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV DPTR ,#C8279
MOV A,#00H ;置8279工作方式
MOVX @DPTR,A
MOV A,#2FH ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#0C1H ;清除 LED 显示
MOVX @DPTR,A
POP ACC ;恢复现场
POP DPL
POP DPH
RET
IN0: MOV R0,#30H ;存储单元设初值
MOV R7,#30H
MOV A,#00H
IN00: MOV @R0,A
INC R0
DJNZ R7,IN00
MOV 5FH,#0FFH ;移位存储单元设初值
MOV TMOD,#10H ;设置定时器1为工作方式1
MOV TL1,#00H
MOV TH1,#00H
SETB ET1
SETB EA ;开中断
RET
READ: MOV R7,#08H
MOV R6,#04H
MOV R0,#40H
READ0: LCALL TB10 ;等待负跳变
SETB TR1 ;开定时器
MOV 4AH,TH1 ;读定时器初始值
MOV 4BH,TL1
PMC0: LCALL TB ;等待跳变
MOV 4CH,TH1 ;读定时器值
MOV 4DH,TL1
LCALL SUB220 ;时间处理
P9200: MOV A,46H ;判时间是否在引导码9200us(L)8600~9700us范围内
CJNE A,#1FH,P92001
SJMP YES9200
P92001: CJNE A,#20H,P92002
SJMP YES9200
P92002: CJNE A,#21H,P92003
SJMP YES9200
P92003: CJNE A,#22H,P92004
SJMP YES9200
P92004: CJNE A,#23H,P92005
SJMP YES9200
P92005: SJMP READ0
YES9200:MOV 4AH,4CH ;时间值存储
MOV 4BH,4DH
LCALL TB ;等待跳变
MOV 4CH,TH1 ;读定时器值
MOV 4DH,TL1
PMC1: LCALL MC ;判毛刺
JNB 02H,NOMC1
LCALL TB ;有毛刺,去毛刺
MOV 4CH,TH1
MOV 4DH,TL1
SJMP PMC1
NOMC1: LCALL SUB220 ;时间处理
P4400: MOV A,46H ;判时间是否在引导码4400us(H)3900~4700us范围内
CJNE A,#0EH,P44001
SJMP YES4400
P44001: CJNE A,#0FH,P44002
SJMP YES4400
P44002: CJNE A,#10H,P44003
SJMP YES4400
P44003: CJNE A,#11H,P2200
SJMP YES4400
P2200: CJNE A,#06H,P22001 ;判时间是否在1700~2500us范围内
LJMP YESREDATE
P22001: CJNE A,#07H,P22002
LJMP YESREDATE
P22002: CJNE A,#08H,P22003
LJMP YESREDATE
P22003: CJNE A,#09H,P22004
LJMP YESREDATE
P22004: LJMP NODATE
YES4400:MOV 4AH,4CH ;时间值存储
MOV 4BH,4DH
MOV 4CH,4EH
MOV 4DH,4FH
PMC2: LCALL MC ;判毛刺
JNB 02H,NOMC2
LCALL TB ;有毛刺,去毛刺
MOV 4CH,TH1
MOV 4DH,TL1
SJMP PMC2
NOMC2: LCALL SUB220 ;时间值处理
P680: MOV A,46H ;判时间是否在数据码680us(L)300~800us范围内
CJNE A,#01H,P6801
SJMP YES680
P6801: CJNE A,#02H,P6802
SJMP YES680
P6802: CJNE A,#03H,NODATE
YES680: MOV 4AH,4CH ;时间值存储
MOV 4BH,4DH
MOV 4CH,4EH
MOV 4DH,4FH
PMC3: LCALL MC ;判毛刺
JNB 02H,NOMC3
LCALL TB ;有毛刺,去毛刺
MOV 4CH,TH1
MOV 4DH,TL1
SJMP PMC3
NOMC3: LCALL SUB220 ;时间值处理
P500: MOV A,46H ;判时间是否在数据码500us(H)300~600us范围内
CJNE A,#01H,P5001
SJMP YES500
P5001: CJNE A,#02H,P1600
YES500: CLR C
SJMP YESDATE
P1600: CJNE A,#04H,P16001 ;判时间是否在数据码1600uS(H)1100~1900us范围内
SJMP YES1600
P16001: CJNE A,#05H,P16002
SJMP YES1600
P16002: CJNE A,#06H,P16003
SJMP YES1600
P16003: CJNE A,#07H,NODATE
YES1600:SETB C
YESDATE:MOV A,@R0
RRC A
MOV @R0,A
DJNZ R7,YES4400 ;接收完8位数据?
MOV R7,#08H
INC R0
DJNZ R6,YES4400 ;接收完4组数据?
SETB 00H ;置接收到数据标志
SJMP RDEND
YESREDATE: ;置持续码标志
SETB 01H
SJMP RDEND
NODATE: CLR 00H ;置无数据接收标志
CLR 01H
RDEND:
RET
TB10: JNB P1.7,TB100 ;判负跳变子程序
SETB C
MOV A,5FH
RLC A
MOV 5FH,A
SJMP TB10
TB100: CLR C
MOV A,5FH
RLC A
MOV 5FH,A
ANL A,#02H
JZ TB10
RET
TB: MOV C,P1.7 ;判跳变子程序
MOV A,5FH
RLC A
MOV 5FH,A
ANL A,#03H
JZ TB
CJNE A,#03H,TB1
SJMP TB
TB1: RET
SUB220: ;时间值处理子程序
MOV 46H,4CH
MOV 47H,4DH
MOV 48H,4AH
MOV 49H,4BH
SUB221: CLR C
MOV A,47H
SUBB A,49H
MOV 47H,A
MOV A,46H
SUBB A,48H
MOV 46H,A
CLR C
RET
MC: LCALL TB ;判毛刺子程序
MOV 4EH,TH1
MOV 4FH,TL1
MOV 46H,4EH
MOV 47H,4FH
MOV 48H,4CH
MOV 49H,4DH
LCALL SUB221 ;时间值处理
MOV A,#0C0H
SUBB A,47H
JC NOMC
MOV A,#00H
SUBB A,46H
JC NOMC ;判时间是否小于200us
SETB 02H ;置有毛刺标志
SJMP MCEND
NOMC: CLR 02H ;置无毛刺标志
MCEND: RET
CSTART: JB 00H,RXD
JB 01H,CEND
SJMP NORXD
RXD: MOV A,43H ;接收数据校对
CPL A
XRL A,42H
JZ RXDOK
SJMP NORXD
RXDOK: MOV R0,#50H ;接收数据送显示缓冲区
MOV R1,#40H
MOV R2,#02H
YHDIS1: MOV A,@R1
ANL A,#0F0H
SWAP A
MOV @R0,A
INC R0
MOV A,@R1
ANL A,#0FH
MOV @R0,A
INC R0
INC R1
DJNZ R2,YHDIS1
MOV A,42H
ANL A,#0FH
MOV 57H,A
MOV A,42H
ANL A,#0F0H
SWAP A
MOV 56H,A
SJMP CEND
NORXD: MOV 57H,#11H ;无数据接收,显示待接收状态
MOV 56H,#11H
CEND: RET
DIS0: MOV 50H,#11H ;待接收状态显示子程序
MOV 51H,#11H
MOV 52H,#11H
MOV 53H,#11H
MOV 54H,#10H
MOV 55H,#10H
MOV 56H,#11H
MOV 57H,#11H
LCALL DISP
RET
DISP: PUSH DPL ;显示
PUSH DPH
PUSH PSW
PUSH ACC
MOV R1,#50H
MOV R4,#07H
DIS1:
MOV A,@R1
MOV R5,A
LCALL DISLED
INC R1
DEC R4
CJNE R4,#0FFH,DIS1
POP ACC
POP PSW
POP DPH
POP DPL
RET
DISLED: ;显示字符子程序
PUSH DPH
PUSH DPL
PUSH PSW
PUSH ACC
MOV A,#80H
ADD A,R4 ;R4显示位置
MOV DPTR,#C8279
MOVX @DPTR,A
MOV DPTR,#LEDSEG
MOV A,R5 ;R5显示数值
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
POP ACC
POP PSW
POP DPL
POP DPH
RET
CTC1:
RETI
DELAY: ;延时子程序
PUSH 2
PUSH 1
PUSH 0
MOV 2,#0AH
DELAY1: MOV 1,#00H
DELAY2: MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2 ;延时100mS
DJNZ 2,DELAY1 ;100ms*R2
POP 0
POP 1
POP 2
RET
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,b,C,d,E,F'
DB 00H,40H ;' ,-'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -