📄 time.asm
字号:
;****************************************************************
;*程序功能:在单片机教学实验仪的MCU#3上的8位数码管上 *
;*显示一个只有分和秒的时钟,采用中断方式 *
;****************************************************************
ORG 0000H
JMP MAIN
ORG 000BH ;T0的中断入口地址
JMP T0_SER
DISBUF EQU 30H ;定义一个8个成员的数组(38H-30H)
POSIT EQU 38H ;定义一个变量,用来指示显示时的数码管的位选
SEC EQU 39H ;定义一个变量,用来存放时钟的秒变量
MIN EQU 3AH ;定义一个变量,用来存放时钟的分变量
COUNT EQU 3BH ;定义一个变量,用来对定时时间进行计数
PROTECT EQU 3CH ;用于保护中断时,A中的内容
ORG 0030H
MAIN:
MOV SEC,#0
MOV MIN,#0
MOV DISBUF,#0 ;初始化显示状态
MOV DISBUF+1,#0
MOV DISBUF+2,#10H ;显示 -
MOV DISBUF+3,#0
MOV DISBUF+4,#0
MOV DISBUF+5,#11H ;消隐
MOV DISBUF+6,#11H
MOV DISBUF+7,#11H
MOV TMOD,#01H ;用T0的方式1
MOV TH0,#80H ;赋初值 说明:本程序中的初值不准
MOV TL0,#00H
SETB ET0 ;T0中断允许
SETB EA ;开总中断
SETB TR0 ;启动T0
LOOPM:
CALL DIGT_CH ;调用数字拆分程序,将SEC和MIN分成十位和个位,以便于显示
CALL DISPLAY ;调用显示程序
JMP LOOPM
;==================================
;8路数码管驱动
DISPLAY:
MOV POSIT,#01H ;用于指示数码管位选,初始化为第一个数码管亮
MOV R1,#08H ;用于指示程序循环,8个数码管每个送一次数后,本子程序结束
MOV DPTR,#DISCODE ;指向数码管的码表
MOV R0,#DISBUF ;指向显示数组
DISLOOP: ;为方便起见,只将第一个数码管的执行过程讲明,其余依次类推
MOV A,@R0 ;当R0=#DISBUF时,通过间接寻址将DISBUF中的内容放入A中
MOVC A,@A+DPTR ;通过查表,A为地址偏移量,找出A中的数所对应的码值(即段码),还放在A中
MOV P0,A ;将A中的数送至P0端口,单此时并未送至数码管
SETB P1.3 ;使能573锁存器,此时,段码才送至数码管的段选端
CLR P1.3 ;关闭573锁存器,此时,数据锁存在数码管的段选端
MOV P0,POSIT ;送位选至P0,以便指示哪一个数码管亮
SETB P1.2 ;使能573锁存器,此时,位选信号才送至数码管的位选端,相应的数码管亮
CLR P1.2 ;关闭573锁存器,此时,数据锁存在数码管的位选端
CALL DELAY ;使相应数码管亮一段时间
MOV P0,#00H ;送位选为00至P0口,即关闭所有的数码管,一产生消隐作用,避免数码管上产生重影现象
SETB P1.2
CLR P1.2
MOV A,POSIT ;当一个数码管完成显示后,对位选进行移位操作,以便为下一个数码管
RL A ;的显示作好准备,此时,位选指向下一个数码管
MOV POSIT,A
INC R0 ;使R0的数自加一,指向下一个要显示的数字,若上一次指向DISBUF,则
DJNZ R1,DISLOOP ;本次指向DISBUF+1,并受R1控制,完成8个数在数码管上的显示
RET ;所以,在使用此显示程序时,只需将欲显示的数字放入对应的DISBUF即可
;================================
DIGT_CH:
MOV A,SEC ;将秒拆分成十位和个位
MOV B,#10
DIV AB
MOV DISBUF,B ;送出去显示
MOV DISBUF+1,A
MOV A,MIN
MOV B,#10
DIV AB
MOV DISBUF+3,B
MOV DISBUF+4,A
RET
;================================
T0_SER:
MOV TH0,#80H
MOV TL0,#00H
INC COUNT
MOV PROTECT,A ;对A进行保护
MOV A,COUNT
CJNE A,#20H,T0_SER_END ;等待一秒时间到
MOV COUNT,#0
INC SEC
MOV A,SEC
CJNE A,#60,T0_SER_END
MOV SEC,#0
INC MIN
MOV A,MIN
CJNE A,#60,T0_SER_END
MOV MIN,#0
T0_SER_END:
MOV PROTECT,A ;恢复现场
RETI
;================================
DELAY:
MOV R3,#0FH
LOOP: DJNZ R3,LOOP
NOP
RET
;===================================
;共阳数码管码表
DISCODE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
; 0 1 2 3 4 5 6 7 8 9
DB 88H,83H,0C6H,0A1H,86H,08EH,0BFH,0FFH,0F7H
; A B C D E F - _
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -