51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。
# t: h& z6 G9 N, [8 _6 N) [ 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。
2 ^3 T* h- ^( E/ R 开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
7 y: D' i3 F/ l' O& `) R 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
! z" T+ V& m7 q/ U2 {' ?5 l; L0 |* C9 n% ?1 }' r
# y" [2 b) I' [3 N6 B/ i
8 Y" X# _8 m1 L/ N( G 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。& q/ y# l6 H8 ~/ @0 j" ^
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
% a& G9 T! g% A f3 H# r;; 中断入口程序 ;; (仅供参考)- P* q: t+ T* F$ v3 O" J
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, [" {$ \* {/ }, X
;
' S5 W9 j7 ]- d6 E3 aORG 0000H ;程序执行开始地址
1 w( u9 _2 o9 x3 N2 r' CLJMP START ;跳到标号START执行
m3 P" T. B8 ?, NORG 0003H ;外中断0中断程序入口
) \# a" c' _) n# f0 m# E* {RETI ;外中断0中断返回' ^) F. M9 u" K. Y) q
ORG 000BH ;定时器T0中断程序入口$ H0 s6 W5 [4 ]3 X+ F* S
LJMP INTT0 ;跳至INTTO执行5 c+ e$ T, A5 Z
ORG 0013H ;外中断1中断程序入口
# K1 h) _+ N4 }9 H) IRETI ;外中断1中断返回
1 @+ k* l) b/ O" J0 |ORG 001BH ;定时器T1中断程序入口1 c( D3 r" B. e( d. G: |
LJMP INTT1 ;跳至INTT1执行
! _' p5 W8 b; R! P5 @ORG 0023H ;串行中断程序入口地址1 ~! `! q- H: K( a8 c6 [
RETI ;串行中断程序返回
" w! [5 ~, w0 l;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;- D( u0 o& D( W# K
;; 主 程 序 ;;
4 f4 `% R3 k: B( h H+ K% F+ };;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( {: q# o. o0 ?4 \1 \$ Z
;
' a# V/ h" _- hSTART: MOV R0,#70H ;清70H-7AH共11个内存单元
9 |3 B" t; p, v) p, bMOV R7,#0BH 1 z2 d! v0 N' l+ P3 a# E
;clr P3.7 ;
* X7 M3 i- {! SCLEARDISP: MOV @R0,#00H ;8 g+ X: ]2 t4 V
INC R0 ;8 J9 J0 ~" i/ c) i- H% v" U8 ]
DJNZ R7,CLEARDISP ;
" X# s; Q( P, o9 XMOV 20H,#00H ;清20H(标志用)
6 o3 z& u, ~3 S' L; rMOV 7AH,#0AH ;放入"熄灭符"数据" G( |' p! M5 R7 a4 R5 M
MOV TMOD,#11H ;设T0、T1为16位定时器. u `; d1 S( e/ z) O8 z1 S- c0 s
MOV TL0,#0B0H ;50MS定时初值(T0计时用). A$ \" W! C s) \1 s9 o- u
MOV TH0,#3CH ;50MS定时初值
( V1 {3 K2 j* b% {8 j, g. }( ^MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
- ~6 u0 E+ L( ~' gMOV TH1,#3CH ;50MS定时初值
4 ~& b5 k" q$ B4 G$ P4 _SETB EA ;总中断开放; _/ C6 s! F7 X- O3 g( @3 Z
SETB ET0 ;答应T0中断. Z9 C: R, u) Y2 S% ?
SETB TR0 ;开启T0定时器
s, m4 d% g# ~1 Y6 bMOV R4,#14H ;1秒定时用初值(50MS×20)
+ N; L8 P) R z- x# G$ g0 @. }START1: LCALL DISPLAY ;调用显示子程序
% S9 d3 e4 s$ q' n" I/ L1 v! DJNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序 4 ^" S2 m/ J5 l% v0 A
SJMP START1 ;P3.7口为1时跳回START15 I4 k' ~3 P% K6 ?' `( q! g
SETMM1: LJMP SETMM ;转到时间调整程序SETMM9 d( O% c1 \; _3 d& A8 O9 O
;
# H7 ^' e1 o7 d, Q' \4 o;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
% K7 p% G, F- X4 \: V$ k+ z9 _4 M;; 1秒计时程序 ;;
" z( E, T9 i0 [8 a;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 y, f$ ^0 E8 w( N8 A;T0中断服务程序
X, o% D2 s9 s6 b, C; [7 AINTT0: PUSH ACC ;累加器入栈保护
! a( z; x/ Q T0 G$ {PUSH PSW ;状态字入栈保护8 T* N1 X$ f/ a) K# B0 u) B" I5 i
CLR ET0 ;关T0中断答应- ]* f! j) }( O
CLR TR0 ;封闭定时器T0. M, u# z% F( u6 \3 F A
MOV A,#0B7H ;中断响应时间同步修正5 c# H W+ D9 u+ X$ @# S. u% Z
ADD A,TL0 ;低8位初值修正
$ ]3 N# b/ _2 R4 ?; M. KMOV TL0,A ;重装初值(低8位修正值)$ B. R7 G, u- N2 a" D# |4 U
MOV A,#3CH ;高8位初值修正
6 ]5 y. u3 e) h) J7 u8 x: S6 PADDC A,TH0 ;
: U6 t/ L% t0 @MOV TH0,A ;重装初值(高8位修正值)# I! c, V( I* ^' i6 C) i5 l z3 S
SETB TR0 ;开启定时器T0
9 M8 ]8 O8 K& w9 X7 RDJNZ R4, OUTT0 ;20次中断未到中断退出
5 G5 F' p0 j0 m8 B0 |4 e7 pADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值" J; V! D2 d. D* o9 }6 r( Z- L
MOV R0,#71H ;指向秒计时单元(71H-72H)% n6 M4 h9 { J5 H0 T
ACALL ADD1 ;调用加1程序(加1秒操作)
: R- B7 p7 r8 m% m Y: E( g1 v2 NMOV A,R3 ;秒数据放入A(R3为2位十进制数组合). k6 e$ \* ]7 }. M$ }
CLR C ;清进位标志
2 w9 @# W& u O# |3 }CJNE A,#60H,ADDMM ;
' j" o9 \4 Y4 p* w& X4 HADDMM: JC OUTT0 ;小于60秒时中断退出
1 ]5 Z4 F6 M; x$ [" B5 s8 I2 E" D2 P QACALL CLR0 ;大于或即是60秒时对秒计时单元清0
8 \$ S, q& A/ E# z1 Y1 {MOV R0,#77H ;指向分计时单元(76H-77H)
3 ?6 m* n5 i8 X7 t, yACALL ADD1 ;分计时单元加1分钟; g8 }. K# m7 J9 p' s
MOV A,R3 ;分数据放入A
& e# A; n) b! C! d3 Y; Y* NCLR C ;清进位标志
9 F1 z5 \9 n. C% B" c- NCJNE A,#60H,ADDHH ;
1 }9 f! l1 @: d1 AADDHH: JC OUTT0 ;小于60分时中断退出1 [# Y Y0 O; V& o r4 q
ACALL CLR0 ;大于或即是60分时分计时单元清0
! ~$ H9 H& o, [6 p! y1 i6 Q4 ]MOV R0,#79H ;指向小时计时单(78H-79H)
" n8 u; C* J4 d' H' R V, ~7 R' bACALL ADD1 ;小时计时单元加1小时2 Y9 j s6 Z1 g4 u+ }2 f
MOV A,R3 ;时数据放入A [' b4 b4 h1 Z, ^
CLR C ;清进位标志
) f! D! Z+ [/ ^5 z: w' S8 n$ o0 h! J; lCJNE A,#24H,HOUR ;4 r- J# v4 u% O" {9 A. s; a: F
HOUR: JC OUTT0 ;小于24小时中断退出
& ?: T4 x. h& Z2 z6 i; OACALL CLR0 ;大于或即是24小时小时计时单元清0
# ~' C. ?7 s! n! r1 HOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
. U9 v) ~& e# m: y' uMOV 73H,77H ;入对应显示单元, l/ S& [. I5 z$ t/ N4 K
MOV 74H,78H ;
( A [) O5 b2 E( s) ]MOV 75H,79H ;
( u- s0 m% H+ G( W5 J, ZPOP PSW ;恢复状态字(出栈)3 y4 N8 L3 M C3 x0 g+ z
POP ACC ;恢复累加器, v, K: F ?3 V
SETB ET0 ;开放T0中断
% c, `& W$ \: _2 @' _- G8 X" gRETI ;中断返回
$ o5 s: z; q5 \+ _0 V;4 D% v$ n$ _5 |+ Z. i- e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' E) d. v. y0 f4 V
;; 闪动调时 程 序 ;;( {( O# m+ C! }, N" e1 z
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" [: t9 a4 `- m: q$ b9 o; c9 G6 `
;T1中断服务程序,用作时间调整时调整单元闪烁指示5 Y- P: d/ t& Z1 D3 L, c0 ] J3 p
INTT1: PUSH ACC ;中断现场保护9 i: U2 i h- }( B, ~$ S
PUSH PSW ;
/ T3 K5 u r4 X2 u. y: gMOV TL1, #0B0H ;装定时器T1定时初值
' u6 E/ f* x% p SMOV TH1, #3CH ;/ T6 d9 m& t3 `
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)' o; q, S$ C5 { Z" E0 a+ C8 B" v
MOV R2,#06H ;重装0.3秒定时用初值9 ^; Z' {* l) \, l Z4 c8 a
CPL 02H ;0.3秒定时到对闪烁标志取反
) o7 j1 c( b* p- M( KJB 02H,FLASH1 ;02H位为1时显示单元"熄灭") A' V/ n# X- }* X
MOV 72H,76H ;02H位为0时正常显示: x, b- q4 Z( h/ D6 ]
MOV 73H,77H ;
) s' B: V4 l+ j7 j0 a% D0 j. O2 e7 \MOV 74H,78H ;. K7 J6 c# n% n/ k& N
MOV 75H,79H ;% [- k$ }4 B8 O' O
INTT1OUT: POP PSW ;恢复现场
0 t2 H4 D! i0 x. J4 APOP ACC ;
3 ?' o% n7 M2 Y3 k: pRETI ;中断退出$ \" D1 H4 B( {1 N1 u& p
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
( i& q4 S6 o, yMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
7 c5 v/ r0 a& c) dMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据) w% u s6 Y* {
MOV 74H,78H ;
% f) G/ y! I7 w$ c) U- ?# q/ b3 PMOV 75H,79H ;; X; G0 s) L; B7 b4 v
AJMP INTT1OUT ;转中断退出7 D r) p2 _1 h4 ?( z
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
* l0 F5 `$ Z- P6 [- C( V1 KMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示& \4 g; \* q1 k4 B7 u, S) X8 U
MOV 74H,7AH ;7 f% _" c" A& `6 x
MOV 75H,7AH ; Y3 x; m# u# B& V% d4 F
AJMP INTT1OUT ;转中断退出 B. l( {3 [; T* \
;! \" V; Z# F' \: N$ m
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+ k/ B, x% Q! o" S5 v: K
;; 加1子 程 序 ;;1 }/ s* E' `' @9 t g4 ]: h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 L2 h5 m2 q$ y0 [;& P# W: T8 m+ Y" ?0 H
ADD1: MOV A,@R0 ;取当前计时单元数据到A) j$ J7 D) R1 }2 N ]" _" w8 g* S
DEC R0 ;指向前一地址$ h9 ^9 `4 s D2 y# J7 g
SWAP A ;A中数据高四位与低四位交换
4 u) j+ A: Q# M% x s0 zORL A,@R0 ;前一地址中数据放入A中低四位! w! v6 x$ S) N/ V
ADD A,#01H ;A加1操作# N( [6 p( z: ~: S. S& |% w
DA A ;十进制调整
3 [) e# k8 l8 f! F8 mMOV R3,A ;移入R3寄存器
2 W% `% d \! p( K2 |( e* _ANL A,#0FH ;高四位变0, i% d1 _: i- Y
MOV @R0,A ;放回前一地址单元6 _/ P$ D+ ^. Y) Z- \9 I
MOV A,R3 ;取回R3中暂存数据
! G: i" Y: a" {INC R0 ;指向当前地址单元, l; n) w5 G! s3 w8 P
SWAP A ;A中数据高四位与低四位交换/ k2 a5 b3 s2 J) D
ANL A,#0FH ;高四位变0
0 Y$ j2 t6 X9 r( X- ^MOV @R0,A ;数据放入当削地址单元中! ~& ?. W) f1 t/ l* S
RET ;子程序返回8 y6 k* W+ N/ X% M8 A
;
/ ]0 F# @+ d B" ^" ]) N+ X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
# |2 A- z. n/ U7 `# \% N' u! `;; 清零程序 ;;
+ l; L: r+ q \+ }& c;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6 r. A, X7 m( L0 [" s" {
;.............. M! ]0 b" t; n& Z& u
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; N% F8 n" S) A5 a! c, T2 Y( d
;; 时钟调整程序 ;;
1 a5 X, A+ u8 g0 g;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 }9 @& l! s1 r6 y X
;当调时按键按下时进入此程序/ C& y& t+ u5 T6 }2 F$ j3 Y
SETMM: cLR ET0 ;关定时器T0中断' O! x5 w; p2 p- q3 `
CLR TR0 ;封闭定时器T0: [# P+ X$ G3 L8 q; t
LCALL DL1S ;调用1秒延时程序+ `. k' @- h- s4 _
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电). `" }2 S. L1 o- I2 K
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
6 l$ m; N' t8 `SETB ET1 ;答应T1中断9 G1 Z! Y: ^; {
SETB TR1 ;开启定时器T1
6 p6 O3 z/ {- M+ R+ e1 v) jSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待5 P+ P3 v! X( ]/ B$ B/ j: A4 T" S6 O8 D- ]
SETB 00H ;键开释,分调整闪烁标志置1
' \- }! T% I; N4 FSET4: JB P3.7,SET3 ;等待键按下
/ e1 p- I5 z/ c' OLCALL DL05S ;有键按下,延时0.5秒: |, ~( v7 q% J v
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态0 i2 N# @) Y- t$ |
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作5 |: z9 |- P- \/ L
LCALL ADD1 ;调用加1子程序& P7 J) U. d5 J
MOV A,R3 ;取调整单元数据( m; p ?' d; `# C( I) S
CLR C ;清进位标志 u* u8 G, k2 ~2 Z& B( p( g6 W
CJNE A,#60H,HHH ;调整单元数据与60比较
/ l- a: }2 W' @7 e3 Z) z$ ?2 y; yHHH: JC SET4 ;调整单元数据小于60转SET4循环, U3 R; j+ N6 [0 y- Q) V D& N( r3 l
LCALL CLR0 ;调整单元数据大于或即是60时清0& u5 f0 K4 N4 ]( x
CLR C ;清进位标志
6 [: ?5 [3 K* x4 V1 p4 @. JAJMP SET4 ;跳转到SET4循环
9 y" B3 |. a# v' L! M1 c$ rCLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断5 c" E- @ L' z2 [; ?; q
SETB TR0 ;开启T0定时器(开时钟)
9 m2 b( B3 c0 [2 H' E# uCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
4 }3 x6 V0 v6 S2 o7 oLCALL DISPLAY ;有键按下,调显示子程序延时削抖
/ m3 M$ M0 @! T* D7 aJB P3.7,CLOSE ;是干扰返回CLOSE等待
, \& k7 y% c0 ` F# v" vWAITH: JNB P3.7,WAITH ;等待键开释
+ P" Q* U* I9 d. B f& v5 CLJMP START1 ;返回主程序(LED数据显示亮)* v! s* _; t/ W: R" ^) A
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
4 c8 o0 P) e, E9 ZSETHH1: JNB P3.7,SET5 ;等待键开释# D X. l3 Y" i: G5 C7 i: e
SETB 01H ;小时调整标志置1, u: {+ u8 e |' Q
SET6: JB P3.7,SET7 ;等待按键按下/ w* z1 ]1 p4 E# `& a3 C
LCALL DL05S ;有键按下延时0.5秒* B1 ~7 T( ?/ @( L
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
- ^3 v4 y: _: A6 }8 H' YMOV R0,#79H ;按下时间小于0.5秒加1小时操作
+ n% f! l$ o$ GLCALL ADD1 ;调加1子程序3 F: W& k' O. o5 O, N$ O
MOV A,R3 ;+ ~0 w0 W& X! }/ b
CLR C ;
7 |0 y& R" ?7 S8 v* ?3 t$ d7 nCJNE A,#24H,HOUU ;计时单元数据与24比较
E; A: M5 N4 mHOUU: JC SET6 ;小于24转SET6循环( b# ^" M8 U8 v* E* f5 j$ `
LCALL CLR0 ;大于或即是24时清0操作
m2 D& G! K! dAJMP SET6 ;跳转到SET6循环
6 _: A" l# a- R! p4 YSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释7 I9 ]4 Y9 |/ U- E% R
LCALL DISPLAY ;延时削抖
; Y2 z% ]0 ^' ^1 w3 H3 l5 cJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
' R7 e8 H9 x: ]CLR 01H ;清调小时标志* @& X/ H+ M6 ~3 R- F8 b
CLR 00H ;清调分标志0 M1 c9 c6 G3 B# P+ ^6 D% G+ ~1 P
CLR 02H ;清闪烁标志6 J0 L) m: u2 K9 T! s
CLR TR1 ;封闭定时器T1
" B" b9 a0 ~* OCLR ET1 ;关定时器T1中断
" j4 M" B: ?8 h4 ~3 P" TSETB TR0 ;开启定时器T0
& p- S( R% B1 M2 [SETB ET0 ;开定时器T0中断(计时开始)( X _& }: g4 h( k
LJMP START1 ;跳回主程序( ]/ ^" r4 H4 Q2 a
SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)3 M% ]6 @" N P' E' h
AJMP SET2 ;防止键按下时无时钟显示
2 O, m1 E3 G! N' e! h9 s# @SET3: LCALL DISPLAY ;等待调分按键时时钟显示用0 d Z. b$ q) w- I/ b; ~
AJMP SET4
2 |7 A+ u- y6 g$ R6 o# ?SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
' e5 ] u% _3 i6 _9 e$ [AJMP SETHH1 ;防止键按下时无时钟显示$ \5 m+ g( s% u. `9 K7 j; H# |9 L K' ?6 L
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用( Y2 H- j7 ^2 ]" E" J9 q
AJMP SET6
) Q1 E$ p m/ O: L% Z. \/ w+ WSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
# Z0 M! C/ G; m, ~9 MAJMP SETOUT ;防止键按下时无时钟显示
- j4 w$ y" g+ J' _; _1 |9 Y( ?3 i% F;
4 m; P$ D$ G6 L9 @1 };;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. D: `: J6 O* n;; 显示程序 ;;) h7 J; H6 f0 V+ T
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; D1 ]8 R4 J4 E3 w4 N. ?0 W$$$$$$$$$$$$$$$$$$$$$$$$$$$
3 o8 P1 G" k/ h# G;1MS延时程序,LED显示程序用; d( C+ Y O# g) S' f; h
DL1MS: MOV R6,#14H
! @7 R! e3 h0 R/ L# p4 v9 e7 zDL1: MOV R7,#19H7 u% \( a$ S& k3 m" p
DL2: DJNZ R7,DL2
: W3 x: D" i' W+ rDJNZ R6,DL1& g7 N: D1 e9 a* |9 ~* P8 s8 Q% F
RET0 U% g7 h7 k2 s# T' D* n
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象8 r, `' {: s! i, d# s* u
DS20MS: ACALL DISPLAY
3 E$ n# P. B& \4 n P7 n& [5 bACALL DISPLAY
8 n* k( y: y5 L; ], d! l: QACALL DISPLAY
" \& R/ F3 l' ]% x5 w. G9 A3 y# WRET
7 q" e9 O; z, e7 g4 r% ^8 m9 z;延时程序,用作按键时间的长短判定2 m$ S2 g- r# o1 B
DL1S: LCALL DL05S* m2 ~. c9 q2 R8 j7 i F
LCALL DL05S
% O; s3 {$ i' s& w% VRET
5 W' ~+ a# ]$ z) Q- ?9 jDL05S: MOV R3,#20H ;8毫秒*32=0.196秒
( o3 V% b8 h. d: c; ~( bDL05S1: LCALL DISPLAY
- R) {9 ^) B: [) B7 s9 w1 \DJNZ R3,DL05S1
5 F$ V* O- t: u; ~5 g/ ZRET$ _' `, e% C" K ?& `' s6 R
END ;程序结束
- @9 g' |: |5 m+ b0 ?7 h) I" Y0 G# j' y |