LED数码管电子时钟电路采用24h记时方式,日期和时间用6位数码管显示。该电路采用AT98c2051单片机,使用5V电池供电,只要使用一个按键开关即可以进入调时、省电(不显示LED 数码管)和正常显示三种状态。
一、 电子时钟的技术指标
显示范围:年份99年,如2001-2099;日月正常显示,能识别闰年闰月;时间采用24小时制
显示格式:日期按年月日排列,年取后两位显示如2005年12月20日显示为:051220;时间按时分秒排列,显示如12点30分55秒显示为123055
显示位数:6位8段LED数码管作正常、调时和节电显示
时钟误差:24小时误差3~5秒
二、 硬件电路的选择
1、单片机的选择 选用AT89C2051单片机,配备11.0592MHz晶振,复位电路采用上电复位
2、显示电路选择 采用软件译码动态显示,P3.0-P3.5作数码管的位选口,P1.0-P1.6作数
码管的段选口。考虑直接用单片机I/O口作位选时可能驱动功率不够,可采用三极管9012作驱动,
共阳极数码管显示。
3、电源选择 采用直流5V电源供电,可用7805将9V电池转换成5V
三、设计分析
1、定时计数的误差分析
主要误差来源及补偿 :
[1]、硬件电路在线路手工焊接时可能存在虚焊,或者有接触不良的情况,以及外界环境的影
响,通过使用印刷电路板机器焊接,可以减少硬件误差影响。
[2]、采用11.0592MHz晶振计算定时计数初值时存在小数舍入误差
公式: ,定时器/计数器采用工作方式1,定时器T0、T1溢出周期为50ms,计
算得到N=19456=4C00H,TH0=4CH,TL0=00H.若仍采用理论上的12MHz计算初值,则有:
N1=3CB0H,那么用11.0592MHz,N1不变,益出周期约为54.25ms,每次溢出比实际的要慢4.3ms,
那么一秒钟要慢85ms,从而影响24h比实际的要慢122min。修正后误差处理通过软件实现,最终
的时钟误差测得值为3-5s。
补偿方法:
1)、xx定时计数时可采用12MHz的晶振。
2)、用软件补偿,通用方法如下:
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期。无论是哪一种原因引起的误差,在xx定时的应用场合,必须考虑它们的影响,以确保xx的定时控制。根据定时中断的不同应用情况,应选择不同的xx定时编程方法。以定时器T1工作在定时方式1为例,晶振频率为12MHz 。在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的xx重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。
CLR EA ;禁止所有中断
CLR TR1 ;停止定时器T1
MOV A,#LOW(-1000+7) ;期望数的低位字节
ADD A,TL1 ;进行修正
MOV TL1,A ;重装载低位字节
MOV A,#HIGH(-1000+7) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
SETB TR1 ;重启动定时器
SETB EA ;重开中断
……
;本次设计的软件误差补偿
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
………
2、按键xx抖动的设计分析
由于键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有一个抖动过程,所以键闭合与断开会产生如附图所示的电压波形,抖动时间一般在5~10ms。这个抖动对判断键是否按下或释放有较大影响,因此必需xx键的抖动,只有这样,才能可靠地判断键的状态。
在单片机应用系统中,xx抖动有硬件和软件两种方法。硬件去抖动方法主要有利用R-S触发器和滤波器电路,如图所示。软件去抖动通常是程序检测到键被按下时,延时10ms后再检测键是否仍然闭合,若是则确认是一次真正的闭合,否则就忽略次此按键。
本次设计时采用的软件消抖程序
CLOSE:JB P3.7,CLOSE ;无按键按下,等待。
LCALL DISPLAY ;有键按下,调显示子程序延时消抖
JB P3.7,CLOSE ;是干扰返回CLOSE等待
3、驱动电路的设计
9012三极管为NPN型小功率管,可作共阳数码管的驱动,也可用9013PNP型驱动共阴数码管
4、数码管及其限流电阻的选用
数码管共阳型和共阴型的外型相同,共阴极是把所有的发光二极管的阴极俩在一起,通常接地,通过控制每一只的阳极电平来使其发光或者熄灭。阳极为高电平发光,为低电平熄灭。共阳极是把所有的阳极连在一起,通常接高电平(+5V),通过控制每一只的阴极电平使其发光或者熄灭,阴极为低电平发光,为高电平熄灭。COM口作为位选端,8只发光二极管被分成两个组,所以有两个COM端,在使用时把它们并联起来。
为了保证发光二极管经久耐用而不被烧毁,需要外接限流电阻。取值一般是流经的电流在10~20mA,由于高亮度数码管的使用,电流还可以取得小一些。发光二极管开启电压,红色在1.6~1.8V之间,绿色约为2.0V。设导通电压为 =1.6V,正向电流为5~20mA ,限流电阻R取值在170 ~680 ,考虑单片机本身的驱动能力很大,实际设计取值560 。计算如下:
5、数码管显示技术
(1)静态显示技术
静态显示技术就是当数码管显示某一字符时,相应的发光二极管连续恒定地处于点亮或熄灭状态,直到更换显示内容为止。采用这种显示方式占用的硬件资源多,以七段LED显示器为例,如果用软件进行字段译码,每显示一个字符就需要一个锁存器,如果用硬件进行字段译码,每显示一个字符就需要一个锁存译码器。静态显示的数码管由于连续地工作,因此功耗大,但程序简单,亮度高。随着高度数码管的出现,动态显示同样可以达到很好的显示效果,所以在多数应用情况,不会采用静态显示方式,而采取动态显示方式。
(2)动态显示技术
在多位LED显示时,为了降低成本和功耗,将所有位的段选线并联起来,由一个8位口控制,由另一个端口进行显示位的控制。但是,由于段选是公用的,要让各位数码管显示不同的字符,就必须采用扫描方式,即动态扫描显示方式。首先从段选线上送出字段码,再控制位选线,字符就显示在指定位置上,持续1~5ms时间,然后关闭所有显示;接下来又送出新的字段码,按照上述过程又显示在新的位置上,直到每一位数码管都扫描完为止,即为一个扫描周期。由于人的视觉停留效应,因此当扫描周期小到一定程度时,人就感觉不出字符的移动或闪烁,觉得每位数码管到一直在显示,达到一种稳定的视觉效果。
动态扫描显示的扫描方式有程序控制和定时中断扫描两种。程序控制扫描方式要占用许多CPU时间,在计算机的任务较重时,难以得到好的效果,所以在实际中常采用定时中断扫描方式,这种方式是每隔一定时间(如1ms)显示一位数码管,假设有8位数码管,显示扫描周期为8ms,显示效果十分良好。本次设计采用这种方法。
(3)数码管的字型码设计
八段LED显示器由8个发光二极管组成。基中7个长条形的发光管排列成"日"字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。如下图所示。`共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时,相应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段HGFEDCBA对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就可以表示欲显示字符的字形代码。例如,对于共阴LED显示器,当公共阴极接地(为零电平),而阳极HGFEDCBA各段为0111011时,显示器显示"P"字符,即对于共阴极LED显示器,"P"字符的字形码是73H。如果是共阳LED显示器,公共阳极接高电平,显示"P"字符的字形代码应为10001100(8CH)。这里必须注意的是:很多产品为方便接线,常不按规则的方法去对应字段与位的关系,这时字形码就必须根据接线来自行设计了。数码管的管脚对照图如附图1(中间两个长的为选通端com,连接只需要连接一个)
设为共阳型,也就是相应的输出位为0时笔段亮,则字型码为:
位选口 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 字型码
显示字符 H E D C G F A B
0 1 0 0 0 1 0 0 0 88H
1 1 1 1 0 1 1 1 0 EEH
2 1 0 0 1 0 1 0 0 94H
3 1 1 0 0 0 1 0 0 C4H
4 1 1 1 0 0 0 1 0 E2H
5 1 1 0 0 0 0 0 1 C1H
6 1 0 0 0 0 0 0 1 81H
7 1 1 1 0 1 1 0 0 ECH
8 1 0 0 0 0 0 0 0 80H
9 1 1 0 0 0 0 0 0 C0H
不亮 1 1 1 1 1 1 1 1 FFH
6、AT89C2051单片机的性能简介
AT89C2051是一个低电压,高性能CMOS 8位单片机,片内含2k bytes的可反复擦写的只读Flash程序存储器和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大AT89C2051单片机可为您提供许多高xxx的应用场合。
AT89C2051是一个功能强大的单片机,但它只有20个引脚,15个双向输入/输出(I/O)端口,其中P1是一个完整的8位双向I/O口,两个外中断口,两个16位可编程定时计数器,两个全双向串行通信口,一个模拟比较放大器。 同时AT89C2051的时钟频率可以为零,即具备可用软件设置的睡眠省电功能,系统的唤醒方式有RAM、定时/计数器、串行口和外中断口,系统唤醒后即进入继续工作状态。省电模式中,片内RAM将被冻结,时钟停止振荡,所有功能停止工作,直至系统被硬件复位方可继续运行。
主要功能特性:
·兼容MCS51指令系统
·15个双向I/O口
·两个16位可编程定时/计数器
· 时钟频率0-24MHz
· 两个外部中断源
· 可直接驱动LED
· 低功耗睡眠功能
· 可编程UARL通道
· 2k可反复擦写(>1000次)Flash ROM
· 6个中断源
· 2.7-6.V的宽工作电压范围
· 128x8bit内部RAM
· 两个串行中断
· 两级加密位
· 内置一个模拟比较放大器
· 软件设置睡眠和唤醒功能
7、主要程序设计分析
(1) 主程序 设计中采用定时器T0中断完成,其余状态循环调用显示子程序,当P3.7端口
或者P1.7端口开关按下时,转入调整时间或者调整日期功能程序。系统主流程图如附图2所示:
(2) 显示子程序
数码管显示的数据存放在内存单元70H-75H中,其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出70H~75H某一地址中的数据,然后查的对应的显示段码从P1口输出。P3口将对应的数码管选中,就是显示该地址单元的数据值。
(3) 定时器T0中断服务程序
定时器T0用于时间计时。定时溢出中断周期设为50ms,中断累计20次(即1s)时对秒计数
单元进行加1操作。时间计数单元地址分别在70H~71H(s)、76H~77H(min)、78H~79H(h),7AH单元存放“熄灭符”数据(#0AH)。在计数单元中采用十进制BCD码计数,满60进位。T0中断服务程序流程图3所示。
(4)T1中断服务程序
T1中断服务程序应用于指示调整单元数字的亮闪。在时间调整状态下,每过0.3秒,将对应
单元的显示数据换成熄灭符数据(#0AH)。这样,在调整时间时,对应调整单元的显示数据就会间隔闪亮。
(5)调时功能程序
调时功能程序的设计方法是:按下按键,若按下时间小于1秒,进入省电状态(数码管不亮,
时钟不停),否则进入调分状态,等待操作,此时计时器停止走动。当再次按下按钮时,若按下的时间小于0.5秒,则时间加1分钟;若按下时间大于0.5秒,则进入小时调整状态。在小时调整状态下,当按键按下的时间大于0.5秒时退出调整状态,时钟继续走动。
四、时钟电路硬件设计
数码管时钟电路硬件附图。采用AT98c2051单片机最小化应用设计,LED显示采用动态扫描方式实现,P1口输出段码数据,P3.0-P3.5口作扫描输出,P3.7口接时间按钮开关,P1.7口接日期按钮开关。为了提供LED数码管的驱动电流,用三极管9012作电源驱动输出。实际设计按情况采用11.0592MHz的晶振。
五、程序设计
; 定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁用,
; P3.7为调整按钮,P1口 为字符输出口,采用共阳显示管。
; ******************************************
;; 中断入口程序 ;;
; ******************************************
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
LJMP INTT1 ;跳至INTT1执行
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
; ******************************************
;; 主 程 序 ;;
; ******************************************
START: MOV R0,#70H ;清70H-7AH共11个内存单元
MOV R7,#0BH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 20H,#00H ;清20H(标志用)
MOV 7AH,#0AH ;放入"熄灭符"数据
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#00H ;50MS定时初值(T0计时用)
MOV TH0,#4CH ;50MS定时初值
MOV TL1,#00H ;50MS定时初值(T1闪烁定时用)
MOV TH1,#4CH ;50MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS×20)
START1: LCALL DISPLAY ;调用显示子程序
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
SJMP START1 ;P3.7口为1时跳回START1
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
; ******************************************
;; 1秒计时程序 ;;
; ******************************************
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#4CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
DJNZ R4, OUTT0 ;20次中断未到中断退出
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
MOV R0,#71H ;指向秒计时单元(71H-72H)
ACALL ADD1 ;调用加1程序(加1秒操作)
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
CLR C ;清进位标志
CJNE A,#60H,ADDMM ;
ADDMM: JC OUTT0 ;小于60秒时中断退出
ACALL CLR0 ;大于或等于60秒时对秒计时单元清0
MOV R0,#77H ;指向分计时单元(76H-77H)
ACALL ADD1 ;分计时单元加1分钟
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH ;
ADDHH: JC OUTT0 ;小于60分时中断退出
ACALL CLR0 ;大于或等于60分时分计时单元清0
MOV R0,#79H ;指向小时计时单元(78H-79H)
ACALL ADD1 ;小时计时单元加1小时
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
CJNE A,#24H,HOUR ;
HOUR: JC OUTT0 ;小于24小时中断退出
ACALL CLR0 ;大于或等于24小时小时计时单元清0
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
MOV 73H,77H ;入对应显示单元
MOV 74H,78H ;
MOV 75H,79H ;
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回
; ******************************************
;; 闪动调时 程 序 ;;
; ******************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1: PUSH ACC ;中断现场保护
PUSH PSW ;
MOV TL1, #00H ;装定时器T1定时初值
MOV TH1, #4CH ;
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
MOV R2,#06H ;重装0.3秒定时用初值
CPL 02H ;0.3秒定时到对闪烁标志取反
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
MOV 72H,76H ;02H位为0时正常显示
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
INTT1OUT: POP PSW ;恢复现场
POP ACC ;
RETI ;中断退出
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
MOV 74H,78H ;
MOV 75H,79H ;
AJMP INTT1OUT ;转中断退出
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
MOV 74H,7AH ;
MOV 75H,7AH ;
AJMP INTT1OUT ;转中断退出
; ******************************************
;; 加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 ;子程序返回
; ******************************************
;; 清零程序 ;;
; ******************************************
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
; ******************************************
;; 时钟调整程序 ;;
; ******************************************
;当调时按键按下时进入此程序
SETMM: cLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
LCALL DL1S ;调用1秒延时程序
JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待
SETB 00H ;键释放,分调整闪烁标志置1
SET4: JB P3.7,SET3 ;等待键按下
LCALL DL05S ;有键按下,延时0.5秒
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
LCALL ADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;清进位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH: JC SET4 ;调整单元数据小于60转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时清0
CLR C ;清进位标志
AJMP SET4 ;跳转到SET4循环
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
SETB TR0 ;开启T0定时器(开时钟)
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。
LCALL DISPLAY ;有键按下,调显示子程序延时削抖
JB P3.7,CLOSE ;是干扰返回CLOSE等待
WAITH: JNB P3.7,WAITH ;等待键释放
LJMP START1 ;返回主程序(LED数据显示亮)
SETHH: CLR 00H ;分闪烁标志xx(进入调小时状态)
SETHH1: JNB P3.7,SET5 ;等待键释放
SETB 01H ;小时调整标志置1
SET6: JB P3.7,SET7 ;等待按键按下
LCALL DL05S ;有键按下延时0.5秒
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
LCALL ADD1 ;调加1子程序
MOV A,R3 ;
CLR C ;
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24转SET6循环
LCALL CLR0 ;大于或等于24时清0操作
AJMP SET6 ;跳转到SET6循环
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键释放
LCALL DISPLAY ;延时削抖
JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
CLR 01H ;清调小时标志
CLR 00H ;清调分标志
CLR 02H ;清闪烁标志
CLR TR1 ;关闭定时器T1
CLR ET1 ;关定时器T1中断
SETB TR0 ;开启定时器T0
SETB ET0 ;开定时器T0中断(计时开始)
LJMP START1 ;跳回主程序
SET1: LCALL DISPLAY ;键释放等待时调用显示程序(调分)
AJMP SET2 ;防止键按下时无时钟显示
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
AJMP SET4
SET5: LCALL DISPLAY ;键释放等待时调用显示程序(调小时)
AJMP SETHH1 ;防止键按下时无时钟显示
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
AJMP SET6
SETOUT1: LCALL DISPLAY ;退出时钟调整时键释放等待
AJMP SETOUT ;防止键按下时无时钟显示
; ******************************************
;; 显示程序 ;;
; ******************************************
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#70H ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P3,A ;从P3口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P1,A ;段码放入P1口
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P3.5 ;一次显示结束,P3口复位
MOV P1,#0FFH ;P1口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;共阳段码表 "0""1""2""3""4""5""6""7""8""9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
DS20MS: ACALL DISPLAY
ACALL DISPLAY
ACALL DISPLAY
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
END ;程序结束