📄 irda1.asm
字号:
C8279 EQU 0F239H ;8279控制口
D8279 EQU 0F238H ;8279数据口
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTC0
ORG 0030H
MAIN: MOV SP,#60H ;设置堆栈
LCALL INIT8279 ;调用8279初始化子程序
LCALL TXDINT ;调用单元初始化子程序
MAIN1: LCALL DISP ;调用显示子程序
LCALL INTKEY ;调用键控子程序
LCALL TRANSDAT ;调用数据发送子程序
SJMP MAIN1
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
TXDINT: MOV R0,#30H ;存储单元设初值
MOV R7,#30H
MOV A,#00H
TXDINT0:MOV @R0,A
INC R0
DJNZ R7,TXDINT0
MOV 30H,#00H ;用户码设置
MOV 31H,#0FFH
SETB 04H
MOV R0,#50H ;显示缓冲区初始设置
MOV R1,#30H
MOV R2,#02H
YHDIS: 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,YHDIS
MOV 54H,#10H
MOV 55H,#10H
MOV 56H,#11H
MOV 57H,#11H
MOV TMOD,#01H ;设置定时器0工作方式1
SETB ET0
SETB EA ;开中断
RET
INTKEY: LCALL GETKEY ;键控子程序
CJNE A,#0FFH,INTKEY
MOV A,B
CJNE A,#3AH,INTKEY1 ;判是否为A键
SJMP GETKEYA
INTKEY1:CJNE A,#3BH,INTKEY ;判是否为持续发码
SETB 04H ;置持续码标志
RET
GETKEYA:LCALL KEYA ;调用A键处理子程序
GETKEYB:LCALL GETKEY
CJNE A,#0FFH,GETKEYB
MOV A,B
CJNE A,#3AH,KEYB1
SJMP GETKEYA
KEYB1: CJNE A,#3BH,NOKEYB ;判是否为B键
CLR 04H ;置第一次发码标志
SJMP SREND
NOKEYB: MOV R2,#02H
MOV R0,#56H
MOV A,B
CLR C
SUBB A,#30H
MOV @R0,A
LCALL DISP
INC R0
LCALL GETDATE1
SJMP GETKEYB
SREND: RET
;A键处理子程
KEYA: MOV R0,#56H
MOV R2,#02H
GETDATE:LCALL GETKEY ;取键
CJNE A,#0FFH,GETDATE
MOV A,B
CLR C
SUBB A,#30H
MOV @R0,A ;取到数据送显示缓冲区
LCALL DISP ;显示
INC R0
GETDATE1:
DJNZ R2,GETDATE ;取完2位输入数据?
MOV A,56H ;将取到数据送数据存储区
SWAP A
ORL A,57H
MOV 32H,A
CPL A ;数据反码送数据存储区
MOV 33H,A
RET
TRANSDAT:
MOV R1,#30H
MOV R6,#08H
MOV R7,#04H
CLR P1.6
MOV R2,#0FFH ;发送引导码9200us(H)
TXDYD1: LCALL CARRYWAVE
DJNZ R2,TXDYD1
MOV R2,#63H
TXDYD2: LCALL CARRYWAVE
DJNZ R2,TXDYD2
JB 04H,TXDREYD ;判是否为持续码
CLR P1.6 ;发送引导码4400us(L)
MOV TH0,#0F0H ;设置定时器初值
MOV TL0,#28H
SJMP S4400
TXDREYD:CLR P1.6 ;发送持续码2200us(L)
MOV TH0,#0F8H ;设置定时器初值
MOV TL0,#14H
S4400: SETB TR0
JNB 03H,$
CLR 03H
JB 04H,RES680
TXDDATE:MOV 5EH,@R1
TXDBIT: MOV R2,#1AH ;发送数据码680us(H)
S680: LCALL CARRYWAVE
DJNZ R2,S680
CLR P1.6
MOV A,5EH
RRC A
JC S1600 ;判数据位是否为‘1’?
MOV 5EH,A
MOV TH0,#0FEH ;为‘0’定时500us(L)
MOV TL0,#34H
SETB TR0
JNB 03H,$
CLR 03H
SJMP TXDBEND
S1600: MOV 5EH,A
MOV TH0,#0FAH ;为‘1’定时1600uS(L)
MOV TL0,#3DH
SETB TR0
JNB 03H,$
CLR 03H
TXDBEND:DJNZ R6,TXDBIT ;发送完8位数据?
MOV R6,#08H
INC R1
DJNZ R7,TXDDATE ;发送完4组数据?
RES680: MOV R2,#1AH ;发送结束码680us(H)
JS: LCALL CARRYWAVE
DJNZ R2,JS
CLR P1.6
RET
CARRYWAVE:
SETB P1.6 ;载波子程序
LCALL DELAY4
CLR P1.6
LCALL DELAY4
NOP
NOP
RET
CTC0: CLR TR0 ;中断子程序
SETB 03H
RETI
DELAY4: NOP ;载波延时子程序
NOP
NOP
RET
;读取键盘子程序
;输入: 无 ; 输出: B: 读到的键码 A: 按键的标志
GETKEY: PUSH DPH ;保存现场
PUSH DPL
PUSH PSW
MOV DPTR,#C8279
MOVX A,@DPTR ;读8279状态
ANL A,#07H ;屏蔽D7-D3
JNZ GETVAL ;判断是否有键输入
MOV A,#00H ;置标志(无键输入)
SJMP NKBHIT
GETVAL: MOV A,#40H ;读 FIFO RAM 命令(40H)
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR ;读键
ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 键
MOV DPTR,#KEYCODE ;键码表起始地址
MOVC A,@A+DPTR ;查表
MOV B,A ;置返回键值
MOV A,#0FFH ;置标志(有键输入)
NKBHIT: POP PSW ;恢复现场
POP DPL
POP DPH
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
;LED显示常数表
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
;键盘键码表
KEYCODE:DB 30H,31H,32H,33H,34H,35H,36H,37H ;'1,2,Q,W,A,S,+,Z'
DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;'3,4,E,R,D,F,X,C'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -