⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 综合实验11.asm

📁 时钟
💻 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 + -