📄 综合实验11.asm
字号:
;K1: 时间调整 K2:时 K3:分 K4: 确定
;K2: 闹钟查看
;K3: 设置闹钟
;K4: 闹钟开/关
;5mS定时
;MOV TL0,#(8192-5000).MOD.32
;MOV TH0,#(8192-5000)/32
LO EQU 24
HI EQU 99
CO EQU 200 ;200x5mS=1000mS
ALB EQU 20H.0 ;闹钟位
INTTI EQU 20H.1 ;整点报时位
BUF EQU 30H ;七段码缓冲地址 30H 31H 32H 33H 34H 35H 6 个字节
HOUR EQU 36H
MIN EQU 37H
SEC EQU 38H
DEDA EQU 39H ; DEDA COUNT 5 mS COUNT
SEC0 EQU 3AH ; 用于判断是否加一秒显示
HH EQU 3BH ; 闹钟
MM EQU 3CH ;
; 按键定义
K1 EQU P3.4
K2 EQU P3.5
K3 EQU P3.6
K4 EQU P3.7
;喇叭位
SPK EQU P1.0
ORG 0000H
JMP BEGIN
ORG 000BH ; 计时器 0中断入口
JMP T0_INT
BEGIN:
SETB INTTI
SETB ALB ; 闹钟开
MOV HH,#12 ; 默认闹钟时间
MOV MM,#1
CALL BZ
CALL BZ
CALL LED_BL
CALL INIT
CALL INIT_TIMER
;关显示
MOV A,#0FFH
MOV P0,A
CALL LOAD_DATA
LOOP:
CALL TIME_PRO; 更新时间
CALL SCAN1 ; 扫描七段码
;按键扫描
JB K1,M1
; K1
CALL LED_BL
CALL SET_TIME
JMP LOOP
M1: JB K2,M2
; K2 闹钟查看
CALL BZ
CALL LOOK_ATIME
JMP LOOP
M2: JB K3,M3
; K3 设置闹钟
CALL BZ
CALL SET_ATIME
CALL LED_BL
JMP LOOP
M3: JB K4,M4
; K4 闹钟开/关
CPL ALB
JNB ALB,M31
; 闹钟开
CALL BZ
CALL BZ
CALL BZ
JMP LOOP
M31:
; 闹钟关
CALL BZ
JMP LOOP
M4: JMP LOOP
;延时 Xms R5*10 ms
DELAY:
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
; 延时一会儿
DELAY1:
MOV R6,#1
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,DELAY1
RET
LED_BL:
MOV R4,#6
LE1: MOV R5,#5
CALL DELAY
DJNZ R4, LE1
RET
TABLE:
DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
DB 77H, 7CH, 58H, 5EH, 79H
DB 71H
; 显示程序,扫描六次
SCAN1:
MOV R0, #BUF
MOV R2, #6
MOV ACC, #0FBH
S1:
PUSH ACC
MOV A, @R0
MOV P0,ACC
POP ACC
MOV P2,ACC
MOV R5,#5
CALL DELAY1
RL A
INC R0
DJNZ R2, S1
RET
;初值调入(000000)
LOAD_DATA:
MOV BUF, #3FH; '0'
MOV BUF+1,#3FH
MOV BUF+2,#3FH
MOV BUF+3,#3FH
MOV BUF+4,#3FH
MOV BUF+5,#3FH
RET
INIT:
MOV DEDA,#0
MOV SEC0,#0
MOV SEC,#55
MOV MIN,#59
MOV HOUR,#11
RET
;T0初始化
INIT_TIMER:
MOV TMOD,#00000000B
MOV IE,#10000010B
MOV TL0,#LO
MOV TH0,#HI
SETB TR0
RET
; 定时模式0
; 计时5ms/1us=5000
;T0计时中断
T0_INT:
PUSH ACC
MOV TL0,#LO
MOV TH0,#HI
INC DEDA
;1秒时间到
MOV A,DEDA
CJNE A,#CO,TT1
MOV DEDA,#0
INC SEC
MOV A,SEC
CJNE A,#60,TT1
; 1分时间到
INC MIN
MOV SEC,#0
MOV A,MIN
CJNE A,#60,TT1
; 1小时时间到
SETB INTTI
INC HOUR
MOV MIN,#0
MOV A,HOUR
CJNE A,#24,TT1
MOV SEC,#0; 重新开始
MOV MIN,#0
MOV HOUR,#0
TT1:
POP ACC
RETI
; 时间显示 HH:MM:SS
; 数据转换和显示
CONV:
; 小时显示
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR, #TABLE
MOVC A,@A+DPTR
MOV BUF,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+1,A
; 分钟显示
MOV A,MIN
MOV B,#10
DIV AB
MOV DPTR, #TABLE
MOVC A,@A+DPTR
MOV BUF+2,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+3,A
; 秒显示
MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR, #TABLE
MOVC A,@A+DPTR
MOV BUF+4,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+5,A
RET
; 时间设置 K2:HH K3:MM K4:OK
SET_TIME:
CLR TR0
MOV SEC,#0
; 时间设置键扫描
L0:
CALL SCAN1
JB K2,L1
; K1 时间调整
INC HOUR
MOV A,HOUR
CJNE A,#24,L11
MOV HOUR,#0
L11:
CALL CONV
CALL SCANS;延时
JMP L0
L1: JB K3,L2
; K2 分调整
INC MIN
MOV A,MIN
CJNE A,#60,L21
MOV MIN,#0
L21:
CALL CONV
CALL SCANS;延时
JMP L0
L2: JB K4,L0
JNB K4,$
; K3 确定
CALL LED_BL
SETB TR0
RET
;位扫描
SCANS:
MOV R4,#55 ;15
SS: CALL SCAN1
DJNZ R4,SS
RET
;铃声
BZ:
MOV R6,#0
B1: CALL DEX
CPL SPK
DJNZ R6,B1
MOV R5,#10
CALL DELAY
RET
DEX: MOV R7,#180
DE1: NOP
DJNZ R7,DE1
RET
TIME_OUT:
X1: CALL LED_BL
CALL BZ
; KEY 4 停止闹钟响
JB K4,X1
JNB K4,$
CALL LED_BL
CLR ALB
RET
;闹钟时间查看
LOOK_ATIME:
CALL CONVA ; SET ALARM DATA
MOV B,#0
LO1: CALL SCAN1
DJNZ B,LO1
CALL CONV
RET
;闹钟时间显示 HH:MM
; BUF0 | BUF1 | BUF2 | BUF3 | BUF4 | BUF5
CONVA:
; 显示时间
MOV A,HH
MOV B,#10
DIV AB
MOV DPTR, #TABLE
MOVC A,@A+DPTR
MOV BUF,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+1,A
; 显示分
MOV A,MM
MOV B,#10
DIV AB
MOV DPTR, #TABLE
MOVC A,@A+DPTR
MOV BUF+2,A
MOV A,B
MOVC A,@A+DPTR
MOV BUF+3,A
RET
; 闹钟时间设置
SET_ATIME:
; K2:HH K3:MM K4:OK
CALL CONVA;显示现在闹钟时间
; 扫描闹钟时间设置键
N0:
CALL SCAN1
JB K2,N1
; K2 调整时
INC HH
MOV A, HH
CJNE A,#24,N11
MOV HH,#0
N11:
CALL CONVA
CALL SCANS
JMP N0
N1: JB K3,N2
; K3 调整分
INC MM
MOV A, MM
CJNE A,#60,N21
MOV MM,#0
N21:
CALL CONVA
CALL SCANS
JMP N0
N2: JB K4,N0
JNB K4,$
; K4 确定
CALL LED_BL
CALL CONV; 显示现在闹钟时间
RET
TIME_PRO:
MOV A,SEC
MOV B,SEC0
CJNE A,B,TI1; 判断是否换秒显示
JMP TI2
TI1: CALL CONV
MOV SEC0,SEC
TI2:
; 闹钟开关检查
JB ALB,TI3
RET
; 判断是否闹钟时间到
TI3:
MOV A,HOUR
MOV B,HH
CJNE A,B,INTTIME
MOV A,MIN
MOV B,MM
CJNE A,B,INTTIME
CALL TIME_OUT
;整点报时
INTTIME:
MOV A,MIN
CJNE A,#0,BK
JNB INTTI,BK
MOV B,HOUR
INTTIME1:
CALL BZ
DJNZ B,INTTIME1
CLR INTTI
BK:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -