DISPBUF EQU 50H ;50H,51H,52H,53H是显示缓冲区
LED1 EQU P2.0 ;第一位数码管的位控制
LED2 EQU P2.1 ;第二位数码管的位控制
LED3 EQU P2.2 ;第三位数码管的位控制
LED4 EQU P2.3 ;第四位数码管的位控制
LED5 EQU P2.4
LED6 EQU P2.5
LED7 EQU P2.6
LED8 EQU P2.7
;==============================================================
org 0000h
LJMP MAIN
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
MAIN:
MOV R0,#50H
MOV 65H, #2
MOV 64H, #3
MOV 63H, #5
MOV 62H, #9
MOV 61H, #5
MOV 60H, #9
MOV 59H, #1
MOV 58H, #2
ACALL OUT
LOOP1:ACALL DISP ;调用显示程序
JNB P3.2,K1
JNB P3.3,K2
ACALL TIME
AJMP LOOP1
K1: LJMP CLEAR
K2: LJMP PAUSE
TIME:
MOV R0,#59H ;指向毫秒计时单元
ACALL ADD1 ;调用加1程序(加1毫秒操作)
MOV A,R3 ;毫秒数据放入A(R3为2位十进制数组合)
CLR C ;清进位标志
CJNE A,#60H,ADDS
ADDS: JC OUT ;小于60毫秒时中断退出
ACALL CLR0 ;大于或等于60毫秒时对秒计时单元清0
MOV R0,#61H ;指向秒计时单元
ACALL ADD1 ;调用加1程序(加1秒操作)
MOV A, R3 ;秒数据放入A(R3为2位十进制数组合)
CLR C ;清进位标志
CJNE A, #60H,ADDM
ADDM: JC OUT ;小于60秒时中断退出
ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#63H ;指向分计时单元
ACALL ADD1 ;分计时单元加1分钟
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDH
ADDH: JC OUT ;小于60分时中断退出
ACALL CLR0 ;大于或等于60分时分计时单元清0
MOV R0,#65H ;指向小时计时单元
ACALL ADD1 ;小时计时单元加1小时
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
CJNE A,#24H,HOUR
HOUR: JC OUT ;小于24小时中断退出
ACALL CLR0 ;大于或等于24小时计时单元清零
OUT:
MOV DISPBUF, 65H
MOV DISPBUF+1, 64H
MOV DISPBUF+2, 63H
MOV DISPBUF+3, 62H
MOV DISPBUF+4,61H
MOV DISPBUF+5, 60H
MOV DISPBUF+6,59H
MOV DISPBUF+7,58H
RETI
;======================================================================
;清零程序
;======================================================================
CLR0:
CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清零
RET
;======================================================================
;加1子程序
;======================================================================
ADD1:
MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当前地址单元中
RET
;======================================================================
;显示程序
;======================================================================
DISP:
;-----------------------------------------------------------
MOV A,DISPBUF ;取第一个待显示数
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A ;
MOV P0,A ;将字形码送P0位(段口)
CLR LED1 ;开第一位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED1 ;关闭第一位显示器(开始准备第二位的数据)
;-----------------------------------------------------------
MOV A,DISPBUF+1 ;取显示缓冲区的第二位
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR
CPL A ;
MOV P0,A ;将第二个字形码送P0口
CLR LED2 ;开第二位显示器
LCALL DELAY ;延时5毫秒
SETB LED2 ;关第二位显示
;-----------------------------------------------------------
MOV A,DISPBUF+2 ;取显示缓冲区的第三位
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A ;
MOV P0,A ;将第三个字形码送P0位(段口)
CLR LED3 ;开第三位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED3 ;关闭第三位显示器
;-----------------------------------------------------------
MOV A,DISPBUF+3 ;取显示缓冲区的第四位
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A ;
MOV P0,A ;将第四个字形码送P0位(段口)
CLR LED4 ;开第四位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED4 ;关闭第四位显示器
;-----------------------------------------------------------
MOV A,DISPBUF+4 ;取显示缓冲区的第五位
MOV DPTR ,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A
MOV P0,A ;将第五个字形码送P0位(段口)
CLR LED5 ;开第五位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED5 ;关闭第五位显示器
;-----------------------------------------------------------
MOV A,DISPBUF+5 ;取显示缓冲区的第六位
MOV DPTR ,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A
MOV P0,A ;将第六个字形码送P0位(段口)
CLR LED6 ;开第六位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED6 ;关闭第六位显示器
;-----------------------------------------------------------
MOV A,DISPBUF+6 ;取显示缓冲区的第七位
MOV DPTR ,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A
MOV P0,A ;将第七个字形码送P0位(段口)
CLR LED7 ;开第七位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED7 ;关闭第七位显示器
;-----------------------------------------------------------
MOV A,DISPBUF+7 ;取显示缓冲区的第八位
MOV DPTR ,#DISPTAB
MOVC A,@A+DPTR ;取字形码
CPL A
MOV P0,A ;将第八个字形码送P0位(段口)
CLR LED8 ;开第八位显示器位口
LCALL DELAY ;延时5毫秒
SETB LED8 ;关闭第八位显示器
;-----------------------------------------------------------
RET
PAUSE:
ACALL DISP
JNB P3.2,K3
AJMP PAUSE
K3: acall CLEAR
CLEAR:
MOV 58H, #0
MOV 59H, #0
MOV 60H, #0
MOV 61H, #0
MOV 62H, #0
MOV 63H, #0
MOV 64H, #0
MOV 65H, #0
LJMP LOOP1
RETI
;======================================================================
;延时程序
;======================================================================
DELAY:
MOV R6,#20H ;延时约5mS
D1: MOV R7,#10H
D2: DJNZ R7,D2
DJNZ R6,D1
RET
;======================================================================
DISPTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0ffh
上一篇:单片机串口通讯程序
下一篇:LED电子屏字符显示器程序
推荐阅读最新更新时间:2024-03-16 15:51