📄 系统程序.asm
字号:
ORG 0000H
LJMP MAIN
ORG 0010H
MAIN: MOV SP,#60H ;设置堆栈指针
MOV A,#0FFH
MOV P0,A ;P0口高电平,使灯灭
MOV P1,A ;P1口做输入先置位
MOV P2,A ;关LED显示
SETB P3.1 ;关报警
L1: JB P1.0,L1 ;判断P1.0是否按下,没有则等待
LCALL DELAY10MS ;有键按下延时消抖
JB P1.0,L1 ;再次确定是否有键按下
CLR P0.0 ;是则P0.0口对应的 灯亮
LCALL DELAY5S ;延时5S
ACALL BELL ;5S时间到发出报警声
SETB P0.0 ;P0.0口灯灭
SETB P1.0 ;P1.0置位为下次再按下做准备
DD1: JNB P1.1,SW1 ;键盘扫描程序,有键按下则转向相应子程序
JNB P1.2,SW2
JNB P1.3,SW3
JNB P1.4,SW4
SJMP DD1 ;等待有键按下,没有则循环扫描
DD2: JB P1.0,$ ;P1.0再次按下则调用显示子程序
LCALL DELAY1MS ;延时1MS消抖
LCALL DISP
SJMP MAIN ;无限循环
SW1: LCALL DELAY10MS ;调用程序
LCALL KEY1
JMP DD2 ;调用的程序实行完后转回,等待P1.0键按下
SW2: LCALL DELAY10MS
LCALL KEY2
JMP DD2
SW3: LCALL DELAY10MS
LCALL KEY3
JMP DD2
SW4: LCALL DELAY10MS
LCALL KEY4
JMP DD2
KEY1: ;各个按键功能子程序
MOV A,#0FFH ;关闭LED显示
MOV P2,A
MOV P1,A ;关闭位选
ACALL BELL ;调用报警程序
CLR P0.1 ;灯亮
LOOP1: CLR P1.6 ;位选控制,右边的LED
MOV A,#0F9H ;数字1的段码
MOV P2,A ;送P2口显示
LCALL DELAY1MS
MOV P2,#0FFH ;关闭
SETB P1.6
CLR P1.5 ;位选控制,左边的LED
MOV A,#0C0H ;数字0的段码
MOV P2,A ;送P2口显示
LCALL DELAY1MS
MOV P2,#0FFH ;关闭
SETB P1.5
JNB P1.0,W1 ;等待P1.0键按下,按下则转回
SJMP LOOP1 ;反复循环
W1: RET
KEY2:
MOV A,#0FFH
MOV P2,A
MOV P1,A
ACALL BELL ;调用报警程序
CLR P0.2 ;灯亮
LOOP2: CLR P1.6
MOV A,#0A4H
MOV P2,A
LCALL DELAY1MS
MOV P2,#0FFH
SETB P1.6
CLR P1.5
MOV A,#0C0H
MOV P2,A
LCALL DELAY1MS
MOV P2,#0FFH
SETB P1.5
JNB P1.0,W2
SJMP LOOP2
W2: RET
KEY3:
MOV A,#0FFH
MOV P2,A
MOV P1,A
ACALL BELL ;调用报警程序
CLR P0.3 ;灯亮
LOOP3: CLR P1.6
MOV A,#0B0H
MOV P2,A
LCALL DELAY1MS
MOV P2,#0FFH
SETB P1.6
CLR P1.5
MOV A,#0C0H
MOV P2,A
LCALL DELAY1MS
MOV P2,#0FFH
SETB P1.5
JNB P1.0,W3
SJMP LOOP3
W3: RET
KEY4:
MOV A,#0FFH
MOV P2,A
MOV P1,A
ACALL BELL ;调用报警程序
CLR P0.4 ;灯亮
LOOP4: CLR P1.6
MOV A,#99H
MOV P2,A
LCALL DELAY1MS
MOV P2,#0FFH
SETB P1.6
CLR P1.5
MOV A,#0C0H
MOV P2,A
LCALL DELAY1MS
MOV P2,#0FFH
SETB P1.5
JNB P1.0,W4
SJMP LOOP4
W4: RET
BELL: ;报警子程序
MOV R3,#0FH
ACALL MUSIC
DJNZ R3,D5
D5: RET
MUSIC:
MOV R5,#60H ;控制音长
MIC:
CPL P3.1
ACALL DELAY5MS ;控制音调
DJNZ R5,MIC
RET
;显示子程序
DISP: MOV A,#0FFH ;关闭显示器
MOV P2,A
MOV 50H,#91 ;90S初值送50H单元
MOV R4,#0DFH ;位选控制送R4,先选右边的LED
MOV R5,#20 ;12MZH晶振定时50MS,循环20次得1S
MOV TMOD,#01H ;工作方式1
LOOP5: MOV TH0,#3CH ;置初值
MOV TL0,#0B0H
SETB TR0 ;启动定时
DEC 50H
MOV A,50H ;取出显示数
MOV B,#0AH ;拆分秒的十位个位
DIV AB
MOV DPTR,#TABLE ;数据表首地址
MOVC A,@A+DPTR ;查表
MOV R1,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R2,A
MOV A,R4
MOV P1,A
MOV R1,A
MOV P2,A
ACALL DELAY1MS
MOV R4,A
RL A
MOV A,R4
MOV P1,A
MOV A,R2
MOV P2,A
ACALL DELAY1MS
JNB TF0,$
CLR TF0
DJNZ R5, LOOP5
ACALL BELL
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;数据表
DB 92H,82H,0F8H,80H,90H
DELAY5MS: MOV R7,#3H ;延时5MS子程序
D0: MOV R6,#40H
DJNZ R6,$
DJNZ R7,D0
RET
DELAY10MS: MOV R6,#20 ;延时10MS子程序
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELAY1MS: MOV R6,#2 ;延时1MS子程序
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
DELAY5S: MOV R5,#50 ;延时5S子程序
D3: MOV R6,#200
D4: MOV R7,#248
DJNZ R7,$
DJNZ R6,D4
DJNZ R5,D3
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -