📄 time.asm
字号:
;程序名: MCS51实验板配套程序-时钟,使用T0中断方式
;电路介绍:显示由一片74164驱动4位共阴数码管
; DsDat-p1.4;DsClk-p1.5;Gw-p1.0;Sw-p1.1;Bw-p1.2;Qw-p1.3
;www.01mcu.net www.01mcu.com 2003/4/19编写
;********************************************************************
XSDAT BIT P1.4 ;定义部分,意思是:程序中管脚名用前面字符替代
XSCLK BIT P1.5
GW BIT P1.0
SW BIT P1.1
BW BIT P1.2
QW BIT P1.3
bz bit 00h ;秒闪动标志
SJGW EQU 30H ;秒存储器
SJSW EQU 31H
SJBW EQU 32H ;分存储器
SJQW EQU 33H
TIME EQU 21H ;定时器
SEC EQU 22H ;秒计数器
MIN EQU 23H ;分钟计数器
;--中断入口-----------------------
ORG 0000H
AJMP INIT ;到初始
ORG 000BH
AJMP TIME0 ;50MS中断
;***初始化********************************************************
INIT: MOV SP,#40H
MOV P1,#0FH ;关闭显示
MOV P0,#0ffH ;发光管灭
MOV SEC,#0
MOV MIN,#0 ;清时间为0
MOV TMOD,#1H ;初始化T0为定时器方式,模式1
MOV TL0,#0B0H
MOV TH0,#3CH ;50MS定时初值(12M时)
SETB ET0 ;允许T0中断
SETB TR0 ;启动定时器T0
SETB EA
MAIN :
MOV A,SEC ;提取秒数据
MOV B,#10
DIV AB ;10进制转换
MOV SJSW,A ;得到十秒值
MOV SJGW,B ;得到秒值
MOV A,MIN
MOV B,#10
DIV AB ;转换分
MOV SJQW,A ;得到十分值
MOV SJBW,B ;得到分值
LCALL DISPLAY ;显示
LJMP MAIN
;T0 50MS中断==对应12MHZ=====================================
TIME0: PUSH ACC
INC TIME
MOV A,TIME
CJNE A,#20,T0EXIT ;20个50MS=1S
cpl bz ;反转闪动标志
MOV TIME,#0
INC SEC ;+1秒
MOV A,SEC
CJNE A,#60,T0EXIT ;60S=1MIN
MOV SEC,#0
INC MIN ;分+1
MOV A,MIN
CJNE A,#60,T0EXIT
MOV MIN,#0
dec p0 ;hex小时记录
T0EXIT: MOV TL0,#0B0H
MOV TH0,#3CH ;重装50MS定时
POP ACC
RETI
;************************************************************************
;74164显示程序,使用RS1=1,RS0=0的1区 2003/4/19
;---------------------------------------------------------
DISPLAY: PUSH ACC ;保存ACC
PUSH PSW
CLR RS1
SETB RS0 ;使用第一区工作寄存器
MOV DPTR,#XSTAB
MOV A,SJGW ;取得数据
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;调用送出子程序
CLR GW
ACALL DS1MS ;调用显示1MS延时程序
SETB GW
MOV A,SJSW
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
CLR SW
ACALL DS1MS ;显示1MS
SETB SW
MOV A,SJBW
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
CLR BW
ACALL DS1MS ;显示1MS
SETB BW
;---------
jb bz,bzover ;若标志=1,不显示小数点
mov a,#80h ;显示小数点
acall dsout
clr bw
acall ds1ms
setb bw
bzover:
;---------
MOV A,SJQW
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
CLR QW
ACALL DS1MS ;显示1MS
SETB QW
POP PSW
POP ACC ;出栈
RET ;返回调用
;---送出循环----------
DSOUT:
MOV R0,#8 ;传送一个字节8位
DSLOOP: RLC A ;左移
MOV XSDAT,C ;送数据到数据口
SETB XSCLK ;送一时钟
CLR XSCLK
DJNZ R0,DSLOOP
RET
;---显示延时----------
DS1MS: MOV R1,#10
DS1LO: MOV R2,#100
DJNZ R2,$
DJNZ R1,DS1LO
RET ;延时返回
;---------------------------------------------------------
;显示字表(共阴)
XSTAB: DB 3FH,06H,5BH,4FH ;"0","1","2","3"
DB 66H,6DH,7DH,07H ;"4","5","6","7"
DB 7FH,6FH,77H,7CH ;"8","9","A","B"
DB 39H,5EH,79H,71H ;"C","D","E","F"
;************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -