51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。
9 _7 V% V$ Y5 c% } 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。
& ~+ T$ a( l1 @, ]. B/ J3 t( k5 v3 K 开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 % ]- [4 R2 M/ ~3 L$ y" N3 {
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
/ M& g( K5 o0 N, O# v
; [) l' @% F% o# ]9 ~9 c& t8 B - w0 k0 V3 a3 g. V1 u
4 I0 H7 U+ n. |- x h
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
9 W' \$ x* K7 H, O9 R;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2 c3 Z" s+ ?' p+ I4 e2 [
;; 中断入口程序 ;; (仅供参考)3 \6 P3 {2 J9 N0 V2 r" r7 l. \: s/ C
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 O+ W4 T5 U, I* `& n1 X& s;
$ T+ b C( J$ I7 D, l, QORG 0000H ;程序执行开始地址
( E- p0 W7 I. S: b; v( e3 F8 p/ _LJMP START ;跳到标号START执行# S( w3 s8 D8 _! @7 I
ORG 0003H ;外中断0中断程序入口
) E" F3 E( @( O, N l7 TRETI ;外中断0中断返回
+ B7 @$ K$ [# g5 PORG 000BH ;定时器T0中断程序入口
, M1 b7 M, U( Y: g& j! WLJMP INTT0 ;跳至INTTO执行8 C4 i/ X$ Y# [$ F7 _' Y
ORG 0013H ;外中断1中断程序入口
! U4 h2 O6 l" Q# \& \6 B) e8 r pRETI ;外中断1中断返回% s" w0 g( g# p0 C
ORG 001BH ;定时器T1中断程序入口
0 i' Q5 D9 N" X! c8 Y, ^* f* X& dLJMP INTT1 ;跳至INTT1执行
, J8 X) D$ o' TORG 0023H ;串行中断程序入口地址
7 @- `" z0 `9 S) KRETI ;串行中断程序返回
- P5 M# Q. G5 w; x$ a; Z% h& c;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; U/ K& ~% G L; r% E;; 主 程 序 ;;
" P8 |9 I! W& |% ^: }9 B' V;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" ~* d( a& \5 T% Y) w
;+ d! F# m( P! k
START: MOV R0,#70H ;清70H-7AH共11个内存单元. O0 L( m3 z0 y- v
MOV R7,#0BH
! b' y$ W( z4 Z;clr P3.7 ;
& X. o# c0 H/ [6 C1 n& NCLEARDISP: MOV @R0,#00H ;
; R- e. |/ n* M6 I( c7 M C% k4 qINC R0 ;2 R; q" w' ]4 V) L
DJNZ R7,CLEARDISP ;/ X# {8 @ s6 j3 z
MOV 20H,#00H ;清20H(标志用)
7 L7 q& a" s4 dMOV 7AH,#0AH ;放入"熄灭符"数据5 [% T8 ^" H, Y4 a* y% R, a" k. C! N
MOV TMOD,#11H ;设T0、T1为16位定时器
# }2 i2 c/ L4 c: H' P% \MOV TL0,#0B0H ;50MS定时初值(T0计时用)
7 a% S% ?6 K# d3 y C x# x4 V: sMOV TH0,#3CH ;50MS定时初值) b( Y7 N z" R* p8 }1 Q; @
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
/ `- M8 R( ?- nMOV TH1,#3CH ;50MS定时初值
4 c2 v6 ?' g9 h3 y! ISETB EA ;总中断开放
2 g% W8 V+ V) Y6 OSETB ET0 ;答应T0中断
) |! a; ^2 S8 I7 b8 Q7 y, E wSETB TR0 ;开启T0定时器. X/ J+ [! C- G8 @# Q
MOV R4,#14H ;1秒定时用初值(50MS×20)
/ T. f, i8 J7 kSTART1: LCALL DISPLAY ;调用显示子程序
) D' `# K; `* L! r5 n Z$ {# hJNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
8 d9 W+ [3 G' g5 `8 H& dSJMP START1 ;P3.7口为1时跳回START1; U! \! ]9 I5 ]8 v! w$ G
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
|: m& X% \( l) [: Y/ f;
# f& z* J4 }. A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 M2 C/ ]$ j( } d
;; 1秒计时程序 ;;
& T5 }, r# b/ @' U' Z' N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: u/ w% B8 \# a4 [& [
;T0中断服务程序
7 N6 K# [/ ], ?3 @* V4 t; xINTT0: PUSH ACC ;累加器入栈保护* x A; J9 w v3 a
PUSH PSW ;状态字入栈保护
2 @% W9 a% ? x* J* nCLR ET0 ;关T0中断答应
; `0 |1 l# e# K, o* d9 t" w6 LCLR TR0 ;封闭定时器T0
* V+ \$ Q1 e: R8 EMOV A,#0B7H ;中断响应时间同步修正
8 k& ?" b9 S+ R$ G$ R: |( Z% @ADD A,TL0 ;低8位初值修正
8 f/ H' L" o4 R; z; r7 o( R# w+ p5 @MOV TL0,A ;重装初值(低8位修正值)
& D& T" F7 Z* J/ c4 M) B6 gMOV A,#3CH ;高8位初值修正
" `/ @5 G) P4 c& TADDC A,TH0 ;
9 B+ J: d( M9 a$ Y7 ?' [MOV TH0,A ;重装初值(高8位修正值)9 _) e9 O* y! A: y3 O
SETB TR0 ;开启定时器T0
# [/ J R$ L% LDJNZ R4, OUTT0 ;20次中断未到中断退出* U/ Y) E0 F+ [+ q- W
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值4 w2 v5 X( j# l @5 v, \0 D$ k
MOV R0,#71H ;指向秒计时单元(71H-72H)6 Z! s$ v1 f A# o' C
ACALL ADD1 ;调用加1程序(加1秒操作)
8 p3 X% r4 [2 C! Q& |MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)/ m" R( ~0 g- k b! L2 ^
CLR C ;清进位标志# i) k7 s& O+ Y! D' l8 e' H
CJNE A,#60H,ADDMM ;: H, h& A8 I7 w3 V% F
ADDMM: JC OUTT0 ;小于60秒时中断退出( w. ^4 F" C. I! i f. ~
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0
# T: `( R3 q$ Z K% UMOV R0,#77H ;指向分计时单元(76H-77H)' G4 F- y1 ~- z4 [' ~5 Z7 I3 _& [
ACALL ADD1 ;分计时单元加1分钟
! r3 y4 O3 U8 z+ `6 OMOV A,R3 ;分数据放入A7 Q: \' J9 K% ?# q: b
CLR C ;清进位标志) q2 R1 y" T3 [
CJNE A,#60H,ADDHH ;
3 B7 x3 ^' i) O( P+ w; H0 gADDHH: JC OUTT0 ;小于60分时中断退出' M6 C) b9 k n1 x0 t
ACALL CLR0 ;大于或即是60分时分计时单元清0" y5 @* W' |, d6 |6 W( y* n
MOV R0,#79H ;指向小时计时单(78H-79H)' H; U1 P! |/ _, C" R3 k
ACALL ADD1 ;小时计时单元加1小时! E' F v# ]. |3 G/ `; c0 {- x
MOV A,R3 ;时数据放入A
: A# [1 P8 m" g9 P" F1 `5 h/ rCLR C ;清进位标志; H e! a/ p4 D4 ~6 f
CJNE A,#24H,HOUR ;
' L1 N" }& x8 W9 k8 l( u0 W; t+ oHOUR: JC OUTT0 ;小于24小时中断退出" e5 K$ B8 f, j. i3 a# [$ Z
ACALL CLR0 ;大于或即是24小时小时计时单元清0, [+ ]/ s+ k7 q% }0 O( u5 u" e
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移" b' K& h7 h, u0 p; \* l4 Z
MOV 73H,77H ;入对应显示单元6 P% Q2 h# k9 o$ W8 |
MOV 74H,78H ;# U, `4 j- R) ? d6 W2 e
MOV 75H,79H ;5 Y0 D% T: Y! U# c( n
POP PSW ;恢复状态字(出栈)
% B$ \' [" v9 c* G4 WPOP ACC ;恢复累加器0 j4 f# X( Z1 V" |6 |
SETB ET0 ;开放T0中断# u+ n F. E/ l" I: C$ l* \ W2 R5 m
RETI ;中断返回
4 U* x* E& c8 W9 B;
) w& D9 h& P2 i3 L* a0 R;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
" W' u( t) O( t2 Y7 [& f- t3 U;; 闪动调时 程 序 ;;, U" ]4 Y7 I3 ^& S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; `; U7 F. R3 {% W$ {
;T1中断服务程序,用作时间调整时调整单元闪烁指示& G) s- ?. A T. C" f7 K$ X& l
INTT1: PUSH ACC ;中断现场保护$ I4 j3 y, p' d
PUSH PSW ;
6 v5 X( H8 i0 B! hMOV TL1, #0B0H ;装定时器T1定时初值
# t! Y u$ W1 T4 K. r6 \MOV TH1, #3CH ;
" U2 p: o. I) q4 P0 {4 `3 bDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)4 j9 j3 m' g, Z& {/ m" j% z! K$ `
MOV R2,#06H ;重装0.3秒定时用初值/ E7 m% }, x# ?9 u# f5 O4 R' k9 u
CPL 02H ;0.3秒定时到对闪烁标志取反
% d, N. c! a) M5 `JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
9 `# T& v7 M8 C" @ e9 YMOV 72H,76H ;02H位为0时正常显示
+ ^+ g& a5 N a* V! Z1 ?MOV 73H,77H ;7 d4 @3 `# P1 E0 P' P
MOV 74H,78H ;
1 ]2 `3 f3 P' t" sMOV 75H,79H ;
c) E8 {4 i+ `/ _INTT1OUT: POP PSW ;恢复现场2 s2 i' g) i2 b2 j/ E1 D; { O7 F
POP ACC ;- V5 s8 \3 J' O) p
RETI ;中断退出" D! r# B7 {' x! I
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
* G( V$ U8 @3 Z& _ U ZMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分, |* C% N1 G1 V" n6 Q: h0 X! S( B1 Q
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
2 T( Y; G' L) }MOV 74H,78H ;3 g" m8 b( G) L6 T( C
MOV 75H,79H ;$ N4 _( }0 c# h9 m/ X
AJMP INTT1OUT ;转中断退出
4 t9 J: c& ]) p# h- }FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
" g4 a2 t( q$ w6 X4 o( w$ xMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示* N. V3 ^& m9 c7 B. M, B( ]+ K6 M
MOV 74H,7AH ;' }1 Z5 X! p0 o5 e: O% y* o
MOV 75H,7AH ;; I9 D3 v R6 g% e
AJMP INTT1OUT ;转中断退出5 |: e; ]3 O* G {0 \1 N1 A
;. E: ^0 i3 [. P/ d" Z
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 z! ^; ?% f9 ]8 I;; 加1子 程 序 ;;$ D# T* g! H* N9 a+ M/ X7 L/ J
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( u4 Q1 x1 ^5 W6 n; Y2 |! F3 P7 p
;5 N) c0 L5 J. L
ADD1: MOV A,@R0 ;取当前计时单元数据到A
* q8 Y% G) e8 P$ N6 _DEC R0 ;指向前一地址: |5 h. R$ l( D
SWAP A ;A中数据高四位与低四位交换
- j/ V, p J# A& x, VORL A,@R0 ;前一地址中数据放入A中低四位3 @4 g$ B: h5 {; n$ X
ADD A,#01H ;A加1操作
5 [6 W9 a6 z; |3 j4 _/ l% w4 LDA A ;十进制调整
3 ^' A V4 m" p) e+ h1 zMOV R3,A ;移入R3寄存器0 q8 p8 x1 i6 |& p" z
ANL A,#0FH ;高四位变0( {2 f) V7 n d" M+ T
MOV @R0,A ;放回前一地址单元
8 i+ }$ h. Q1 s6 k9 o3 B yMOV A,R3 ;取回R3中暂存数据% i# L- `7 j9 g" o
INC R0 ;指向当前地址单元
2 v2 c, b: a* r' VSWAP A ;A中数据高四位与低四位交换
& e2 J" L+ R: d" Q0 nANL A,#0FH ;高四位变0
5 u* R( F1 z, z6 S K: K/ FMOV @R0,A ;数据放入当削地址单元中
! W" D* ~5 t6 K" n5 qRET ;子程序返回4 ~: [& w% ]& K* d+ K
;
- N1 ?9 o3 e! O+ u# P% I( t;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 Q) c* h, k! c. a' e- C! A8 |4 ]7 c1 O;; 清零程序 ;;
# X6 S2 K( g6 I9 L; G% V;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. J7 K, [1 p) e4 a2 b
;.............2 v. B, ]; d- t- Y+ y6 Q
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7 b6 a( i( s) u2 l
;; 时钟调整程序 ;;
0 K' R5 ?+ k k3 y" L;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; i& m* l8 t% j6 [0 t; F9 y
;当调时按键按下时进入此程序5 Y- D/ T+ Y$ G. w7 L2 f- g7 O
SETMM: cLR ET0 ;关定时器T0中断: m, i. G5 _- r( W2 F L3 R5 E
CLR TR0 ;封闭定时器T0
- i7 H( g+ C. |% O, _: u$ ~5 dLCALL DL1S ;调用1秒延时程序6 O8 q; {2 v; a# F" s& y
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)$ V) X& A+ c8 e, T
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
1 j7 i8 F* @. z" l2 ^SETB ET1 ;答应T1中断5 |8 X2 F6 o, D1 T9 s" z& s2 D: n
SETB TR1 ;开启定时器T1
* K+ D, w; A/ v- Z6 z$ zSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待+ K3 c1 x1 n7 s% ~7 u% i: {
SETB 00H ;键开释,分调整闪烁标志置1
, c* B9 `, ^; n4 P+ X6 F/ H7 jSET4: JB P3.7,SET3 ;等待键按下
/ G7 {+ t2 a: z+ P; D8 u" hLCALL DL05S ;有键按下,延时0.5秒
- r% Y0 Y' x( _5 kJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
9 s1 l: e, Y" _7 `* B, u5 J; g) qMOV R0,#77H ;按下时间小于0.5秒加1分钟操作
6 Z- |) b( s7 d5 F) K8 DLCALL ADD1 ;调用加1子程序
$ m0 Q) X& n1 R. P, [0 F7 n2 mMOV A,R3 ;取调整单元数据2 G. F' F) u3 w$ v2 m/ r) s
CLR C ;清进位标志& X, N* J A2 |; O
CJNE A,#60H,HHH ;调整单元数据与60比较2 i( I' |; s' n# d/ a( O. F4 y! x3 ?
HHH: JC SET4 ;调整单元数据小于60转SET4循环7 m' j0 s U0 g+ ?
LCALL CLR0 ;调整单元数据大于或即是60时清0
2 ^7 Q: I% E2 L+ ?3 v: k* @4 H! @CLR C ;清进位标志5 N F+ E& Y& W5 `; }- h9 p, j
AJMP SET4 ;跳转到SET4循环
( H R Q' [: S, X' |2 z$ F7 UCLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
! [, V. |( `- M$ @SETB TR0 ;开启T0定时器(开时钟)
7 q* k- s2 N. F$ oCLOSE: JB P3.7,CLOSE ;无按键按下,等待。 [' |5 W8 L" ]" G% |% }& o
LCALL DISPLAY ;有键按下,调显示子程序延时削抖
5 j1 |4 ^$ I/ j% a+ \JB P3.7,CLOSE ;是干扰返回CLOSE等待8 T9 J0 l; z9 }7 }. m
WAITH: JNB P3.7,WAITH ;等待键开释
: i1 r, m* x+ T3 Z6 N' JLJMP START1 ;返回主程序(LED数据显示亮)3 _& e! J. g/ \0 Q8 x
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)3 l X! K# M C' s: B* ?- B
SETHH1: JNB P3.7,SET5 ;等待键开释* }9 G5 V8 t! k9 A- V2 [
SETB 01H ;小时调整标志置18 T7 |) _: j" b& g2 \2 \/ A
SET6: JB P3.7,SET7 ;等待按键按下
1 t6 c* ~! V, A3 Y: pLCALL DL05S ;有键按下延时0.5秒 S h( o5 [: _7 S% J. X6 u9 V
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整7 G/ j E- L. E, j3 f; L
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
4 K9 C; m* H8 V/ yLCALL ADD1 ;调加1子程序
- Y5 [6 _& y1 fMOV A,R3 ;% D8 Z+ F% \, F! Q
CLR C ;
! [3 {# ?. ^9 SCJNE A,#24H,HOUU ;计时单元数据与24比较
5 S0 d4 U H; z( ^( T* N9 B$ SHOUU: JC SET6 ;小于24转SET6循环
" o# z, O; h x5 k( }6 m& }, W' [LCALL CLR0 ;大于或即是24时清0操作2 ^ f7 U: N4 R
AJMP SET6 ;跳转到SET6循环$ N! Y0 z' e9 V+ Z; A
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释
( C, i3 J+ X& K- w5 X7 [* t6 |) W" DLCALL DISPLAY ;延时削抖$ }( |2 d* G) s4 A. l5 f; M
JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待: L) @- Z% w P# c1 `/ O# \
CLR 01H ;清调小时标志/ l( @) _, b5 N8 A& A
CLR 00H ;清调分标志
, z6 N6 z Q+ C5 P$ ]CLR 02H ;清闪烁标志
. M- D* v" K" }0 B- v2 PCLR TR1 ;封闭定时器T1
. E! Q- N5 G! u/ ACLR ET1 ;关定时器T1中断
4 e- v! ?0 V$ v- k, aSETB TR0 ;开启定时器T0
" T% h5 V" j$ v( m* u9 o1 v. W! d8 dSETB ET0 ;开定时器T0中断(计时开始). S5 }" h* n ^. Q f6 p
LJMP START1 ;跳回主程序9 a* A% x% X. X
SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)4 W" u8 j ^4 q I/ o
AJMP SET2 ;防止键按下时无时钟显示' o% V H* @4 H: H' ?# b
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用* J4 r* I& Z* C3 Z2 G5 {
AJMP SET47 y9 U! S4 ]- `
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时). V1 }) k; v; }3 A0 t6 c
AJMP SETHH1 ;防止键按下时无时钟显示! T5 ?; n8 Z* \/ T
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
% @! F! z3 ^% c O+ D( aAJMP SET6
& ^, I" v' k) }SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待; h0 g4 u" v6 F7 B
AJMP SETOUT ;防止键按下时无时钟显示
5 L- E1 U( C( Y- M. Z9 e;
& |9 e5 j1 b3 k4 b: e6 I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' v; i& [) k) n! r: U4 }' R: Q
;; 显示程序 ;;; d/ k! D" X: y% n# B" H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, H" z8 V0 X9 G& D% C* p
$$$$$$$$$$$$$$$$$$$$$$$$$$$' g8 y) X: P( `# }9 |4 D" T
;1MS延时程序,LED显示程序用0 K6 |8 l- ]( t" N4 C
DL1MS: MOV R6,#14H$ \/ a) ]5 R: r! V
DL1: MOV R7,#19H
5 l+ m ~( g/ `7 d; ]5 {/ zDL2: DJNZ R7,DL29 Z/ H. k0 e6 j3 |) x* I' B
DJNZ R6,DL1
/ f, I: ?) A6 D, A4 {. Z% u. e0 ]RET4 ~' S6 b1 s- X
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
4 h: E7 O3 K- w) P( i- O8 D2 R3 p- ADS20MS: ACALL DISPLAY
' I: F) r% n% T. O7 i4 T! G# v2 RACALL DISPLAY
2 W, c1 v) X% O IACALL DISPLAY
6 s. K5 R+ z+ S) |( jRET
4 _( f- @3 O6 R* _;延时程序,用作按键时间的长短判定% U0 `0 h' ~+ O: z0 B% O8 [2 G
DL1S: LCALL DL05S9 l7 Q, q0 K' H# {0 j# l5 J
LCALL DL05S* }1 A1 C, D$ K6 o1 G
RET# P1 ?- [; k0 e( ]7 a7 y. G
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
/ |8 I: _. ~ x" S gDL05S1: LCALL DISPLAY
9 r* _: ~4 w( Z; J* b) \DJNZ R3,DL05S19 w- h6 t9 q: |/ u6 `- o* J: y
RET
' h0 I. b0 N |$ JEND ;程序结束2 F5 O6 _9 ?% ^
|