51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。
3 A" U* d. l* V( C/ F 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 , U" F# ^: W9 B5 r
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 4 {. h4 W) p% B- Y7 m
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。 * ~( f, w8 F& V0 Q# P, g( z2 u
9 |' O( i! M! Q# Q
, [- S0 @* c% Z" R+ ]8 M$ M$ F L( W- |
) ?$ Y) P' N N2 @3 t 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。/ }9 \6 Q5 m5 e* P
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 a% ?5 h2 e4 F( s;; 中断入口程序 ;; (仅供参考)
0 V5 J* B) S1 T7 X1 M;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 Y5 O f+ h4 h$ J9 {5 K0 {! _
;
; u6 B0 n6 e, ` F8 y) UORG 0000H ;程序执行开始地址
1 _: D* `" s; vLJMP START ;跳到标号START执行
5 N6 I3 z% B6 X5 nORG 0003H ;外中断0中断程序入口
: |% |3 j4 O6 q+ F7 m( R% v- F" YRETI ;外中断0中断返回
5 |3 n$ e. Y, j# s$ H! ?" d* JORG 000BH ;定时器T0中断程序入口* L0 l- V0 L4 P. y: b: |
LJMP INTT0 ;跳至INTTO执行; }! f0 h- b j1 {. A9 K q
ORG 0013H ;外中断1中断程序入口
- p! [8 H ]4 f4 \! g$ e( Z; VRETI ;外中断1中断返回
; B3 e. `$ A7 p& L4 M% V$ eORG 001BH ;定时器T1中断程序入口
5 }8 A: X" j$ e# M/ w; }2 @2 BLJMP INTT1 ;跳至INTT1执行: B1 z/ v. @, M: X8 d" C: e/ I
ORG 0023H ;串行中断程序入口地址
6 e5 n+ r& Q$ T/ k; FRETI ;串行中断程序返回
, c8 f6 T1 J% h m: n0 ]5 Q' Q; ];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/ z1 n3 q9 N2 K7 @# r4 x+ H. M
;; 主 程 序 ;;3 p" p' `5 c9 W. }
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" [- m$ G [( b* x G6 L o) G+ \
;1 @) ^* a. Q( c" M
START: MOV R0,#70H ;清70H-7AH共11个内存单元' U$ ?0 h( g4 e- g" p3 Q
MOV R7,#0BH + L( \' K+ ^/ j% p, y
;clr P3.7 ;
9 n5 S/ ~; M! ` K/ FCLEARDISP: MOV @R0,#00H ;
I1 B; `* k; o% r- `" [$ |INC R0 ;. m+ f1 Q6 B8 V$ c- q
DJNZ R7,CLEARDISP ;) K% G8 Z, f9 S3 z! t) p
MOV 20H,#00H ;清20H(标志用)
3 x9 s4 a( a, fMOV 7AH,#0AH ;放入"熄灭符"数据
. k0 O) v! V1 D$ h4 |MOV TMOD,#11H ;设T0、T1为16位定时器
0 Y2 R; T+ L- Q8 k0 `' D7 ^MOV TL0,#0B0H ;50MS定时初值(T0计时用)
6 }; V' n; o. ]: J$ x# DMOV TH0,#3CH ;50MS定时初值. \( `" \; P* j# x% L
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
. f0 ~9 E' M6 p$ d6 S9 IMOV TH1,#3CH ;50MS定时初值* e$ U' n) r# b( P/ K3 p6 Y
SETB EA ;总中断开放
T8 Q$ }4 T0 }( _SETB ET0 ;答应T0中断4 e k- X7 l5 ^ M( J: B( o
SETB TR0 ;开启T0定时器0 K9 X' {4 J- J) k4 g" u( N3 ?2 B
MOV R4,#14H ;1秒定时用初值(50MS×20)' d9 L f) c B1 B' |
START1: LCALL DISPLAY ;调用显示子程序
y/ ?, r; F( w1 ^8 g, ^& r( QJNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序 ' E l# G' {9 C A R3 q
SJMP START1 ;P3.7口为1时跳回START1. r0 r2 u$ j8 K/ [
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
8 Z; e! }0 H6 I1 d7 Y5 y;
" `9 J5 p( w; x3 @2 d+ M3 ?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/ x( l6 c! Z' {) c* l
;; 1秒计时程序 ;;
. b6 Y5 m$ O1 g l( M" b; \;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
x! D/ {# L/ H/ z) U% g7 j;T0中断服务程序2 \+ Y7 c, V) c7 q; H+ R
INTT0: PUSH ACC ;累加器入栈保护$ a$ K. H8 O7 {& E
PUSH PSW ;状态字入栈保护- I7 R4 t- i: P$ O$ E
CLR ET0 ;关T0中断答应 g! a, f4 m: A& I) c! w
CLR TR0 ;封闭定时器T0
. L) i3 T! C8 YMOV A,#0B7H ;中断响应时间同步修正7 o# H* A+ K1 R4 H
ADD A,TL0 ;低8位初值修正
Y6 w; i% q1 h6 yMOV TL0,A ;重装初值(低8位修正值)2 V' T9 e3 L. p
MOV A,#3CH ;高8位初值修正
0 a% H7 q- x3 ]! \. hADDC A,TH0 ;9 f; D' t3 z9 {& ~7 ~
MOV TH0,A ;重装初值(高8位修正值)4 A0 C4 J' \7 W/ f
SETB TR0 ;开启定时器T0
/ m- M# q7 ?* f1 i2 CDJNZ R4, OUTT0 ;20次中断未到中断退出
7 p9 O9 N1 h7 S: P! J4 h4 SADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
! X5 p3 O% D( Q& |! |3 r" gMOV R0,#71H ;指向秒计时单元(71H-72H)# ?4 X- |7 _9 e* a" C4 e
ACALL ADD1 ;调用加1程序(加1秒操作). C& L! }9 {1 R1 _( ]
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)9 r" O& @1 ], [- f
CLR C ;清进位标志
, o0 P" \% A; U1 o8 {CJNE A,#60H,ADDMM ;
\, f3 c1 g2 h. _; z4 X0 eADDMM: JC OUTT0 ;小于60秒时中断退出
: ?6 S, i9 ]! k5 A$ ^' K( WACALL CLR0 ;大于或即是60秒时对秒计时单元清0
* n& z/ p* v, ?( K, w5 P% xMOV R0,#77H ;指向分计时单元(76H-77H)5 G# h3 O2 `4 E$ L4 Q- b9 Y p7 |
ACALL ADD1 ;分计时单元加1分钟, A4 ]9 {3 `5 I$ k
MOV A,R3 ;分数据放入A, Y1 o& y7 O" i2 K+ @
CLR C ;清进位标志
3 u! f/ w& E: }( I( }7 M; m4 Q( X4 m- LCJNE A,#60H,ADDHH ;. F8 L' Q4 [9 p. Y5 h
ADDHH: JC OUTT0 ;小于60分时中断退出
]. J0 T: m- F. r5 NACALL CLR0 ;大于或即是60分时分计时单元清0
4 n- h, h% O& b* r5 OMOV R0,#79H ;指向小时计时单(78H-79H)3 L3 r6 R8 R" z; b0 J
ACALL ADD1 ;小时计时单元加1小时( y* z% r/ ~ M8 }9 ?
MOV A,R3 ;时数据放入A, L4 h' _- R% b
CLR C ;清进位标志
1 Z _3 ~* }, c% K& OCJNE A,#24H,HOUR ;4 C3 d9 V5 y- d9 N( x
HOUR: JC OUTT0 ;小于24小时中断退出1 X$ h! g7 b1 O5 k# P3 C1 r
ACALL CLR0 ;大于或即是24小时小时计时单元清0
+ ^/ i! ^7 P7 i- v3 `, S6 h, TOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
8 A0 V M1 b6 zMOV 73H,77H ;入对应显示单元
& d7 I; \4 q6 p+ f6 E9 T# M& D) [7 TMOV 74H,78H ;
/ W0 z* q3 n* \. z' o$ k) oMOV 75H,79H ;
* j1 ?7 E2 u# B$ H+ HPOP PSW ;恢复状态字(出栈)
7 s6 m! F$ U1 XPOP ACC ;恢复累加器
( C4 n. u; r* ]) nSETB ET0 ;开放T0中断
' g* ?" J0 C; ~' k5 T5 ?RETI ;中断返回
# c' j# U. k4 M" y( p9 v- [;) k! a6 h" J% I* X& N% @, u- r
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 u: w( i- {1 @8 `8 V. |;; 闪动调时 程 序 ;;
$ y1 A3 ? V) k) U5 [2 ?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 n/ W; y7 ^, X* t8 f( T5 |
;T1中断服务程序,用作时间调整时调整单元闪烁指示4 M+ N0 z8 U" \8 |3 T( S4 p0 Y1 b
INTT1: PUSH ACC ;中断现场保护
6 a# J4 u( n! G; \, d5 HPUSH PSW ;
6 w3 c# a; i& G1 [MOV TL1, #0B0H ;装定时器T1定时初值- B2 y2 F7 N" f
MOV TH1, #3CH ;1 [$ g2 t! k6 z4 P7 |0 M# s% z
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
/ B% J; k- m4 O {3 S2 ^8 v7 \6 v6 pMOV R2,#06H ;重装0.3秒定时用初值
2 L; J% _# P0 J- V, }, n+ @CPL 02H ;0.3秒定时到对闪烁标志取反( ~- o+ u5 n3 S7 j0 L8 I
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
# G! W7 C* a9 O7 D$ Z j8 k% ]$ ^MOV 72H,76H ;02H位为0时正常显示% B7 \& t3 S' [: P6 e' b7 X, A9 k
MOV 73H,77H ;' |9 z- p/ z$ [2 T: ?. I3 g( G
MOV 74H,78H ;
0 X* [+ Y, S2 _1 W9 H0 JMOV 75H,79H ;: J! `5 k0 |& c+ F$ Q
INTT1OUT: POP PSW ;恢复现场- V8 V1 X# q) t" R) Q' _
POP ACC ;3 D5 {! n6 [2 s& ?3 [
RETI ;中断退出
0 s( K: \ H, mFLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制 u% k5 U* x& X! j* [/ O& _
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
9 J+ b+ a1 r' s/ H/ {MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据5 D& p* N- R; O
MOV 74H,78H ;# B6 H: X( s% D" Z7 O
MOV 75H,79H ;! P2 l1 C( n$ U. S1 S
AJMP INTT1OUT ;转中断退出
k- Q6 {6 k) K$ e A" r' ]0 rFLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时8 n/ F6 e& A0 @' s
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示6 W% C$ s* y7 x- N! e1 Q
MOV 74H,7AH ;; ^9 z+ T7 _! Y' Q( o
MOV 75H,7AH ;0 V& d0 |5 M u. X$ K
AJMP INTT1OUT ;转中断退出5 `/ v. N+ T& ^) p( r1 S, ?
;
- r% Q* `/ v+ D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( x% h4 n+ H; E
;; 加1子 程 序 ;;
% x3 J- p' X* k2 D% S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- K) w3 n) ~) G$ O. p. P;- V8 z- e$ F; ?# Y! W6 j
ADD1: MOV A,@R0 ;取当前计时单元数据到A5 l% u' M$ H: L3 U% N3 J& Q
DEC R0 ;指向前一地址; g! o$ s2 {8 t3 A1 |$ @
SWAP A ;A中数据高四位与低四位交换
0 I4 U' P d" PORL A,@R0 ;前一地址中数据放入A中低四位4 v' B& j7 t) m0 d- L# K! }
ADD A,#01H ;A加1操作3 A7 W6 c1 ?% r' m5 X
DA A ;十进制调整# z5 C' {& p- U: i. L, u
MOV R3,A ;移入R3寄存器
' j2 S! V9 T+ G8 _ANL A,#0FH ;高四位变0" [# X! d8 d5 [2 t! r9 Y' Q7 {. p5 v
MOV @R0,A ;放回前一地址单元0 K1 M4 m# t$ w4 |; ~
MOV A,R3 ;取回R3中暂存数据
* D" \2 m+ s; Q4 Z; [INC R0 ;指向当前地址单元& @6 l& d: q. o. p0 O2 |
SWAP A ;A中数据高四位与低四位交换
% t6 e" Q2 d5 EANL A,#0FH ;高四位变0) y4 E2 c- @; m2 w$ Z6 E% d
MOV @R0,A ;数据放入当削地址单元中
) h# R$ o/ V/ \; n NRET ;子程序返回
8 \+ t5 Z$ P! c% d;3 P" F' F, F& Q+ E+ d, R5 `0 A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! r, ]6 s$ n2 z( T8 j;; 清零程序 ;;& U: Z* y, _6 M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 p# O6 A8 c- C. ]' }
;.............+ i4 A3 i0 p4 R
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2 m+ D$ h" ^1 o
;; 时钟调整程序 ;;3 J' \8 |2 S i. X g+ R9 E+ N
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;* p+ m# Q. Z1 |' g; C; X; n
;当调时按键按下时进入此程序9 w1 b% U9 z; K; `/ N
SETMM: cLR ET0 ;关定时器T0中断
! L5 V1 G- q9 @- p1 ZCLR TR0 ;封闭定时器T0 x$ I$ l- X" {( Z
LCALL DL1S ;调用1秒延时程序
3 T W7 {' n6 V/ {& t1 p# OJB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)
+ o6 F( L: x b- L/ ^$ i& F7 _MOV R2,#06H ;进入调时状态,赋闪烁定时初值9 y3 p- |8 Z% j" C2 l5 T
SETB ET1 ;答应T1中断' Q3 B" `$ @6 E- h; w. Y2 V
SETB TR1 ;开启定时器T1
8 B% J0 f$ z; gSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待
* ]9 h! o- A8 E* p$ KSETB 00H ;键开释,分调整闪烁标志置1
4 E$ C; a! P; H" xSET4: JB P3.7,SET3 ;等待键按下
- U# W( _+ {7 r5 o) f5 E3 `LCALL DL05S ;有键按下,延时0.5秒8 [/ p3 w k+ U# c9 [5 x7 t
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态) X( t1 g6 K7 D, \# U9 G
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作' I4 t6 @% }% M- I3 C4 x
LCALL ADD1 ;调用加1子程序
3 T" m9 B- j3 ~* N% u; ^/ V3 `MOV A,R3 ;取调整单元数据
. u% b! G8 F2 K: `* I c9 nCLR C ;清进位标志& P0 S- {/ k3 e) |
CJNE A,#60H,HHH ;调整单元数据与60比较( }( _, m$ T) Y; Q; [) G
HHH: JC SET4 ;调整单元数据小于60转SET4循环1 D0 z* L4 X9 J- I6 g. a
LCALL CLR0 ;调整单元数据大于或即是60时清0+ v/ N1 X* O; [% A& _
CLR C ;清进位标志
7 g- p7 Y* Y& c+ R* }1 k( BAJMP SET4 ;跳转到SET4循环. Z) |1 z" Q* C) c9 v
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断! K7 E8 o$ z8 U/ j% j
SETB TR0 ;开启T0定时器(开时钟)- B( {, e6 y% D3 o) N9 h; v' c9 A
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。
" t* V& N* H" U: y- T% eLCALL DISPLAY ;有键按下,调显示子程序延时削抖
; p6 B1 `2 h3 T( ]. q$ B7 x, \JB P3.7,CLOSE ;是干扰返回CLOSE等待& P" W2 @' d5 a2 d* q9 I1 U
WAITH: JNB P3.7,WAITH ;等待键开释8 s+ }6 O# L0 n9 L# ?
LJMP START1 ;返回主程序(LED数据显示亮)# W Q4 Y* j! ~+ k& O
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
2 \# y) N+ M: _SETHH1: JNB P3.7,SET5 ;等待键开释+ K7 g2 J" X( F+ |6 }5 Z+ h; s& \* Z
SETB 01H ;小时调整标志置1$ x# W( s7 c; j: }
SET6: JB P3.7,SET7 ;等待按键按下/ _( L* K) m# x6 d0 X
LCALL DL05S ;有键按下延时0.5秒
3 v T% F2 A" z8 n7 Z3 S# mJNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整( n. G% u4 l6 z' E
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
; ]2 D3 `: Z% E! lLCALL ADD1 ;调加1子程序
, P3 y* f" ~) M2 K$ `# T4 HMOV A,R3 ;
9 I) S$ r! O6 Z% mCLR C ;
8 p5 J" t" T- Z8 k# _* L% RCJNE A,#24H,HOUU ;计时单元数据与24比较
1 }) Q( M$ z9 w% I( E/ zHOUU: JC SET6 ;小于24转SET6循环
* t1 g6 e" ^/ R# U( N$ `" i+ ~* wLCALL CLR0 ;大于或即是24时清0操作
+ D0 J4 t$ `9 U0 w2 gAJMP SET6 ;跳转到SET6循环
# U( ?; H6 P! l( G0 PSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释9 Y' S5 F3 Z9 r7 c8 n: q
LCALL DISPLAY ;延时削抖
& I( |0 e: X8 S8 xJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
0 ?$ u" b3 e, h7 z, j" T; TCLR 01H ;清调小时标志6 z) T4 y1 v' ]- @, _
CLR 00H ;清调分标志6 U4 |9 Y, G5 P
CLR 02H ;清闪烁标志
+ g! O# J+ y" W4 yCLR TR1 ;封闭定时器T11 o, y9 _8 \/ u% M! ?
CLR ET1 ;关定时器T1中断* A. _- m. @# q% B
SETB TR0 ;开启定时器T09 ]( {, _3 B- l8 q) r& p9 l8 T
SETB ET0 ;开定时器T0中断(计时开始)9 I, A1 y" P2 V5 T( ^0 `% F8 r0 a
LJMP START1 ;跳回主程序
6 y" j$ @1 W) |+ p# @5 s- @* `SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
( ?% u9 l0 t3 V' q3 ^AJMP SET2 ;防止键按下时无时钟显示. V) C8 ]7 ?. m1 c: Q
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
y& d6 y1 I" K0 n% k% q$ z. `AJMP SET4
9 P; J4 O$ {, l1 u& V& q S2 ESET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)& C9 j, h: a5 ]; p/ S8 ]
AJMP SETHH1 ;防止键按下时无时钟显示
; C! ?+ C% r8 A7 R3 e" V( xSET7: LCALL DISPLAY ;等待调小时按键时时钟显示用0 V+ U! ~+ U% }1 T7 M/ k c
AJMP SET6; z: Y; E$ V8 d6 t* x
SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待2 i" H C; [% `& y4 |5 m
AJMP SETOUT ;防止键按下时无时钟显示
7 M, }% J, n' j8 c. y;9 w, m9 `3 Z2 `
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ C4 w$ Z9 B/ G2 O2 m;; 显示程序 ;;
" O$ _2 y1 e6 f7 ` Z, V;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 E! d9 G! U) ]" `6 d
$$$$$$$$$$$$$$$$$$$$$$$$$$$
% e8 k9 l8 o# G* J& y5 f& Z, v/ o;1MS延时程序,LED显示程序用; [6 ~9 K" b; S8 D0 Q* n
DL1MS: MOV R6,#14H4 l6 [! Q1 u9 T0 a
DL1: MOV R7,#19H* N- W) R1 M+ M" y- c8 y$ j
DL2: DJNZ R7,DL25 ^' A3 L% O. i" O6 y' ?6 r
DJNZ R6,DL1
2 k/ L1 l4 G( o, @( V- c/ PRET$ W. \) V/ ~6 `. m K H' K
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象2 D1 b- \% \1 b0 D2 U
DS20MS: ACALL DISPLAY2 l$ D$ q7 `9 R5 l0 }' \' B
ACALL DISPLAY
3 I9 ?3 J1 Y% N. fACALL DISPLAY
q; ]/ [* L7 n/ G% w' N, b# sRET
! t+ T' L/ m: r2 t( \! @;延时程序,用作按键时间的长短判定
2 H$ q% c2 B/ u" @: {, j, m. jDL1S: LCALL DL05S
7 E- d" X9 X$ L! R$ J5 N6 D0 U, `LCALL DL05S
6 r5 \; B) v( z) ], p4 ?! dRET4 a2 Z% d( f3 t9 a4 o6 F
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
+ }9 J( q) E8 m! }3 G" h. l+ `/ [DL05S1: LCALL DISPLAY
- |% c+ k; g+ P0 Y- Z; r- zDJNZ R3,DL05S18 L! k- V+ @' Y5 e
RET
* A5 b" r) i \1 _' ?% kEND ;程序结束
+ N/ E. ?( m' v2 z% j |