51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 / U4 Y( e; }; j5 k
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 2 Z2 ?8 @6 y3 X# u5 U
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
5 b; ~0 a! a; m- X5 m% a 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
. W. f$ Y w5 H) J$ E
0 y4 k+ X% `) O
1 x# ]' c/ g. j# j! g$ R3 f* L% R% U" M* H( t+ |" ^! C4 W8 v
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
( y) I5 I& x: t) g;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 \% _5 _/ l$ q. n2 X;; 中断入口程序 ;; (仅供参考)7 w: E8 a7 q9 M& @- Z2 _: @
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 J( E5 R: `5 A5 A9 `2 z;
+ c8 m6 p7 H1 l3 z/ [& ?" ^$ m( RORG 0000H ;程序执行开始地址
% M8 i% [/ p7 @ z6 `LJMP START ;跳到标号START执行
. ^! ?! t% P2 C NORG 0003H ;外中断0中断程序入口 U$ E: W, `3 j1 u& x5 v( U- j
RETI ;外中断0中断返回$ E8 x& \7 U! M+ _
ORG 000BH ;定时器T0中断程序入口
' }) H0 [! N/ A8 I+ uLJMP INTT0 ;跳至INTTO执行7 n0 E' Z. d8 P% M. E7 p. i
ORG 0013H ;外中断1中断程序入口
& H" w) O5 N+ ^! |3 aRETI ;外中断1中断返回+ e, U- U [, }' D! @
ORG 001BH ;定时器T1中断程序入口& w9 w7 \% _$ s- M" L) Q9 x. \
LJMP INTT1 ;跳至INTT1执行, x: G% ?- d* U
ORG 0023H ;串行中断程序入口地址$ V, ~' N' i. L7 D8 G! [
RETI ;串行中断程序返回
# ^7 y0 y- w* o, l2 s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 b/ E! a* L! f
;; 主 程 序 ;;0 q; V( ~+ l; @0 p1 b# _
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 r3 h1 H" s( S) O;
& _0 g, N0 V. d( M. M$ F- [START: MOV R0,#70H ;清70H-7AH共11个内存单元- I/ O8 m( g- G. A" W3 u
MOV R7,#0BH / P& T$ y* S5 F/ Q, R) f3 h$ p
;clr P3.7 ;, w" h4 a$ c% c& Z& s- L$ ^
CLEARDISP: MOV @R0,#00H ;
( w b8 u0 r, T: [2 B/ `( uINC R0 ;: h) S* U1 T$ Q0 k8 |5 u
DJNZ R7,CLEARDISP ;
2 t& u7 `8 H7 s0 q' WMOV 20H,#00H ;清20H(标志用)% I! b( n9 }5 o7 L/ A
MOV 7AH,#0AH ;放入"熄灭符"数据
1 S- r; e0 z5 k" m3 K9 m% }0 @* NMOV TMOD,#11H ;设T0、T1为16位定时器" E5 W& j" x" J+ c' N" I+ a% A6 x
MOV TL0,#0B0H ;50MS定时初值(T0计时用)3 r( ~* x2 }3 u& |- T" Z+ |
MOV TH0,#3CH ;50MS定时初值0 Y+ H* V0 z! ^+ m" u t" S) C' n
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
$ m2 d: g3 b- |+ SMOV TH1,#3CH ;50MS定时初值
0 H) Q3 r0 v2 V/ Z1 `# k4 ^SETB EA ;总中断开放
5 I* ~$ R) z3 y( b) N5 MSETB ET0 ;答应T0中断0 x( L0 V% _, Y
SETB TR0 ;开启T0定时器
& v7 P6 E7 b1 {1 CMOV R4,#14H ;1秒定时用初值(50MS×20)9 T/ a# J' U8 ^$ A' W* D, p7 K
START1: LCALL DISPLAY ;调用显示子程序- H S1 W3 b1 \+ y& d% x/ ^
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序 * v. N9 j2 Z0 R6 k
SJMP START1 ;P3.7口为1时跳回START18 S. ?, K% ^7 \( G0 ?2 g
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
) `1 g- N) y+ t, @$ o: \; o4 P" M& D8 H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
" d# p: ]. z P7 ^8 n( z4 ?- [;; 1秒计时程序 ;;
% k( x3 ^$ l9 l1 U! k;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; _. C, h* M2 C, n9 `;T0中断服务程序
+ _. j) s) v. U% }3 y/ y3 NINTT0: PUSH ACC ;累加器入栈保护% o5 U; E: r; K
PUSH PSW ;状态字入栈保护
( N+ L# z9 K! {5 U+ J& n5 u! MCLR ET0 ;关T0中断答应
% k2 B3 @4 C) ?CLR TR0 ;封闭定时器T0! H2 ^. _* y: v. @$ G
MOV A,#0B7H ;中断响应时间同步修正
& q n; r3 S1 @4 y9 F8 LADD A,TL0 ;低8位初值修正
$ m0 c+ g: x" \1 M) J: C5 ^MOV TL0,A ;重装初值(低8位修正值)
. O% @1 P8 o" z. VMOV A,#3CH ;高8位初值修正
" g- w, e( W. A7 {% N/ LADDC A,TH0 ;
! h/ x! h4 e$ {- W8 iMOV TH0,A ;重装初值(高8位修正值)) T2 M- H1 k M( S; _
SETB TR0 ;开启定时器T0
, K$ T' A8 D! _, h: xDJNZ R4, OUTT0 ;20次中断未到中断退出4 b5 z( \- E& N2 o3 ]4 g
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
/ k- d9 ~4 \8 I( {0 y; gMOV R0,#71H ;指向秒计时单元(71H-72H)
7 ? |7 k1 s& F1 B2 Z- ~4 W4 ~0 kACALL ADD1 ;调用加1程序(加1秒操作)4 u4 M: |. K- w- D& x4 l* I/ X9 ?
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合). W3 m+ w6 I" q3 c1 i
CLR C ;清进位标志
, e1 T3 N; ?/ y8 o# Z2 L$ ^9 QCJNE A,#60H,ADDMM ;
/ ^; f0 Y% U; m) E, b! GADDMM: JC OUTT0 ;小于60秒时中断退出: ~, G/ j5 v- D9 X4 ^9 |
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0
; c% r- G$ E! v/ j9 BMOV R0,#77H ;指向分计时单元(76H-77H)( G$ J$ v5 M) I' i
ACALL ADD1 ;分计时单元加1分钟8 u$ m' X/ |4 `* {3 ^; F( g
MOV A,R3 ;分数据放入A
, O% l( E" `; Y' Z( B! d- l2 a LCLR C ;清进位标志+ V5 l' I( n) N! O( ?1 l9 F4 q
CJNE A,#60H,ADDHH ;3 O1 h! l: n! Y& a
ADDHH: JC OUTT0 ;小于60分时中断退出( j0 ^5 J# M6 |' u) {
ACALL CLR0 ;大于或即是60分时分计时单元清0
" K, j& X1 ?. N+ |2 JMOV R0,#79H ;指向小时计时单(78H-79H)
- Y* C7 {, [: KACALL ADD1 ;小时计时单元加1小时
1 C" H8 g% m9 q: p* F# ^/ h" BMOV A,R3 ;时数据放入A
7 ^3 ~9 {( c6 @, x$ o' |9 HCLR C ;清进位标志
7 T! }0 y- [# j2 PCJNE A,#24H,HOUR ;
( T/ U$ E8 M$ R9 n: k3 THOUR: JC OUTT0 ;小于24小时中断退出
# y, m5 i1 k% B+ P$ e& U1 [ACALL CLR0 ;大于或即是24小时小时计时单元清0
- f% N& A( K8 k4 @8 r9 X& `OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
( o# }# x3 \+ F& [9 `" IMOV 73H,77H ;入对应显示单元
& l' y _( H# eMOV 74H,78H ;
: u. E* Z1 U4 X ~6 J+ o) zMOV 75H,79H ;6 T2 o0 G; ]) _6 q0 F. e, W9 h
POP PSW ;恢复状态字(出栈)
% V' z e! }* Y" x6 r4 kPOP ACC ;恢复累加器
3 @6 v" N' r0 k2 [. {+ m4 WSETB ET0 ;开放T0中断4 y) B! |% w/ A6 Y( g7 \& s
RETI ;中断返回
5 E8 e7 M. ? ^" _3 {% d% d;, ]3 C. w3 F' E) e1 d
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, R2 M2 [% x4 A$ M- K2 v
;; 闪动调时 程 序 ;;4 H$ a" W" r( ~1 z1 K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 j0 t1 u% U) Z;T1中断服务程序,用作时间调整时调整单元闪烁指示
. I9 N( [+ r9 N& q UINTT1: PUSH ACC ;中断现场保护
+ |: j2 y$ s# o8 x2 D! BPUSH PSW ;; c; ^% p, |- x& {1 J, u+ T
MOV TL1, #0B0H ;装定时器T1定时初值$ K }7 D: C5 e' v/ |0 j+ L
MOV TH1, #3CH ;: Z: A" _1 x4 ]9 g" |
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)" B n' n8 `; l2 t# s9 r
MOV R2,#06H ;重装0.3秒定时用初值1 j% G% q" e- m
CPL 02H ;0.3秒定时到对闪烁标志取反6 E" u* _& r6 [ s1 m4 v
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"4 X" y0 s$ J# z1 M7 F
MOV 72H,76H ;02H位为0时正常显示, k9 W5 H% w: B1 s7 G1 ~
MOV 73H,77H ;8 }( y% J* f$ r; l1 h/ y" |
MOV 74H,78H ;+ \ t/ I& b! k' C! y8 ?
MOV 75H,79H ;$ p u9 X/ O2 K. }( W
INTT1OUT: POP PSW ;恢复现场
4 U b/ P* ?& I5 K! w' g @POP ACC ;1 a( Y, W/ c* |: E0 Q. ?0 e' @
RETI ;中断退出) ]* }/ m' g1 Y9 O$ B' y
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制8 R, J7 b6 k' b
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
% d4 k$ |* m6 LMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据. [( R! W. ?' R, [
MOV 74H,78H ;/ T) G. }8 G* \) D$ }( l; k
MOV 75H,79H ;
1 W5 O8 b* ^% O9 w) fAJMP INTT1OUT ;转中断退出
; T. v: `2 x, m% i9 P0 @6 |FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
/ W0 a! o. Z7 Z' a4 ZMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示) M/ o7 G4 [% `1 v6 x$ y6 [* O0 e! Q
MOV 74H,7AH ;
3 X* C& _6 X! \# w8 b; ~MOV 75H,7AH ;
6 Q4 H8 o0 w$ z0 IAJMP INTT1OUT ;转中断退出
2 @( _6 m" m R7 u: g& J+ b;* {5 V3 ]" b3 ^7 u" q/ Z
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
& U K$ D3 M' g7 k/ V: t Z;; 加1子 程 序 ;;
0 ?, Y! R7 V' L* M;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ c1 E! P0 Y6 L3 k |- e0 s* e;
. q* O* O$ |' O3 E; X9 V3 |& mADD1: MOV A,@R0 ;取当前计时单元数据到A
4 f+ j& `3 p! u O" T9 `5 DDEC R0 ;指向前一地址4 ^. W ~( J5 a/ y
SWAP A ;A中数据高四位与低四位交换
+ o% p0 W- h3 p- r' H* cORL A,@R0 ;前一地址中数据放入A中低四位
, g2 n; J2 \9 } w8 z7 f W/ hADD A,#01H ;A加1操作8 I1 F! l- H! G: h: d
DA A ;十进制调整3 G5 F. B! x5 D5 W
MOV R3,A ;移入R3寄存器, u4 h6 M/ g1 v; B8 o
ANL A,#0FH ;高四位变09 ~$ e: \6 L. t+ j
MOV @R0,A ;放回前一地址单元9 R- k7 K0 A" x( Y( `
MOV A,R3 ;取回R3中暂存数据8 v4 R+ f6 |' O0 a# \7 o3 Y$ |
INC R0 ;指向当前地址单元
% ?6 V: C+ [, b% r. NSWAP A ;A中数据高四位与低四位交换
- O: |1 j# i' Q# R4 g5 ?8 PANL A,#0FH ;高四位变0
8 i$ [' ]+ [# w7 T8 e7 D) WMOV @R0,A ;数据放入当削地址单元中2 a: Q# }1 P0 [' _
RET ;子程序返回
- g! f- a E: ~7 B;8 g) J" B. g8 B) N
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
% _ K3 _0 E# s0 [;; 清零程序 ;;7 [3 m$ O$ y: T, F, F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ K: t- @- U1 b y! t# O;.............
& L; g8 d" L# O; a5 C/ Y( z6 y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, u/ j( v& X" V. H/ n
;; 时钟调整程序 ;;; k" ~) V* ^/ r# i3 b$ p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- Z1 s7 J7 M& z& Q;当调时按键按下时进入此程序' ~" F' F$ w) N# ~$ ]6 |) x4 Z$ ?
SETMM: cLR ET0 ;关定时器T0中断" |. R0 z) c, ^" s6 w
CLR TR0 ;封闭定时器T0+ k% L3 T! c, P: H0 f
LCALL DL1S ;调用1秒延时程序
; q! r0 J4 \, J6 A0 N& tJB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)) o3 l) P3 q7 t: x2 R3 J8 m" N/ q
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
7 E- F) H) c8 |& x, s9 s5 LSETB ET1 ;答应T1中断
% `! Y' l1 m) ^6 c0 P( ~8 LSETB TR1 ;开启定时器T1
" x! h6 t/ p8 V0 t: ^7 ZSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待
' j6 b# B3 ^) f, R/ ?SETB 00H ;键开释,分调整闪烁标志置1
3 ?* k9 t: i$ Y; {) X! f( fSET4: JB P3.7,SET3 ;等待键按下
9 X" q) V4 e+ D4 [' j, `LCALL DL05S ;有键按下,延时0.5秒4 k" t' `3 i. B% O
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
8 r$ a% c. I& W9 V2 E7 O- MMOV R0,#77H ;按下时间小于0.5秒加1分钟操作- r4 W# ?" j/ {1 R& ^# ?
LCALL ADD1 ;调用加1子程序3 ?3 v2 E% U2 G
MOV A,R3 ;取调整单元数据
% f9 P1 b2 n4 x, x: k3 NCLR C ;清进位标志 _3 m$ ?; M8 Q; T
CJNE A,#60H,HHH ;调整单元数据与60比较
; l5 C2 R' W; t: jHHH: JC SET4 ;调整单元数据小于60转SET4循环
5 A" c, Z! a. t1 {2 w! wLCALL CLR0 ;调整单元数据大于或即是60时清05 ^3 w0 \5 \% a5 L, [2 [
CLR C ;清进位标志
% A4 e" L. e3 D }; eAJMP SET4 ;跳转到SET4循环
: r+ l8 S7 |- [8 z1 p, j# bCLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
2 J# n( [; G, BSETB TR0 ;开启T0定时器(开时钟)
' O/ @5 k5 V+ w3 K( FCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
2 v# J; h# c' L# X- k% ULCALL DISPLAY ;有键按下,调显示子程序延时削抖; \6 b3 H# e* O, f1 h7 ]
JB P3.7,CLOSE ;是干扰返回CLOSE等待; y( {4 p a4 T5 Z! r: T
WAITH: JNB P3.7,WAITH ;等待键开释
3 G! l& W! o: u+ s2 T Y1 D! {LJMP START1 ;返回主程序(LED数据显示亮)( D! e% T+ a! [' d
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
; V" a! i. t$ XSETHH1: JNB P3.7,SET5 ;等待键开释* P% i! w/ R# c3 O+ w$ B2 W4 |
SETB 01H ;小时调整标志置1& S7 v, S, H: }4 Y+ f
SET6: JB P3.7,SET7 ;等待按键按下
+ L8 }9 i$ `* D y0 X6 m* b0 sLCALL DL05S ;有键按下延时0.5秒, ^. A2 y( R& x1 Q4 f- y& Y% T, C
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
4 _6 L4 N4 F! N- RMOV R0,#79H ;按下时间小于0.5秒加1小时操作) w! P* H" C$ O0 K
LCALL ADD1 ;调加1子程序
5 i0 G' L2 k( b g qMOV A,R3 ;& ~2 L* y" g- n, A6 i: [
CLR C ;
" x& w8 Y# E0 S7 zCJNE A,#24H,HOUU ;计时单元数据与24比较
; N7 z7 y! V$ A* Y0 t: JHOUU: JC SET6 ;小于24转SET6循环
% ?* d, @, {6 J1 z& ^ qLCALL CLR0 ;大于或即是24时清0操作
+ _8 M+ o# N' N- K: j7 @AJMP SET6 ;跳转到SET6循环
% q% S& y/ D) v l3 {2 H1 oSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释; W* l- }) b0 }! \
LCALL DISPLAY ;延时削抖
" b1 Z6 m! V) C+ WJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
# f7 D" o/ |" ?/ Z0 ECLR 01H ;清调小时标志
4 [- c/ J8 ~$ ?7 b& D: fCLR 00H ;清调分标志# A% n% T }- r( k3 S. N
CLR 02H ;清闪烁标志
: s% d" O) S5 C& F3 V3 SCLR TR1 ;封闭定时器T1% J1 K% b: U. ?" X; C
CLR ET1 ;关定时器T1中断
2 N, C2 L! j0 K( @; ?3 P+ X% n% DSETB TR0 ;开启定时器T05 A7 S2 Y( I. J/ u/ s( @& n
SETB ET0 ;开定时器T0中断(计时开始)
2 }( c8 z! e& d; w$ o# G# p# ^& O5 _LJMP START1 ;跳回主程序 y( P0 J! o, f; k
SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
* x% X8 a% `5 ]2 X# CAJMP SET2 ;防止键按下时无时钟显示$ G4 }, H3 U4 x5 P2 g3 g, G
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用2 O7 D3 q) _$ H X% q% B* S- g
AJMP SET4
' z+ y% `: V. N4 G' D: hSET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
8 x8 ]+ D6 C: _. `$ @AJMP SETHH1 ;防止键按下时无时钟显示% K# n% q" j/ Z2 e; \ {
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用9 ?4 G2 \- @+ o/ n8 k. B
AJMP SET6
% P/ {( S3 n0 n- q& _' mSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
1 b! b1 g9 B+ O, m* @6 M( \6 [AJMP SETOUT ;防止键按下时无时钟显示: c# z# w' @4 G' q# a. r* p
;
0 q' i0 E7 f- M$ e+ s9 a+ C' F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ q) j7 G9 @* t2 y6 L;; 显示程序 ;;3 d! `& C3 C2 r
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2 z `! U. L2 C( J
$$$$$$$$$$$$$$$$$$$$$$$$$$$
" b: F+ t% i* R r;1MS延时程序,LED显示程序用4 \& I/ a: p/ f
DL1MS: MOV R6,#14H
/ R- r; C" i6 p1 aDL1: MOV R7,#19H5 N% {- d' b# S5 Y. p) f
DL2: DJNZ R7,DL2, _/ u+ }: t' n. ^
DJNZ R6,DL1' D% l3 T' z8 {6 u7 R6 m
RET
- ]# f) ^4 e4 D' W3 g;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象; f3 K" Z+ H+ o% V0 F# ^
DS20MS: ACALL DISPLAY0 ^9 Y7 p7 s6 M4 D! a- A- \
ACALL DISPLAY
! U5 `3 l+ Y9 ^& C" ~5 |; k" iACALL DISPLAY
3 Z5 s. K- N. A% a6 \9 CRET
2 E4 w( y" c. C$ c6 ~% }5 F;延时程序,用作按键时间的长短判定) E! R" c' Z7 x# R, G6 h3 S( t O: b2 q
DL1S: LCALL DL05S6 t L5 l2 }, X" s4 B
LCALL DL05S
1 Q4 L) ]. C# A3 e" qRET
+ F [3 @: }9 H+ p. L) d/ M" a, L* IDL05S: MOV R3,#20H ;8毫秒*32=0.196秒
" f7 i5 m! w1 p7 eDL05S1: LCALL DISPLAY4 I" U& F9 \2 ]
DJNZ R3,DL05S1
- g' p* ~/ r/ Y6 ^RET
9 {0 M1 k. l: t7 O) X9 ~END ;程序结束
: u4 S2 b: c7 U k) [, c) Z! R |