📄 数字钟.asm
字号:
;-----------------------------------
;CLL.ASM 8051 7-SEGMENT DISPLAY CLOCK
;8051 ASM USE:KEIL
;COPYRIGHT CMY 2007
;--------------------
;K1:ADJ TIME K2:HOUR K3:MIN K4:OK
;--------------------
;定时器0计时中断程序每隔5ms中断一次
;MOV TL0,#(8192-5000).MOD.32;加载低字节;
;MOV TH0,#(8192-5000)/32;加载高字节;
LW EQU 24
HG EQU 99
CO EQU 200 ;5ms中断计数时间常数,表示1s计数200次
BUF EQU 30H
HOUR EQU 34H
MIN EQU 35H
SEC EQU 36H
DEDA EQU 37H ;5ms计数值
SECO EQU 38H ;存放旧的秒数
;按键输入引脚定义
K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
K4 EQU P1.3
;-------------------------------
;主程序
ORG 0H
JMP BEGIN
ORG 0BH
JMP T0_INT
ORG 0100H
BEGIN:
CALL INIT ;变量初始化
CALL INIT_TIMER ;初始化定时器接口,使用T0模式0计时
CALL LOAD_DATA
LOOP:
CALL TIME_PRO ;更新时分秒数据
CALL SCANS ; 显示器扫描数次
;TEST KEY,K1:ADJ TIME K2:HOUR K3:MIN K4:OK
JB K1,L1
JNB K1,$
;K1 KEYED
CALL SET_TIME ;设定时间
JMP LOOP
;-----------------------------------------
L1:JB K2,L2
JNB K2,$
;K2 KEYED
JMP LOOP
L2:JB K3,L3
JNB K3,$
;K3 KEYED
JMP LOOP
L3:JB K4,L4
JNB K4,$
;K4 KEYED
JMP LOOP
L4:
JMP LOOP
;---------------------------------------
;初始化控制变量
;----------------------------------------
INIT:
MOV DEDA,#0
MOV SECO,#0
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
RET
;------------------------------------------
;初始化定时器接口,使用T0模式0计时
;-----------------------------------------
INIT_TIMER:
MOV TMOD,#00000000B
MOV IE,#10000010B
MOV TL0,#LW
MOV TH0,#HG
SETB TR0
RET
;------------------------------------------
;USE TIMER MODE 0
;COVNT=5ms/1us=5000
;T0计时中断程序每隔5ms中断一次
;------------------------------------------
T0_INT:
PUSH ACC
MOV TL0,#LW
MOV TH0,#HG
INC DEDA
;小数点闪烁
MOV A,DEDA
CJNE A,#100,PD2
PD2:JC LD
SETB P2.6
AJMP PD1
LD:CLR P2.6
;1 SEC TIME OUT CHECK
PD1: CJNE A,#CO,TT
MOV DEDA,#0
INC SEC
MOV A,SEC
CJNE A,#60,TT
;1 MIN TIME OUT
INC MIN
MOV A,#0
MOV A,MIN
CJNE A,#60,TT
;1 HOUR TIME OUT
INC HOUR
MOV MIN,#0
MOV A,HOUR
CJNE A,#24,TT
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
TT:
POP ACC
RETI
;------------------------------
;设置现在的时间,包括小时和分钟
;K2:HH K3:MM K4:OK
;------------------------------
SET_TIME:
CLR TR0
MOV SEC,#0
;SCAN 3 KEY T0 ADJ
A0:
CALL SCAN1
JB K2,A1
;K1 KEYED
JNB K2,$
INC HOUR
MOV A,HOUR
CJNE A,#24,A11
MOV HOUR,#0
A11:
CALL CONV
CALL SCANS
JMP A0
A1:JB K3,A2
;K2 KEYED ADJ MM
JNB K3,$
INC MIN
MOV A,MIN
CJNE A,#60,A21
MOV MIN,#0
A21:
CALL CONV
CALL SCANS
JMP A0
A2:JB K4,A0
JNB K4,$
;K3 KEYED OK
SETB TR0
RET
;---------------------------------------------
;显示器扫描数次
SCANS:
MOV R4,#55
SS:CALL SCAN1
DJNZ R4,SS
RET
;---------------------------------------------
;显示器扫描一遍
;SCAN 4 TIMES
SCAN1:
MOV R0,#BUF
MOV R2,#4
MOV R3,#0FEH
S1:
;SEND OUT 1 T SEGMENT DATA IN @R0
MOV A,@R0
MOV DPTR,#0EFFFH
MOVX @DPTR,A
;SEND SCAN CODE
MOV A,R3
MOV P2,A
;CHANGE SCAN CODE
RL A
MOV R3,A
INC R0
;CLR P2.6
MOV R5,#5
CALL DELAY1
DJNZ R2,S1
RET
;----------------------------------------
;更新时分秒数据
;UPDATE SEC,MIN,HR
TIME_PRO:
MOV A,SEC
MOV B,SECO
CJNE A,B,TI1
JMP TI2
TI1:CALL CONV
MOV SECO,SEC
TI2:RET
;-----------------------------------------
;将时分秒数据转换成显示器数据并写入显示内存
;T SEG HH:MM:SS
;CONVERT DATA AND SHOW
;BUF0 BUF1 BUF2 BUF3
CONV:
;SHOW HOUR
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
;SHOW MIN
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
RET
;----------------------------------------------
;T-SEGMENT COMMON CATHODE;
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H,88H
DB 83H,0C6H,0A1H,86H,84H,0FFH
;------------------------------------------------
LOAD_DATA:
MOV BUF,#0C0H
MOV BUF+1,#0C0H
MOV BUF+2,#0C0H
MOV BUF+3,#0C0H
RET
;------------------------------------------------
;DELAY X ms R5*10ms
DELAY:
MOV R6,#50
D1:MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;--------------------------------------------------
;DELAY A WHILE R5*0.2MS
DELAY1:
MOV R6,#1
D2:MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,DELAY1
RET
;---------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -