51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。
8 k, U" T! ^9 \1 y! T9 }3 F 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 ' }: H# y2 o! R. T
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 3 b% a- Z* F9 H2 R; T
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。 4 ~4 R# Z! H# a0 ^9 p
# o- D4 Y: Q K0 q0 \6 U
& G* N; \, B, I+ V+ o
* ~& u+ I0 l( B7 e* ]8 J. g
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。% Z6 |5 Z* k2 S& n
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 p) z1 V r8 k& ]2 c* p3 e$ q6 y;; 中断入口程序 ;; (仅供参考)+ ^2 v( _& y, V) j. w3 m
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 |/ ]/ h' K2 J% }6 }( [* X;
# N) s2 M1 h% e1 [5 XORG 0000H ;程序执行开始地址: _2 U; q) k+ k: z _
LJMP START ;跳到标号START执行
7 b. q, u% s5 @5 Y$ u' FORG 0003H ;外中断0中断程序入口
; y3 g0 ^ M kRETI ;外中断0中断返回
6 W8 b" c4 n" DORG 000BH ;定时器T0中断程序入口* D8 @7 H( m9 r
LJMP INTT0 ;跳至INTTO执行
7 N. F+ f* M9 F4 g9 \5 @2 QORG 0013H ;外中断1中断程序入口
& Z, S- ~; E, n4 V; `* |. c) W# N" zRETI ;外中断1中断返回
" N2 o4 ~: d I8 C5 e* Q( A9 U* lORG 001BH ;定时器T1中断程序入口
( ?; s8 \' |0 K. X/ L$ F: wLJMP INTT1 ;跳至INTT1执行) U. [' }+ |4 Z3 ^3 @7 H
ORG 0023H ;串行中断程序入口地址
6 M% ~' {' y- hRETI ;串行中断程序返回
[& M" R. V1 f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. w% g, v" H: \& Q;; 主 程 序 ;;* O) y* u k, z3 H# i6 e$ k6 Q& i
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ~ v/ M( f, W m* x;' ^! T0 e) i6 \) J/ ^' Y) X
START: MOV R0,#70H ;清70H-7AH共11个内存单元
" J- D. @3 I9 b5 JMOV R7,#0BH 7 k3 I c( k1 P4 `8 h8 \8 ~( S
;clr P3.7 ;
6 _" B2 X( [! y/ dCLEARDISP: MOV @R0,#00H ;& Z8 o& c6 \* s9 z, h; Z
INC R0 ;
2 J8 `% e% s. [( q& VDJNZ R7,CLEARDISP ;$ C7 P2 D _9 m8 c1 a2 p% Q1 `
MOV 20H,#00H ;清20H(标志用)
$ e: y( V1 s' {* m. ^MOV 7AH,#0AH ;放入"熄灭符"数据( Z- H2 I+ o* |% P+ ~
MOV TMOD,#11H ;设T0、T1为16位定时器
/ Q( j$ a* S z* ^2 O1 |5 u: K/ lMOV TL0,#0B0H ;50MS定时初值(T0计时用)4 D/ m1 @: C5 e9 q0 b
MOV TH0,#3CH ;50MS定时初值
8 Z! M/ ]% `: u( M; {8 kMOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
1 l, x: r% X' i3 LMOV TH1,#3CH ;50MS定时初值
8 _! f0 y# d3 q5 h: d5 Z7 @SETB EA ;总中断开放" @9 \( o4 B! g0 v! Y+ w
SETB ET0 ;答应T0中断
9 U) T; S* O6 {SETB TR0 ;开启T0定时器
& m) z$ R/ _0 b. f0 ^. s" l% }MOV R4,#14H ;1秒定时用初值(50MS×20)
: U; R" r: F8 A1 v" n mSTART1: LCALL DISPLAY ;调用显示子程序* [% g, |. t4 e
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
9 d9 ]5 i$ {6 `/ I7 F+ TSJMP START1 ;P3.7口为1时跳回START1
# ~* `4 T$ s7 F0 RSETMM1: LJMP SETMM ;转到时间调整程序SETMM% U; _/ q0 `0 D j/ N
;
9 s$ O2 S1 a- }' s" I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 O; p m6 U* g) m' N;; 1秒计时程序 ;;
8 |/ k( W$ i9 p2 [, B! V L( m;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4 v( m4 K$ n0 Y/ G" Y# t) ?
;T0中断服务程序1 N% L: ]( E: n- S2 K2 p# j
INTT0: PUSH ACC ;累加器入栈保护2 f% I* s( S$ }! B
PUSH PSW ;状态字入栈保护
7 u, `& b& S! NCLR ET0 ;关T0中断答应
: [, f# ?) P% gCLR TR0 ;封闭定时器T0
8 o8 V" h; Q9 e1 ~7 EMOV A,#0B7H ;中断响应时间同步修正
2 j$ N! f& o) Y/ pADD A,TL0 ;低8位初值修正7 K- T# `8 b: ^, o' L& L# U6 M
MOV TL0,A ;重装初值(低8位修正值)
0 Z! l5 b5 ~! n8 g" XMOV A,#3CH ;高8位初值修正
% H( j4 \. {/ Y( AADDC A,TH0 ;7 D9 h; Z& K! V) `' [$ Z" g
MOV TH0,A ;重装初值(高8位修正值)$ \" i: P# q% f; w2 G" w) S
SETB TR0 ;开启定时器T03 B: w! P2 l$ ^
DJNZ R4, OUTT0 ;20次中断未到中断退出
, E% h9 e' N @% O6 v1 kADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
( `. i; Z {1 v) IMOV R0,#71H ;指向秒计时单元(71H-72H)
/ m. @, k, w8 h7 @# p. v. PACALL ADD1 ;调用加1程序(加1秒操作)+ O/ R0 B1 g9 D! g u5 E
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)4 O' Y2 r1 `8 U& L
CLR C ;清进位标志0 G5 e d* y/ [* Y( Y+ i q- }4 k
CJNE A,#60H,ADDMM ;
0 |5 U/ m( u. p9 Z4 h MADDMM: JC OUTT0 ;小于60秒时中断退出2 p( [# c6 Q3 e: B( v
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0
- A9 U! p) l. a% AMOV R0,#77H ;指向分计时单元(76H-77H)
& V6 I) L4 a0 @- D( P2 nACALL ADD1 ;分计时单元加1分钟
: l0 C2 p' ]8 n& t" b/ @3 eMOV A,R3 ;分数据放入A
+ p% ^: ~0 h$ hCLR C ;清进位标志
0 O& w6 t% q1 D7 H" uCJNE A,#60H,ADDHH ;
7 F& D4 {3 H9 r5 t, a4 w" s$ r; UADDHH: JC OUTT0 ;小于60分时中断退出
2 F5 z( A1 w4 Q3 @8 K8 wACALL CLR0 ;大于或即是60分时分计时单元清0
- x0 z0 O, a, f& o" G4 r5 J4 O/ WMOV R0,#79H ;指向小时计时单(78H-79H)0 g$ x9 E8 o0 k/ t: Q0 o9 w
ACALL ADD1 ;小时计时单元加1小时+ w; W2 r: R" [$ f8 y" b
MOV A,R3 ;时数据放入A
, H/ T1 Y1 d0 K T# fCLR C ;清进位标志+ }/ b& N/ J. ^" U
CJNE A,#24H,HOUR ;
~! u) o# q# dHOUR: JC OUTT0 ;小于24小时中断退出
( k+ ?9 Q& w5 K% X/ AACALL CLR0 ;大于或即是24小时小时计时单元清0
* |7 y( G' E4 l; ]OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
5 H3 @3 Y5 c9 F# |' P% W XMOV 73H,77H ;入对应显示单元
b5 w; g: k) w$ m- M9 \+ \MOV 74H,78H ;3 F4 O* c: D5 v3 k4 n
MOV 75H,79H ;. K9 m3 C" Q$ [
POP PSW ;恢复状态字(出栈)
! \- L* x0 t" x0 G4 O; JPOP ACC ;恢复累加器
1 }: l3 L' \) n0 pSETB ET0 ;开放T0中断 r' s% V9 l. C/ H1 Y% }* R$ W
RETI ;中断返回* G% T4 H( e3 p5 l! k9 F; { D
;. }8 f% ^& b1 _' h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
& D! w$ S7 |3 ?1 r- D;; 闪动调时 程 序 ;;( t9 M6 k, S! H' n/ |9 ^" \# s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;- N; B# x( W; {& ]/ g
;T1中断服务程序,用作时间调整时调整单元闪烁指示- ~1 d( l. x0 ^2 ~9 z* H; | @
INTT1: PUSH ACC ;中断现场保护
+ O& W- o. q8 m* R+ C$ Q. Z4 p$ {PUSH PSW ;& j7 w& i; W H. Y
MOV TL1, #0B0H ;装定时器T1定时初值
- o9 b; P2 g% @+ M. U/ r; mMOV TH1, #3CH ;
7 j9 D2 }, ?( \0 ?. \+ HDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
3 x! p0 P' L; z! x: g3 s0 V y1 bMOV R2,#06H ;重装0.3秒定时用初值4 A* L/ Y/ S% ^4 _5 k; g9 m o: g
CPL 02H ;0.3秒定时到对闪烁标志取反$ t! u9 ~& s8 s( j
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"' B6 R7 t) P9 w# d* k, @, o) a0 }0 f$ @
MOV 72H,76H ;02H位为0时正常显示
# {( y; d0 Q2 Q5 GMOV 73H,77H ;
3 F* D* Z& b8 V! tMOV 74H,78H ;
2 \: v, y$ y4 PMOV 75H,79H ;+ e* k: ]" R* O4 L$ A$ T x+ c
INTT1OUT: POP PSW ;恢复现场
" z* I1 [ \0 J3 |; a6 vPOP ACC ;
5 N5 {0 T% h* P1 ERETI ;中断退出5 Y3 l4 q. \* W0 y3 |
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
& e+ H. N$ p) D3 pMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
5 ^/ a! N) O5 s' f2 lMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据% p: K; J/ S5 d
MOV 74H,78H ;, `& r& y9 c3 w
MOV 75H,79H ;% b" W3 q. E, a. ]$ s q
AJMP INTT1OUT ;转中断退出2 K( k" A' ~$ b3 F$ Q; e. b7 A
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
j9 d' w3 D) z4 s, b. dMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示& y0 n. |8 E8 A" Y
MOV 74H,7AH ;9 I: O [7 p5 ]% o0 {5 `
MOV 75H,7AH ;
9 K: d2 e+ Z* Y" XAJMP INTT1OUT ;转中断退出
' a( l+ W! u W2 Q;
8 S- z/ O/ B" y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: H4 g7 N4 ~% b8 n
;; 加1子 程 序 ;;+ r% x) m8 P/ U% Q/ D! e) G* n
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: J8 e! g1 T, t8 n! `( S9 h
;
' X( e2 H6 a7 H5 O. _ADD1: MOV A,@R0 ;取当前计时单元数据到A
6 n6 {9 f1 m, T0 X5 G" N9 G# GDEC R0 ;指向前一地址( Q4 o: f$ t( c4 x- D
SWAP A ;A中数据高四位与低四位交换/ n# R' n# x7 d7 b9 o# g4 G( g1 ]
ORL A,@R0 ;前一地址中数据放入A中低四位
) u2 H$ k. U9 U2 l1 eADD A,#01H ;A加1操作% C' [2 C+ D0 t" |8 v7 l( @& B
DA A ;十进制调整
' n+ W$ `; {& x/ D* bMOV R3,A ;移入R3寄存器3 t. p: \, c, {& L- e! U( M2 c
ANL A,#0FH ;高四位变0
% a2 G9 ?6 T0 m% A" s: s5 BMOV @R0,A ;放回前一地址单元
; Y* p8 e* O$ k# d, x* JMOV A,R3 ;取回R3中暂存数据
6 I( F8 k# t! h# I7 TINC R0 ;指向当前地址单元
/ Z/ V L4 E& sSWAP A ;A中数据高四位与低四位交换
/ G( r) O' v: \, }( D V: iANL A,#0FH ;高四位变0
' O" y7 k$ d& ?/ R# O7 k/ M6 TMOV @R0,A ;数据放入当削地址单元中
9 i5 K2 G6 u# B V( |' W, rRET ;子程序返回5 w/ L' X# m3 z5 @
;, k' F$ d/ x4 `2 c* [# i% `
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/ n: n8 @; l' ?
;; 清零程序 ;;6 h/ }: P/ A9 L: S& X% t
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4 F- j1 E! Q3 f+ t5 A
;.............
" u, q' w1 Z# N0 B: t* ?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" {# l5 z; c( B0 i8 I% r9 e
;; 时钟调整程序 ;;
: x! `5 E$ t6 J( o- w2 A$ J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: `. {" Q6 v1 q8 [/ l6 k7 t
;当调时按键按下时进入此程序
! b' E2 @6 i9 G9 R. z. sSETMM: cLR ET0 ;关定时器T0中断: H1 a/ j& V2 D4 P- }4 Z M" t
CLR TR0 ;封闭定时器T04 \# R& R! ~6 V# W5 {. z7 B
LCALL DL1S ;调用1秒延时程序! M" y: C% R' r2 g( G" H
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)- l6 U8 p" t) x+ p
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
/ D J9 ^% ?; ]4 k- `SETB ET1 ;答应T1中断
' ~6 I+ h+ P7 r& n9 [# PSETB TR1 ;开启定时器T1# ^% G2 E j, Q( b6 U
SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待# x% |9 E0 q3 G8 h. _
SETB 00H ;键开释,分调整闪烁标志置1$ @- s* `+ ~+ U/ Q8 o, G) ^
SET4: JB P3.7,SET3 ;等待键按下
4 w; c0 M k8 ~; i$ q. D: hLCALL DL05S ;有键按下,延时0.5秒
# t, z1 l( [6 A) F. hJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
& [! X6 K+ y: C/ l: c; dMOV R0,#77H ;按下时间小于0.5秒加1分钟操作
' c# I S6 r3 E z" OLCALL ADD1 ;调用加1子程序
# d$ Y4 |0 Z9 e( x- M: n/ _# r7 K1 @MOV A,R3 ;取调整单元数据
$ _. l# `' V( G0 f* P5 k3 K4 O5 y; cCLR C ;清进位标志
3 J X( N( u8 u' p" lCJNE A,#60H,HHH ;调整单元数据与60比较+ N( `3 B0 v- N3 \" L9 v0 n
HHH: JC SET4 ;调整单元数据小于60转SET4循环
. I1 J- q, j9 z$ G4 O( VLCALL CLR0 ;调整单元数据大于或即是60时清0. N" V) u1 d# D& N6 Z
CLR C ;清进位标志
u7 A3 y* J5 y, s- K" [1 SAJMP SET4 ;跳转到SET4循环; M/ O; m, }! |; y8 n
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断% B! Q0 v! y9 D
SETB TR0 ;开启T0定时器(开时钟)
2 A1 V0 p7 p5 s( w& b+ N# X! dCLOSE: JB P3.7,CLOSE ;无按键按下,等待。1 _+ Z9 r7 M7 Y3 f/ p
LCALL DISPLAY ;有键按下,调显示子程序延时削抖/ h' q7 `8 v7 V" t0 b& `
JB P3.7,CLOSE ;是干扰返回CLOSE等待
( E6 m i9 n( M DWAITH: JNB P3.7,WAITH ;等待键开释- P9 U. U, p7 Y* H, E& X/ y
LJMP START1 ;返回主程序(LED数据显示亮)
6 N/ g" B& [0 y f: f, [SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)# {8 l, k+ w ?7 a
SETHH1: JNB P3.7,SET5 ;等待键开释. @$ ]/ O& i' i
SETB 01H ;小时调整标志置1
' E) M% {6 n# Z- W+ W. vSET6: JB P3.7,SET7 ;等待按键按下$ O4 i* d( p8 ?# V. n% q; I4 m9 E$ Y" F
LCALL DL05S ;有键按下延时0.5秒9 \& n0 b5 H& z/ |! f1 y' a
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
3 w: \$ z, V5 `MOV R0,#79H ;按下时间小于0.5秒加1小时操作" F! H* k0 D, H4 a( U0 ^5 ~8 H
LCALL ADD1 ;调加1子程序
$ v- L4 d- O I! W9 YMOV A,R3 ;
. ~2 U9 z6 G( f5 B9 I4 {' v1 d& g+ vCLR C ;
. r' ]3 G" j( L& zCJNE A,#24H,HOUU ;计时单元数据与24比较; Q! Z, E1 T3 I9 E, z1 T
HOUU: JC SET6 ;小于24转SET6循环7 V% i# ^ h+ O
LCALL CLR0 ;大于或即是24时清0操作
# I) E- O8 u' _8 A, d" S2 M( @8 SAJMP SET6 ;跳转到SET6循环
3 X7 Z* @) t; g8 K, _5 r& kSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释0 l& x' K5 g8 o: B! I
LCALL DISPLAY ;延时削抖
2 J- ~) R* V+ U! ~JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待3 P8 p4 @7 ~( E2 F# [1 c6 W1 p$ ~
CLR 01H ;清调小时标志
; C/ Q, c) D: C) ?2 SCLR 00H ;清调分标志4 M# ?3 o6 X7 k# @
CLR 02H ;清闪烁标志
/ T, ]9 p( f+ `* BCLR TR1 ;封闭定时器T1+ m. q9 m. g4 c n
CLR ET1 ;关定时器T1中断
3 q- F5 h: s8 e0 q% d+ xSETB TR0 ;开启定时器T0
" p" Q# i( Z$ YSETB ET0 ;开定时器T0中断(计时开始)6 h2 e3 ?" q" A6 A% z
LJMP START1 ;跳回主程序
o4 j8 F3 _, u2 GSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
0 A: f' F) _/ ^AJMP SET2 ;防止键按下时无时钟显示
: B# ~& J% e' U) xSET3: LCALL DISPLAY ;等待调分按键时时钟显示用! R O1 K) n- v6 ^9 [0 f2 _9 e7 G
AJMP SET4
8 R+ B8 P% s) P' }9 ySET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)/ Y0 q2 s$ a2 r' A- P, r
AJMP SETHH1 ;防止键按下时无时钟显示4 J4 m% e1 y7 f" ~
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
) _4 w+ T; r9 X6 J. E! ~) LAJMP SET6
* r# a" p1 t: V) n8 t1 WSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
# |' v. j @2 i' z" o0 i6 G& ]; mAJMP SETOUT ;防止键按下时无时钟显示
+ G* L: m+ b3 @+ x;$ c7 q; M* n! s. e7 s' B
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' @( R6 Z( b" H' P7 J ~" w
;; 显示程序 ;;7 `. e7 t; R( q9 k T
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+ E, G1 r* V2 H& W+ E8 e
$$$$$$$$$$$$$$$$$$$$$$$$$$$& u% e! b/ e8 W
;1MS延时程序,LED显示程序用
( u; V. s% [6 s1 C9 V! g! G; U- p; [# ?- MDL1MS: MOV R6,#14H; L1 {5 o/ @" X W/ }6 y) j I1 {
DL1: MOV R7,#19H
2 u6 H p9 A' H+ h3 W; b) |5 JDL2: DJNZ R7,DL2, e( Z- u' F$ x3 f8 V0 D
DJNZ R6,DL1
* f! f7 {+ v4 S! O: iRET
3 u9 A0 @- B- v) e;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
+ u' \1 Y0 t! J8 z8 GDS20MS: ACALL DISPLAY
) ]7 A2 \% e3 l! I$ [' Y3 X2 IACALL DISPLAY, c4 h1 E- i* [0 k' M
ACALL DISPLAY
$ N3 T* l/ i2 M% E4 `. w3 {4 oRET
2 P! X+ W; b+ n;延时程序,用作按键时间的长短判定, H- L: Q5 k( c: b3 ]7 s
DL1S: LCALL DL05S
& W" i0 H% H0 o: G& }/ ]LCALL DL05S( N' Z: i! X2 d8 ^9 Z
RET& l* H* t% S3 `3 `8 y: h5 ^- J2 `
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒3 ?4 s( w" n/ T% _, r- ^
DL05S1: LCALL DISPLAY
3 J$ r# g: K4 \1 y8 A) k" y* K+ C8 eDJNZ R3,DL05S1
: L; q- j- P5 [ j9 q; x6 @RET) a4 {' U& j7 h5 }3 B
END ;程序结束
0 W3 l8 R1 D; g Q) `: W, G0 Q) o |