📄 fase.asm
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP DS0
ORG 0030H
MAIN:
MOV TMOD,#11H
CLR 30H //30H位用于控制定时器的计时回转,可以用TF1
CLR 40H //40H位用于发送0判断位
SETB P2.7 //P2.7用于控制红外发射管的发射
LCALL DELAY
LCALL DELAY
SETB ET0
SETB ET1
SETB EA
MOV R3,#4 //R3是行扫描移位次数
MOV SP,#60H //设置栈的初值
MOV P1,#0F0H //键扫描初值
MOV A,P1
CJNE A,#0F0H,DELAY1 //判断有没有键值过来
LJMP MAIN //循环判断
DELAY1: //下面延时约1ms (50*2+2)*10
MOV R0,#10
L1:
MOV R1,#50
L2:
DJNZ R1,L2
DJNZ R0,L1
MOV A,P1
CJNE A,#0F0H,GETKEY0 //如果1ms后判断有键值,则跳到GETKEY里面取出键值
LJMP MAIN
GETKEY0:
MOV A,#0FEH
MOV P1,A
MOV A,P1
CJNE A,#0EEH,KEY1
MOV 20H,#0 //如果扫描结果为0EEH则把0放到20H寄存器里面发射
LJMP SEND
KEY1: //有错,不能超过8个
CJNE A,#0DEH,KEY2
MOV 20H,#1
LJMP SEND
KEY2:
CJNE A,#0BEH,KEY3
MOV 20H,#2
LJMP SEND
KEY3:
CJNE A,#07EH,GETKEY1
MOV 20H,#3
LJMP SEND
GETKEY1:
MOV A,#0FDH
MOV P1,A
MOV A,P1
CJNE A,#0EDH,KEY5
MOV 20H,#4
LJMP SEND
KEY5:
CJNE A,#0DDH,KEY6
MOV 20H,#5
LJMP SEND
KEY6:
CJNE A,#0BDH,KEY7
MOV 20H,#6
LJMP SEND
KEY7:
CJNE A,#07DH,GETKEY2
MOV 20H,#7
LJMP SEND
GETKEY2:
MOV A,#0FBH
MOV P1,A
MOV A,P1
CJNE A,#0EBH,KEY9
MOV 20H,#8
LJMP SEND
KEY9:
CJNE A,#0DBH,KEY10
MOV 20H,#9
LJMP SEND
KEY10:
CJNE A,#0BBH,KEY11
MOV 20H,#10
LJMP SEND
KEY11:
CJNE A,#07BH,GETKEY3
MOV 20H,#11
LJMP SEND
GETKEY3:
MOV A,#0F7H
MOV P1,A
MOV A,P1
CJNE A,#0E7H,KEY13
MOV 20H,#12
LJMP SEND
KEY13:
CJNE A,#0D7H,KEY14
MOV 20H,#13
LJMP SEND
KEY14:
CJNE A,#0B7H,KEY15
MOV 20H,#14
LJMP SEND
KEY15:
CJNE A,#077H,KEY16 //只能前127后128,不能跳得太长
MOV 20H,#15
LJMP SEND
KEY16:
LJMP MAIN
SEND:
MOV P3,20H
MOV TH0,#0DAH //9ms起始码,
MOV TL0,#0E3H
CLR P2.7
SETB TR0
JNB 30H,$
CLR TR0
CLR 30H
MOV TH0,#0ECH //5ms结果码。
MOV TL0,#077H
SETB TR0
JNB 30H,$
CLR TR0
CLR 30H
JB 07H,K7 //发送第七位
LCALL SEND0
LJMP BIT6
K7:
LCALL SEND1
BIT6:
JB 06H,K6
LCALL SEND0
LJMP BIT5
K6: LCALL SEND1
BIT5:
JB 05H,K5
LCALL SEND0
LJMP BIT4
K5: LCALL SEND1
BIT4:
JB 04H,K4
LCALL SEND0
LJMP BIT3
K4: LCALL SEND1
BIT3:
JB 03H,K3
LCALL SEND0
LJMP BIT2
K3: LCALL SEND1
BIT2:
JB 02H,K2
LCALL SEND0
LJMP BIT1
K2: LCALL SEND1
BIT1:
JB 01H,K1
LCALL SEND0
LJMP BIT0
K1: LCALL SEND1
BIT0:
JB 00H,K0
LCALL SEND0
LCALL DELAY
LJMP MAIN
K0: LCALL SEND1
LCALL DELAY
LJMP MAIN
SEND1:
MOV TH0,#0FEH //低电平0.5ms
MOV TL0,#00BH
SETB TR0
JNB 30H,$
CLR TR0
CLR 30H
MOV TH0,#0F4H //高电平3ms
MOV TL0,#047H
SETB TR0
JNB 30H,$
CLR TR0
CLR 30H
RET
SEND0:
MOV TH0,#0FEH //低电平0.5ms
MOV TL0,#00BH
SETB TR0
JNB 30H,$
CLR TR0
CLR 30H
MOV TH0,#0FCH //高电平1ms
MOV TL0,#017H
SETB TR0
JNB 30H,$
CLR TR0
CLR 30H
RET
DS0:
SETB 30H
CPL P2.7
RETI
DELAY:
MOV R3,#0FFH
DEL2:
MOV R4,#8H
DEL1:
DJNZ R4,DEL1
DJNZ R3,DEL2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -