?? hwfs.asm
字號(hào):
;=============電風(fēng)扇紅外發(fā)射(遙控器)程序=====================================
;按鍵說明:
;K1:低風(fēng)檔,鍵值為 01
;K2:中風(fēng)檔,鍵值為 02
;K3:高風(fēng)檔,鍵值為 03
;K4:彩燈檔,鍵值為 04
;K5:自然風(fēng)檔,鍵值為05
;K6:睡眠風(fēng)檔,鍵值為06
;K7:正常風(fēng)檔,鍵值為07
;K8:定時(shí)檔,鍵值為08
;K9:開關(guān)機(jī),鍵值為9
;采用 4×1.5V 供電,用89C2051作CPU芯片,當(dāng)沒有按鍵按下時(shí),進(jìn)入待機(jī)狀態(tài)
;按鍵采用INT0進(jìn)行中斷,只采用了8個(gè)按鍵
;==============================================================================
$include(2051RAM.INC)
;$include(REG51.INC)
ORG 0000H
JMP MAIN
ORG 0003H ;INT0的中斷入口
JMP KEY_INT0
ORG 000BH ;T0的中斷入口
JMP FM_T0
ORG 0100H
;------------------------------------------------------------------------------
;進(jìn)入主程序
;------------------------------------------------------------------------------
MAIN: MOV R0,#7FH ;預(yù)使用單元清0
CLR A
MAIN0:
MOV @R0,A
DJNZ R0,MAIN0 ;清緩沖的地址單元值
MOV SP,#60H
MOV P1,#00001111B ;將P1置輸入
CLR KEYON
CLR IT0 ;設(shè)置電平觸發(fā)
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的高電平標(biāo)志
MOV R2,#02H ;2/3的循環(huán)次數(shù)
DJNZ 40H,LOOP1
DJNZ 41H,LOOP1
DJNZ 42H,LOOP1
MOV PCON,#01H ;進(jìn)入待機(jī)
LOOP1: JMP MAIN
;=============================================================
;中斷程序:完成其按鍵按下的標(biāo)志位
;=============================================================
KEY_INT0:
PUSH ACC
PUSH PSW
CLR EX0
MOV A,P1
CPL A
ANL A,#0FH
MOV R2,A ;將行號(hào)存入R2中
MOV P1,#0F0H ;將列置輸入端
MOV A,P1
CPL A
ANL A,#0F0H ;取列號(hào)并存入A中
MOV R1,#03H ;置列初號(hào)
MOV R3,#03H ;置循環(huán)次數(shù)
CLR C
PINT01: RLC A ;取列號(hào)
JC PINT01
DEC R1
DJNZ R3,PINT01
PINT02: MOV A,R2 ;取行號(hào)
MOV R2,#00H
MOV R3,#03H ;置循環(huán)次數(shù)
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 ;鍵號(hào)存于32H單元中
CPL A
MOV SENDBUF+3,A ;存鍵號(hào)的反碼
MOV SENDBUF,#0FFH ;系統(tǒng)碼在30H單元中
MOV SENDBUF+1,#00H ;系統(tǒng)反碼在31H單元中
LCALL SEND
SETB ET0 ;發(fā)送引導(dǎo)碼
SETB TR0 ;啟動(dòng)T0
LCALL PP ;發(fā)送一幀數(shù)據(jù).包括系統(tǒng)碼和數(shù)據(jù)碼
CLR TR0 ;當(dāng)發(fā)送完后關(guān)斷定時(shí)器
CLR ET0 ;關(guān)T0的中斷
SETB EX0 ;執(zhí)行完后打開外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
;==============================================================================
;引導(dǎo)脈沖子程序
SEND: SETB DATAOUT
LCALL DY9000us
CLR DATAOUT
LCALL DY4500us
RET
;==============================================================================
;發(fā)送四個(gè)緩沖單元中的內(nèi)容程序:
PP: MOV R3,#4 ;發(fā)送的字節(jié)數(shù)
MOV R1,SENDBUF
PP0: MOV R2,#08H ;讓其循環(huán)8次
MOV A,@R1 ;將數(shù)據(jù)首址
CLR C ;清CY
PP1: RRC A ;右環(huán)移帶進(jìn)位
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 ;等四個(gè)字節(jié)的發(fā)送完
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
;==========================================================================
;延時(shí)9000us子程序:
DY9000us:
MOV R31,#91
L2A: PUSH R31
L3A: DJNZ R31,L3A
POP R31
DJNZ R31,L2A
RET
;==============================================================================
;延時(shí)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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -