51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 8 U* }3 P6 `) |& `8 I1 y( H `
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。
! @& L( V; T5 i' g 开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
5 m2 C7 \) l* |, P/ s 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
9 _9 w9 g' B( {8 k5 U: ]7 P& a+ V w. y8 S# _
: J" \! [9 l1 [
4 a5 I% a' R0 b6 O 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。1 a& q0 ] Q: n+ y( B' N( ~( e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" K1 r$ m1 _* b# R; ~
;; 中断入口程序 ;; (仅供参考)1 F) j, G0 k$ |% J+ x. I0 o/ _
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
" y; \, q5 D6 ~& q" S& g1 }- U6 Y$ d1 W;8 k4 T4 ?& ^* b, v
ORG 0000H ;程序执行开始地址* z$ V' D( j2 c3 p# r# `# G
LJMP START ;跳到标号START执行
+ q* {& l+ \- ^! ~7 r" U7 GORG 0003H ;外中断0中断程序入口
8 z3 z. V6 N+ uRETI ;外中断0中断返回
4 C1 H5 D l) H4 C# ^ORG 000BH ;定时器T0中断程序入口1 i5 k3 w! _6 m' G
LJMP INTT0 ;跳至INTTO执行, t! I1 H) ]; {# w! d( I1 k
ORG 0013H ;外中断1中断程序入口
: x3 Z1 z/ F6 Q; s% ERETI ;外中断1中断返回9 s3 l4 x; r' ^ W+ }0 J( h9 [
ORG 001BH ;定时器T1中断程序入口8 U+ ]7 x4 `/ V. u" p, E! c, J# L
LJMP INTT1 ;跳至INTT1执行. O0 B. p" {! Y' w4 h v% p5 V6 u3 A
ORG 0023H ;串行中断程序入口地址& m4 P1 S3 \6 @9 o3 Z, l; Y; D
RETI ;串行中断程序返回0 o; ^9 g: z/ I1 s2 S/ p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+ c O1 \5 Q+ R' j/ f
;; 主 程 序 ;;
; K/ C f9 p p7 U$ V- n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: @1 ?5 J h3 A0 j0 X9 y
;( W, ^8 p3 K% L7 E/ A2 I
START: MOV R0,#70H ;清70H-7AH共11个内存单元 X# Q8 v: X; x6 g
MOV R7,#0BH & I; C; d* [! e# F
;clr P3.7 ;
" w; f2 U7 z* g# b$ MCLEARDISP: MOV @R0,#00H ;9 Q4 u6 R0 E% K) e2 u. p8 ~/ w4 R
INC R0 ;; S% p* I; Z1 i6 n) f: l
DJNZ R7,CLEARDISP ;
7 {$ @" p @2 }; I% b @* u' VMOV 20H,#00H ;清20H(标志用)
3 o: f! x" k r! r- k$ L, CMOV 7AH,#0AH ;放入"熄灭符"数据4 B7 b4 z9 T/ n8 P) z
MOV TMOD,#11H ;设T0、T1为16位定时器) J; r' r+ x# s2 ?' z) H6 \
MOV TL0,#0B0H ;50MS定时初值(T0计时用)2 z1 M& \+ G* \* \
MOV TH0,#3CH ;50MS定时初值+ Y0 x; B. g! C; o! t
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)% ]! N: E% p- z1 |- [# m; t
MOV TH1,#3CH ;50MS定时初值
& x; b0 K2 j- v+ E" qSETB EA ;总中断开放" h$ C7 L0 q, l$ r0 f$ t7 R
SETB ET0 ;答应T0中断
4 R% k' ^1 ?; r5 `! ^8 y& XSETB TR0 ;开启T0定时器$ z3 j4 g1 |1 z* Z4 a" s0 i0 K
MOV R4,#14H ;1秒定时用初值(50MS×20)
" o: d! A) G x6 \% U- DSTART1: LCALL DISPLAY ;调用显示子程序 K# X" q3 v1 x$ d/ X
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
% A2 m/ N5 e- ~5 c0 OSJMP START1 ;P3.7口为1时跳回START15 j0 u' e8 _6 |2 L7 V- D; ? G3 s
SETMM1: LJMP SETMM ;转到时间调整程序SETMM2 Z6 S3 s( L/ t
;
c- \7 f7 @- N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
: o$ Z# x' |( A. |" W. Q3 e;; 1秒计时程序 ;;
3 j, K/ t) J# \0 H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 N# A( J. d$ p8 D: T" C) ` h0 G;T0中断服务程序
( B: j; k$ o& _3 z: H8 m. ]6 D5 yINTT0: PUSH ACC ;累加器入栈保护
9 B( u! ~1 u" bPUSH PSW ;状态字入栈保护2 Y- k s/ i* q0 r3 v* a
CLR ET0 ;关T0中断答应
( I2 y- K1 }; }# g0 JCLR TR0 ;封闭定时器T0; k8 Q. l8 u* |) q9 \
MOV A,#0B7H ;中断响应时间同步修正
/ X+ `9 A n( ]# J9 n! NADD A,TL0 ;低8位初值修正4 X8 i$ D; r$ ~* f; X3 ?+ p
MOV TL0,A ;重装初值(低8位修正值)1 K& `9 }, W3 o2 j' d, G
MOV A,#3CH ;高8位初值修正& y+ f1 ~$ } c* i( v' u0 ]1 O$ K8 a
ADDC A,TH0 ;
% o' Q1 n# r S& MMOV TH0,A ;重装初值(高8位修正值). s* }: C2 K3 P- n/ Q2 w- {9 j
SETB TR0 ;开启定时器T0
, f$ y: U, X, ^DJNZ R4, OUTT0 ;20次中断未到中断退出
3 A. x! E- A9 [6 P! r9 [% XADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
/ }0 A6 a3 A$ w- vMOV R0,#71H ;指向秒计时单元(71H-72H)
) Q3 D/ {0 E' e* j% H2 qACALL ADD1 ;调用加1程序(加1秒操作)
# a4 E9 P* E9 k7 XMOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
" S" |! ?/ z2 A; ~0 N1 U6 R j9 {CLR C ;清进位标志$ Y r e' H3 F+ r" y9 h
CJNE A,#60H,ADDMM ;- q8 j% L K5 k. \- `
ADDMM: JC OUTT0 ;小于60秒时中断退出7 |2 V- b! v, y& H0 k" i
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0
' Z9 o0 ~4 M2 \4 [' TMOV R0,#77H ;指向分计时单元(76H-77H), v% b0 H) ?( G. X
ACALL ADD1 ;分计时单元加1分钟& H& d( |, t2 B' [
MOV A,R3 ;分数据放入A
! C; N% _9 o6 f3 r9 iCLR C ;清进位标志
5 T6 R( s6 E+ N9 j$ T9 g2 wCJNE A,#60H,ADDHH ;
- W" L" c, X. `: E: HADDHH: JC OUTT0 ;小于60分时中断退出
: x# z1 ?0 P) PACALL CLR0 ;大于或即是60分时分计时单元清0
- u I% [; V1 L' lMOV R0,#79H ;指向小时计时单(78H-79H)
, A0 h3 K! f0 j, x5 Y, |ACALL ADD1 ;小时计时单元加1小时1 u) ?9 K0 n1 D1 F1 q, S7 Q: X5 x
MOV A,R3 ;时数据放入A" C5 S: l5 v3 Q1 Z- Q
CLR C ;清进位标志2 ^& A2 P$ _) x6 H8 [. p
CJNE A,#24H,HOUR ;
9 [$ A/ j7 Q; K0 A# g$ dHOUR: JC OUTT0 ;小于24小时中断退出
; q% t9 N5 m. Q: mACALL CLR0 ;大于或即是24小时小时计时单元清0
: N- l# ^7 x. z) i6 e. ^; pOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
5 U% U6 ?; ^7 R0 A8 i; [$ ~MOV 73H,77H ;入对应显示单元) u, K6 r7 x, g" f
MOV 74H,78H ;2 X5 ]8 W9 x! t# m% q) H1 O. S% H
MOV 75H,79H ;
{3 G0 S' {3 K7 u; Q* [4 v5 }POP PSW ;恢复状态字(出栈)
1 X$ P3 k+ [ b9 r( I$ |POP ACC ;恢复累加器2 t+ j1 E8 a- M3 v5 E, j
SETB ET0 ;开放T0中断
9 }8 _. X! G) q' b2 XRETI ;中断返回. w# V3 l, x2 A: Z W4 {. d
;$ _" Y6 b% a! t7 m+ H/ S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ J2 M7 k4 a. F1 g;; 闪动调时 程 序 ;;/ v* F1 E0 H' n0 Y7 r8 V
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 I7 {& ]: d0 P1 T1 Q
;T1中断服务程序,用作时间调整时调整单元闪烁指示
8 r l; B. n/ EINTT1: PUSH ACC ;中断现场保护8 r. Z B5 F7 r4 P) d( S
PUSH PSW ;0 H& `, Z* k c( p) S
MOV TL1, #0B0H ;装定时器T1定时初值2 p! J$ t7 {6 v0 l, H9 o$ q7 z
MOV TH1, #3CH ;
1 i `+ J% d; a- {8 b2 ~DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
* x: E. P# u$ `3 A/ s/ h, n' }4 MMOV R2,#06H ;重装0.3秒定时用初值
2 p: n4 E8 ]0 |' A! [' M3 c( ECPL 02H ;0.3秒定时到对闪烁标志取反
3 v% n2 H1 g6 k( K1 s/ S& V5 s2 O t) gJB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
# ^0 U/ X5 p& U4 YMOV 72H,76H ;02H位为0时正常显示
" d- T' q! {: ^- P& P2 b/ iMOV 73H,77H ;2 g: K" O! j8 m1 n: {( h
MOV 74H,78H ;
6 l6 G+ L L. v: i, OMOV 75H,79H ;! F0 J9 P6 N5 ]
INTT1OUT: POP PSW ;恢复现场
7 P3 N/ E4 T2 p, K) C+ ~POP ACC ;+ ?! q) e+ j* p# g* `
RETI ;中断退出- W' Y4 m' w' P* f& O
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
: _% I" \' ^! y; kMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
6 i6 w* f: d7 d' q, `0 R( LMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据4 l0 S, S [& C. O
MOV 74H,78H ;
+ G: H/ v% P/ y6 h+ V) @5 n( p3 w- IMOV 75H,79H ;: G! |, I1 U$ y1 j5 q
AJMP INTT1OUT ;转中断退出" T' B7 ?" F1 q! R+ n6 l3 T/ k
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
1 k8 o; ^) ` \8 u: u' E; zMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
' Y. U2 x4 g8 OMOV 74H,7AH ;
" A7 j/ R4 W) Q0 \( [4 Q, @/ tMOV 75H,7AH ;
5 \% o$ C- o! C, r) b, F sAJMP INTT1OUT ;转中断退出
3 k$ F0 |, z/ [8 ~, B0 ];( r+ z- \ Q* z. Q; y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 C( f3 S7 L, m# p;; 加1子 程 序 ;;
8 H' C9 `1 P4 N8 X5 @# S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ Z. Z0 { G) e$ M;
; A' E; k' ^! U4 i% ^ADD1: MOV A,@R0 ;取当前计时单元数据到A
; b" X' j q& v( d9 eDEC R0 ;指向前一地址% {# B% e# r; u; h: _% ?
SWAP A ;A中数据高四位与低四位交换- k( w$ Q0 n# r- c' ?, X) j% a! R. s
ORL A,@R0 ;前一地址中数据放入A中低四位6 Q+ O1 }7 \) |- B% f% s4 O+ f
ADD A,#01H ;A加1操作* l! E# \5 _* U$ e: W, J) L8 Z E
DA A ;十进制调整. L. j. j# U% H4 A# o
MOV R3,A ;移入R3寄存器1 ?( [! X% r9 v
ANL A,#0FH ;高四位变0
2 j0 c2 F( B [0 v# _+ Z" qMOV @R0,A ;放回前一地址单元7 |" y$ h' w- G. G) j' u9 l$ A
MOV A,R3 ;取回R3中暂存数据; A! P; K# y, b5 v
INC R0 ;指向当前地址单元
2 }, W0 G5 N2 w% `SWAP A ;A中数据高四位与低四位交换( b8 S0 V& G6 L6 t
ANL A,#0FH ;高四位变0
# p9 W( f& I; @" YMOV @R0,A ;数据放入当削地址单元中5 _: r _2 E+ Q5 M
RET ;子程序返回
9 H$ \. Y* b+ X5 P6 L6 o- ]3 W' u;) Y: p* H0 H7 ]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4 e6 U2 K1 `. f3 P. C! y
;; 清零程序 ;;1 v# F* p+ i M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- [$ u: |2 s4 @# @" \2 r+ d;.............
2 s* _2 W* p5 L* B, S! ?6 o;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. @7 n7 j! D) U9 v+ o' f7 @
;; 时钟调整程序 ;;
& O- E' u& J, Q; F, O: E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; q; W8 {" y0 p# E# M
;当调时按键按下时进入此程序
# _3 r7 h" z* K$ l, b/ _# TSETMM: cLR ET0 ;关定时器T0中断
5 G5 _; z4 A3 Q3 oCLR TR0 ;封闭定时器T0) F% {# C4 S( {1 w& h" n8 z
LCALL DL1S ;调用1秒延时程序* v. P: @6 O" H5 T2 B# }
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)
6 E. @7 H" b# q! q9 [MOV R2,#06H ;进入调时状态,赋闪烁定时初值
4 j, t, Q8 Z X' q4 r C& K% b: P& jSETB ET1 ;答应T1中断
2 l7 s$ a( h7 OSETB TR1 ;开启定时器T1
5 K9 L* p" Z4 T& d9 t9 v" ~1 XSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待
( S& ~! r9 o, C0 m3 gSETB 00H ;键开释,分调整闪烁标志置13 @6 a& f) H; n/ `( C
SET4: JB P3.7,SET3 ;等待键按下1 t( v7 b7 e- e. D$ Z
LCALL DL05S ;有键按下,延时0.5秒- n3 J$ r W9 }% a6 q3 d
JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态5 o$ ]1 D# v) Y: K' u
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作; I- r" J( |4 x9 P, ?+ @# I
LCALL ADD1 ;调用加1子程序# V Q) Y( [& O$ M3 Q
MOV A,R3 ;取调整单元数据! i& Q3 W. C5 v" z- J( I! ^
CLR C ;清进位标志
# a O+ U- ?0 x% `& sCJNE A,#60H,HHH ;调整单元数据与60比较; w3 n4 F( [6 \4 U* l4 ?
HHH: JC SET4 ;调整单元数据小于60转SET4循环
( ]6 K: X9 O4 \5 c3 m6 z) v/ h' ~LCALL CLR0 ;调整单元数据大于或即是60时清0
3 q/ \, e2 s) S9 cCLR C ;清进位标志* _: h6 i5 R& j+ Z' n
AJMP SET4 ;跳转到SET4循环: X' G% x( j( l2 h# E5 }
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断6 P; A) h/ r9 K, f# O: F
SETB TR0 ;开启T0定时器(开时钟)7 E2 \/ h+ B9 i7 p1 J
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。& |: P' U! p1 y
LCALL DISPLAY ;有键按下,调显示子程序延时削抖
1 p* @% d( b' O. `1 x! l- yJB P3.7,CLOSE ;是干扰返回CLOSE等待$ V. W; ?$ Y! {# v, O$ J0 S
WAITH: JNB P3.7,WAITH ;等待键开释% l6 T3 m+ P9 ]/ h0 ~
LJMP START1 ;返回主程序(LED数据显示亮): Y# m- Y9 ]8 ]0 U/ X
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
2 ~ t8 g5 c7 V; G7 O* E2 RSETHH1: JNB P3.7,SET5 ;等待键开释
/ }, B. g- C. i% DSETB 01H ;小时调整标志置1
( k7 U4 Y& z3 m1 E) {- f3 ZSET6: JB P3.7,SET7 ;等待按键按下
6 W: d& ~' S. c6 O3 b0 `, j/ RLCALL DL05S ;有键按下延时0.5秒( i" |7 e, D0 F
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整: V+ |, Z( G7 E- E `
MOV R0,#79H ;按下时间小于0.5秒加1小时操作 o6 t$ W' M" o! s; a1 s, U
LCALL ADD1 ;调加1子程序# `7 C; m* Q- h/ v* F) R
MOV A,R3 ;# x0 P8 t. E7 `
CLR C ;
+ Q; c. K# J/ o; f: eCJNE A,#24H,HOUU ;计时单元数据与24比较
$ x* g+ g) @; Q3 cHOUU: JC SET6 ;小于24转SET6循环
( O5 S. o6 o) z6 d4 D& OLCALL CLR0 ;大于或即是24时清0操作
& B( U, \ q9 L- c/ C+ eAJMP SET6 ;跳转到SET6循环% o0 u9 G/ X% @& d
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释2 z% Y) B& I L' I Z4 S
LCALL DISPLAY ;延时削抖 D9 c. C/ V* j5 g/ V! E- _) r
JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
* x$ E; m6 o+ a1 Z& ACLR 01H ;清调小时标志2 T, a* [4 d3 v; J
CLR 00H ;清调分标志
3 V. g2 Z( G! u) cCLR 02H ;清闪烁标志
5 W0 s" C- z. @& X' VCLR TR1 ;封闭定时器T1. b5 T+ g3 A2 V
CLR ET1 ;关定时器T1中断8 L) ^ `( d+ `& @
SETB TR0 ;开启定时器T0
# `0 m9 [' I8 T; cSETB ET0 ;开定时器T0中断(计时开始)1 l/ }7 F3 F" N/ E& i
LJMP START1 ;跳回主程序
9 n6 H& H( Z1 b' dSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)( ~4 X6 e, g$ f
AJMP SET2 ;防止键按下时无时钟显示
; Z2 ]3 \7 \( u% DSET3: LCALL DISPLAY ;等待调分按键时时钟显示用9 J, w( L7 |1 p& Q- U$ _. E
AJMP SET4( p5 N5 v! u/ p' ~
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
$ x2 d7 e" | L+ j, xAJMP SETHH1 ;防止键按下时无时钟显示! w6 J4 F' G+ x
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
1 V: j9 m1 G& a$ CAJMP SET64 r; `3 x: C; v* l" d$ ]3 n% ]
SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
# W; d# K6 f* {3 aAJMP SETOUT ;防止键按下时无时钟显示
; |! I7 @( d1 b: Y7 b3 ^8 d6 q( `;
3 Q* A9 o) i" @* _4 m;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
' H1 ]+ ^5 ?) n2 A4 q. t, I% P;; 显示程序 ;;- `6 H$ o5 m2 }/ E1 X
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 d, I( U2 g8 T- o: w
$$$$$$$$$$$$$$$$$$$$$$$$$$$# U3 I% O! S/ {- J6 F9 L1 f$ T
;1MS延时程序,LED显示程序用; t; E T S5 c- }5 n( K( B
DL1MS: MOV R6,#14H
! R5 |0 m( u6 h+ z: |DL1: MOV R7,#19H
g/ {: p" p0 [# W EDL2: DJNZ R7,DL2
% H* q* H4 D3 S) e( A9 v! WDJNZ R6,DL18 k+ V# P% K; o" c. s
RET
/ a" ~3 P' E" }5 b b;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
1 [; [9 Y R- Y4 EDS20MS: ACALL DISPLAY1 p8 @% ]2 }6 E/ I: d; L* F
ACALL DISPLAY5 n! p2 F, ?9 `6 L# p& m& y7 g
ACALL DISPLAY
9 h( w; o. U2 f1 Q7 kRET* z5 n( Y8 K8 p3 k+ N% {# E, e
;延时程序,用作按键时间的长短判定
% p [3 I5 I/ Q8 z; n0 zDL1S: LCALL DL05S+ \$ G5 L0 d. R! H0 E* x
LCALL DL05S
* x1 w) H# S* O& N& fRET4 u7 e) _, q; M: S- K- T+ h) g# ?
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒: }5 ^( q; s" n( S
DL05S1: LCALL DISPLAY
) c& o5 u0 |) U0 h" ^DJNZ R3,DL05S1
! i1 ]% h0 F7 r0 E+ kRET
) p6 B9 ]% D& _6 ?- CEND ;程序结束
- v, F# y/ J4 E: _ |