📄 chouyouyanji.asm
字号:
SSTOP EQU 30H ;启动/停止键次数
ROUNT EQU 31H ;风量按键次数
TIMEK EQU 32H ;定时按键次数
LEDCOUNT EQU 33H ;LED按键次数
INCTA EQU 34H ;定时计数器A
INCTB EQU 35H ;定时计数器B
ORG 00H
LJMP MAIN
ORG 000BH
LJMP TO
ORG 030H
MAIN: MOV TMOD,#01H ;定时器0方式1
MOV TH0,#(65536-60000)/256 ;载入初值60ms
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
SETB ET0
SETB EA
MOV P3,#0FFH
MOV ROUNT,#00H
MOV TIMEK,#00H
;=======================================================================================
;按键扫描
;=======================================================================================
START: ACALL DISP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ START ;有无按键按下判断
ACALL DELAY5MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ START
ACALL BUZZER ;调用蜂鸣器子程序
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,STARK ;OEH:为LED控制按键,如果不为1就跳到启动按钮判断
clr p1.2
INC LEDCOUNT ;LEDCOUNT为1:亮,LEDCOUNT为2:灭
MOV A,LEDCOUNT
CJNE A,#01H,LEDSTOP
ACALL KEYFK
SJMP START
LEDSTOP:SETB P1.2 ;LECOUNT为2时LED灯灭
ACALL KEYFK
MOV LEDCOUNT,#00H
SJMP START
;=======================================================================================
;启动/停止判断子程序
;=======================================================================================
STARK: CJNE A,#07H,WIND ;跳到风量键判断
ACALL KEYFK
INC SSTOP
MOV A,SSTOP
CJNE A,#01H,KEYSTOP ;SSTPO为1:启动并显示为1:停止
CLR P2.2 ;启动时风速和延时指示灯亮
CLR P2.3
LJMP START
WIND: JMP WIND1
;=======================================================================================
;停止子程序
;=======================================================================================
KEYSTOP:MOV SSTOP,#00H
MOV A,P1
ORL A,#03H ;关闭P1.0和P1.1,P1.7和P1.2始终有效,因为LED灯不受停止开关控制
MOV P1,A
MOV ROUNT,#00H
MOV TIMEK,#00H
SETB P2.2 ;延时指示灯灭
SETB P2.3 ;风速指示灯灭
LJMP START
;=======================================================================================
;风量设置子程序
;=======================================================================================
WIND1: CJNE A,#0DH,TIMEKEY ;跳到时间设置子程序
MOV A,SSTOP
CJNE A,#01H,RSTART ;判断是在启动状态下,只有在启动状态下才能改变及显示风速
ACALL KEYFK
MOV A,TIMEK
CJNE A,#00H,WIND2 ;判断时间是否有设置,如果有设置那么时间设置应清除,时间复位,
SJMP WIND3
WIND2: MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV R1,TIMEK
MOV TIMEK,#00H
MOV INCTA,#00H
MOV INCTB,#00H
CLR TR0
ACALL DISP
WIND3: INC ROUNT ;风速设置子程序
MOV A,ROUNT
CJNE A,#03H,WIND4 ;跳到风量1设置子程序
MOV A,P1
ORL A,#03H
MOV P1,A
MOV ROUNT,#00H
LJMP START
RSTART: ACALL KEYFK ;SSTOP为1时表示已经启动,为其它时为停止,风量按键不起作用
LJMP START
WIND4: CJNE A,#01H,WIND5 ;跳到风量2设置子程序
SETB P1.1
CLR P1.0
LJMP START
WIND5: SETB P1.0
CLR P1.1
LJMP START
;=======================================================================================
;时间设置子程序
;=======================================================================================
TIMEKEY:CJNE A,#0BH,OUTKEY ;如果都不一样就跳到不在按键范围内子程序
ACALL KEYFK
MOV A,ROUNT
CJNE A,#0,ADDTIME
LJMP START
;=======================================================================================
;按键值不在范围内
;=======================================================================================
OUTKEY: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ TIMEKEY1
LJMP START
;=======================================================================================
;时间设置初始化子程序
;=======================================================================================
TIMEKEY1:ACALL KEYFK
ADDTIME:INC TIMEK ;定时键次数
MOV A,TIMEK
CJNE A,#0AH,TIME1
MOV TIMEK,#00
LJMP START
TIME1: CJNE A,#01H,TIME2
MOV R0,#1 ;1分钟
SETB TR0
LJMP START
TIME2: CJNE A,#02H,TIME3
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#2 ;2分钟
SETB TR0
LJMP START
TIME3: CJNE A,#03H,TIME4
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#3 ;3分钟
SETB TR0
LJMP START
TIME4: CJNE A,#01H,TIME5
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#4 ;4分钟
SETB TR0
LJMP START
TIME5: CJNE A,#05H,TIME6
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#5 ;5分钟
SETB TR0
LJMP START
TIME6: CJNE A,#06H,TIME7
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#6 ;6分钟
SETB TR0
LJMP START
TIME7: CJNE A,#07H,TIME8
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#7 ;7分钟
SETB TR0
LJMP START
TIME8: CJNE A,#08H,TIME9
CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R0,#8 ;8分钟
SETB TR0
LJMP START
TIME9: CLR TR0
MOV TH0,#(65536-60000)/256 ;时间设置清除、复位子程序
MOV TL0,#(65536-60000)MOD 256
MOV INCTA,#00H
MOV INCTB,#00H
MOV R4,#9 ;9分钟
SETB TR0
LJMP START
;=======================================================================================
;按键放开判断子程序
;=======================================================================================
KEYFK: ACALL DISP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ KEYFK
RET
;=======================================================================================
;显示子程序
;=======================================================================================
DISP: CLR P2.0
CLR P2.1
MOV A,SSTOP
CJNE A,#01H,DISP1
MOV DPTR,#TABLE
SETB P2.0
MOV A,TIMEK
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY5MS
CLR P2.0
SETB P2.1
MOV A,ROUNT
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY5MS
RET
DISP1: RET
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~9
;=======================================================================================
;中断入口,用来定时
;定时时间到后,时间显示复位、电机停止
;=======================================================================================
TO: PUSH PSW
PUSH ACC
MOV TH0,#(65536-60000)/256
MOV TL0,#(65536-60000)MOD 256
INC INCTA
MOV A,INCTA
CJNE A,#64H,TO1 ;600ms是否到了
MOV INCTA,#00H
INC INCTB
MOV A,INCTB
CJNE A,#0AH,TO1 ;1分钟是否到了
MOV INCTB,#00H
MOV A,TIMEK
DEC A
MOV TIMEK,A ;延时显示倒计
DJNZ R0,TO1 ;设定的时间是否到了
SETB P1.0 ;停止风速1电机
SETB P1.1 ;停止风速电机2
MOV ROUNT,#00H ;风速显示清零
MOV TIMEK,#00H ;时间显示复位
CLR TR0 ;停止定时器
POP ACC
POP PSW
RETI
TO1:POP ACC
POP PSW
RETI
;=======================================================================================
;蜂鸣器子程序,响2声
;=======================================================================================
BUZZER: CLR P1.7
NOP
NOP
NOP
SETB P1.7
NOP
NOP
NOP
CPL P1.7
NOP
NOP
NOP
SETB P1.7
RET
;=======================================================================================
;延时子程序
;=======================================================================================
DELAY5MS:MOV R6,#20
DD1: MOV R7,#200
DJNZ R7,$
DJNZ R6,DD1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -