📄 hwfs.asm
字号:
;=============电风扇红外发射(遥控器)程序=====================================
;按键说明:
;K1:低风档,键值为 01
;K2:中风档,键值为 02
;K3:高风档,键值为 03
;K4:彩灯档,键值为 04
;K5:自然风档,键值为05
;K6:睡眠风档,键值为06
;K7:正常风档,键值为07
;K8:定时档,键值为08
;K9:开关机,键值为9
;采用 4×1.5V 供电,用89C2051作CPU芯片,当没有按键按下时,进入待机状态
;按键采用INT0进行中断,只采用了8个按键
;==============================================================================
$include(2051RAM.INC)
;$include(REG51.INC)
ORG 0000H
JMP MAIN
ORG 0003H ;INT0的中断入口
JMP KEY_INT0
ORG 000BH ;T0的中断入口
JMP FM_T0
ORG 0100H
;------------------------------------------------------------------------------
;进入主程序
;------------------------------------------------------------------------------
MAIN: MOV R0,#7FH ;预使用单元清0
CLR A
MAIN0:
MOV @R0,A
DJNZ R0,MAIN0 ;清缓冲的地址单元值
MOV SP,#60H
MOV P1,#00001111B ;将P1置输入
CLR KEYON
CLR IT0 ;设置电平触发
SETB PT0
SETB EX0
SETB EA
MOV 40H,#0FFH
MOV 41H,#0FFH
MOV 42H,#0FFH
CLR DATAOUT
CLR FMOUT ;38K的中断初始值
MOV TMOD,#02H ;T0的工作方式2
MOV TH0,#0F7H ;送初值
SETB FMOUT
CLR TR0 ;1/3的高电平标志
MOV R2,#02H ;2/3的循环次数
DJNZ 40H,LOOP1
DJNZ 41H,LOOP1
DJNZ 42H,LOOP1
MOV PCON,#01H ;进入待机
LOOP1: JMP MAIN
;=============================================================
;中断程序:完成其按键按下的标志位
;=============================================================
KEY_INT0:
PUSH ACC
PUSH PSW
CLR EX0
MOV A,P1
CPL A
ANL A,#0FH
MOV R2,A ;将行号存入R2中
MOV P1,#0F0H ;将列置输入端
MOV A,P1
CPL A
ANL A,#0F0H ;取列号并存入A中
MOV R1,#03H ;置列初号
MOV R3,#03H ;置循环次数
CLR C
PINT01: RLC A ;取列号
JC PINT01
DEC R1
DJNZ R3,PINT01
PINT02: MOV A,R2 ;取行号
MOV R2,#00H
MOV R3,#03H ;置循环次数
PINT03: RRC A
JC PINT04
INC R2
DJNZ R3,PINT03
PINT04: MOV A,R2
CLR C
RLC A
RLC A
ADD A,R1
MOV SENDBUF+2,A ;键号存于32H单元中
CPL A
MOV SENDBUF+3,A ;存键号的反码
MOV SENDBUF,#0FFH ;系统码在30H单元中
MOV SENDBUF+1,#00H ;系统反码在31H单元中
LCALL SEND
SETB ET0 ;发送引导码
SETB TR0 ;启动T0
LCALL PP ;发送一帧数据.包括系统码和数据码
CLR TR0 ;当发送完后关断定时器
CLR ET0 ;关T0的中断
SETB EX0 ;执行完后打开外INT0
MOV 40H,#0FFH
MOV 41H,#0FFH
MOV 42H,#0FFH
POP PSW
POP ACC
RETI
;=============================================================================
FM_T0: JB F0,IT01
DJNZ R2,GRET
MOV R2,#2
IT01: CPL FMOUT
CPL F0
GRET: RETI
;==============================================================================
;引导脉冲子程序
SEND: SETB DATAOUT
LCALL DY9000us
CLR DATAOUT
LCALL DY4500us
RET
;==============================================================================
;发送四个缓冲单元中的内容程序:
PP: MOV R3,#4 ;发送的字节数
MOV R1,SENDBUF
PP0: MOV R2,#08H ;让其循环8次
MOV A,@R1 ;将数据首址
CLR C ;清CY
PP1: RRC A ;右环移带进位
JC ONE ;若C等1
ZER0: SETB DATAOUT ;若C等0
CALL DY562us
CLR DATAOUT
CALL DY562us
ONE: SETB DATAOUT
CALL DY562us
CLR DATAOUT
CALL DY1687us
DJNZ R2,PP1
INC R1
DJNZ R3,PP0 ;等四个字节的发送完
RET
;=========================================================================
DY1687us:
MOV R31,#38
L2: PUSH R31
L3: DJNZ R31,L3
POP R31
DJNZ R31,L2
RET
;========================================================================
DY562us:
MOV R31,#20
L22: PUSH R31
L33: DJNZ R31,L33
POP R31
DJNZ R31,L22
RET
;==========================================================================
;延时9000us子程序:
DY9000us:
MOV R31,#91
L2A: PUSH R31
L3A: DJNZ R31,L3A
POP R31
DJNZ R31,L2A
RET
;==============================================================================
;延时4500us子程序
DY4500us:
MOV R31,#67
L2B: PUSH R31
L3B: DJNZ R31,L3B
POP R31
DJNZ R31,L2B
RET
;==============================================================================
DY10S: MOV R6,#10
L2C: MOV R4,#2
L3C: MOV R5,#248
DJNZ R5,$
DJNZ R4,L3C
DJNZ R6,L2C
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -