51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 6 r; J) O' x) l3 \$ g! f0 L
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。
1 p9 F# @+ \% S# M 开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
- t9 B4 I, S4 y) k$ T( N z" V7 L 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。 / L0 y7 z# `' L
3 H' P0 ]( e/ \8 Z- m
: o1 c1 W9 h k$ P! ]3 U
/ i% ^( U" c( j0 H0 h 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
' F; A. n5 z9 i" w! X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; d- F( Q+ }; C1 v. y( c& a" R
;; 中断入口程序 ;; (仅供参考)! K1 m& W4 |+ W0 l6 Y5 m
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
) N) a& U' }: |6 S5 T! f;' Z1 z0 U/ j8 r) x2 J0 \
ORG 0000H ;程序执行开始地址
5 m7 [, F4 X( w$ X* Q, P* PLJMP START ;跳到标号START执行* h3 Q: d- B2 T }3 O& a
ORG 0003H ;外中断0中断程序入口8 y2 x7 M ~. e3 s& h( X5 r' Z' N
RETI ;外中断0中断返回6 O' u+ U; ~. V' O7 r+ ]
ORG 000BH ;定时器T0中断程序入口
4 q4 }' \: I+ ALJMP INTT0 ;跳至INTTO执行
+ t9 {0 W4 [' r; V( [ORG 0013H ;外中断1中断程序入口
6 U* k6 D( A0 k3 @% f: SRETI ;外中断1中断返回
9 W* w" g9 {( f7 d, O3 mORG 001BH ;定时器T1中断程序入口
; D7 Y4 ]; C4 N+ }, W- G8 z4 _LJMP INTT1 ;跳至INTT1执行: ]1 l% d* C- Y8 k4 A, n
ORG 0023H ;串行中断程序入口地址+ U# O2 k1 e/ }. {+ J
RETI ;串行中断程序返回4 N* y g: s4 R) [
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 \1 s$ j. m) j& Z
;; 主 程 序 ;;5 W0 L) D4 J1 g; ^; `
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- j+ R& w4 g$ x! f% R2 j; Z& W8 r;
6 v0 j L m0 L+ _' _! l+ fSTART: MOV R0,#70H ;清70H-7AH共11个内存单元" K: U+ Q9 `" T
MOV R7,#0BH * D+ y H' d2 k) k8 u
;clr P3.7 ;
! L& n0 q6 q1 n; FCLEARDISP: MOV @R0,#00H ;& y/ |* K9 k! c* C
INC R0 ;/ W. X U J) U# e' a0 V
DJNZ R7,CLEARDISP ;% A7 I. H7 ?; _7 ^
MOV 20H,#00H ;清20H(标志用)
: [: P1 w0 u( Q9 WMOV 7AH,#0AH ;放入"熄灭符"数据
- M1 |: L, A r$ v% N$ w0 MMOV TMOD,#11H ;设T0、T1为16位定时器. a+ x9 [4 P& K) }( @$ D5 Z
MOV TL0,#0B0H ;50MS定时初值(T0计时用)7 X" r) @2 _ n+ q J2 B. Y) P
MOV TH0,#3CH ;50MS定时初值+ \+ y$ }9 Y1 @8 F9 e
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
! d+ [) y/ F: }) G$ h zMOV TH1,#3CH ;50MS定时初值6 e8 ]- M3 `$ v7 s T
SETB EA ;总中断开放! J: X) t+ \4 o
SETB ET0 ;答应T0中断
7 n+ u& { {3 wSETB TR0 ;开启T0定时器4 V. j! i5 ^+ T2 C
MOV R4,#14H ;1秒定时用初值(50MS×20)
0 c! |" f; a8 B6 zSTART1: LCALL DISPLAY ;调用显示子程序
4 r- _( h- h o- \* C+ d8 RJNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
8 P8 y! v2 x ?8 `; Y, ]1 WSJMP START1 ;P3.7口为1时跳回START1
& b& \; _" f$ H4 ^: V; O& w6 tSETMM1: LJMP SETMM ;转到时间调整程序SETMM: V+ m2 p8 ? u) S: l$ P
;
! @4 |7 d8 {: X! Q. c+ t;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; G) ^( A8 Y8 e" q8 H: e& h;; 1秒计时程序 ;;: u! O0 |8 A7 o0 Q ~3 {
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;! ^8 l, \% g$ J, b# u
;T0中断服务程序
. h, \9 c# ?+ T' IINTT0: PUSH ACC ;累加器入栈保护1 q: N- h; S9 x) G
PUSH PSW ;状态字入栈保护: k3 G+ ^8 M0 h
CLR ET0 ;关T0中断答应5 ^' n4 i1 P" f: ^( |2 ~
CLR TR0 ;封闭定时器T0
1 O W* H: }2 w9 C- @MOV A,#0B7H ;中断响应时间同步修正' G+ |4 m/ e+ e B
ADD A,TL0 ;低8位初值修正
& ]: [: i7 q6 w3 T+ S' ]5 vMOV TL0,A ;重装初值(低8位修正值)+ \4 R% Y5 E, N/ x. ]$ Q' p
MOV A,#3CH ;高8位初值修正
@7 {! n' u( Q' tADDC A,TH0 ;
* | G o( p0 h& V% S5 cMOV TH0,A ;重装初值(高8位修正值)3 h; v* ], v3 b0 ~1 H6 C
SETB TR0 ;开启定时器T0! y5 q& D, Y: K. c, d+ H. T
DJNZ R4, OUTT0 ;20次中断未到中断退出8 J ~' a8 g6 P
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
( F z* Y, b# e, H2 i7 E" q2 eMOV R0,#71H ;指向秒计时单元(71H-72H) C4 f& Y0 t1 K% t/ A& ]7 a
ACALL ADD1 ;调用加1程序(加1秒操作)
8 V8 \6 g4 W- x0 x$ wMOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
. M! t# D* x; _6 {3 A: ECLR C ;清进位标志( n0 q. T7 v$ u# Z( H. b! a v8 Q( e- l
CJNE A,#60H,ADDMM ;
+ b+ U: o5 [% g9 kADDMM: JC OUTT0 ;小于60秒时中断退出8 s0 K/ f! S7 |$ [$ W
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0" V* i, U, _7 ^. Y4 o! e7 l4 B* L
MOV R0,#77H ;指向分计时单元(76H-77H)
# F0 g: A% }2 X/ p# F9 }ACALL ADD1 ;分计时单元加1分钟5 k5 ?$ n4 C5 {! u, S9 n
MOV A,R3 ;分数据放入A
8 c1 D: X! ]! b" _0 a( ]0 M9 O' p1 bCLR C ;清进位标志
' g, [! f0 W( {% n0 y( Z- jCJNE A,#60H,ADDHH ;
. E& w) T/ x: k4 z ^& {; QADDHH: JC OUTT0 ;小于60分时中断退出% A7 F' b1 i2 h6 s+ M9 T$ O4 Q
ACALL CLR0 ;大于或即是60分时分计时单元清0
4 [: L! P! H. c; `* c8 PMOV R0,#79H ;指向小时计时单(78H-79H)- _6 k+ c9 g: H6 M5 O4 \3 ~
ACALL ADD1 ;小时计时单元加1小时
* A, l( W' {+ j2 P0 DMOV A,R3 ;时数据放入A5 C$ f* ~, s) ]4 @9 W8 ~- z' G
CLR C ;清进位标志6 n o- p0 D: \1 U+ F% J- i$ O
CJNE A,#24H,HOUR ;
5 a7 o8 G# i3 Z' KHOUR: JC OUTT0 ;小于24小时中断退出6 W5 \5 |; J5 T$ \! Y: A
ACALL CLR0 ;大于或即是24小时小时计时单元清0: g/ C, n) b" S, X* S
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移; E( |+ ?1 n1 f# ]) @
MOV 73H,77H ;入对应显示单元
# ]4 g: ?1 [9 m" nMOV 74H,78H ;" c6 d R# ^& x! U& Q/ L
MOV 75H,79H ;
( S, q/ j& y3 ?3 T1 k: ~POP PSW ;恢复状态字(出栈)# P& n- I9 J# Z. d( i
POP ACC ;恢复累加器; E: W; R# [: X( w A
SETB ET0 ;开放T0中断
. F( m+ s5 A+ K6 QRETI ;中断返回; I* B' \6 Y1 g. q: [ w1 Z
;
- [# B3 w: c8 t2 d! A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/ `% d$ _6 E: D. G& A;; 闪动调时 程 序 ;;& P3 i6 [ i* v& u. m/ A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 _8 l! R! h! d3 Z6 q;T1中断服务程序,用作时间调整时调整单元闪烁指示
3 Y# \4 g1 A/ k* |# U7 ~/ i+ \5 `4 E* wINTT1: PUSH ACC ;中断现场保护
; q# x, Y; J, L: K" oPUSH PSW ;5 c) T( Q1 w+ `
MOV TL1, #0B0H ;装定时器T1定时初值
( I& n0 C) u3 J j2 w8 vMOV TH1, #3CH ;+ N( c- t3 R3 s# \' b+ L% s1 R
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)5 f: K! J- W3 _; a8 S8 X0 n$ W# \
MOV R2,#06H ;重装0.3秒定时用初值
$ ^8 G. O- a$ e! \CPL 02H ;0.3秒定时到对闪烁标志取反
" j3 k) q1 v8 n$ ^JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"! Z' u& v8 D0 p, g+ Y
MOV 72H,76H ;02H位为0时正常显示6 I" D- x: f7 X3 W# p
MOV 73H,77H ;
. A! `) H" }) }5 F, q2 Z, S2 ^MOV 74H,78H ;! w8 A/ V% `& H
MOV 75H,79H ;4 w: B2 [$ d, k6 I4 Y) |
INTT1OUT: POP PSW ;恢复现场
! X+ V/ D* a) _7 ]4 }7 XPOP ACC ;( Z8 S7 l4 i& f5 U3 \+ r1 Z2 o
RETI ;中断退出
. K2 D" y) m: \9 R/ eFLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
: h, x/ r1 T" g* c0 k/ d AMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分+ C' O( W9 G4 s* D
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据5 K3 v0 ^9 W1 K- q; a
MOV 74H,78H ;
: M* X! K# Q/ n o6 n1 ~" XMOV 75H,79H ;
: g6 ], W' h8 A& F4 r E2 fAJMP INTT1OUT ;转中断退出
. ^+ j. {1 k1 W* H& {9 qFLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
+ ^ [: Z) J: EMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示( ]! \. |1 t8 g4 [
MOV 74H,7AH ;; Q5 N( U' h/ e& ~
MOV 75H,7AH ;. q+ k" k- l* c8 G
AJMP INTT1OUT ;转中断退出- }: \5 T7 t- L0 d, j: [
;0 q; w! q6 E2 k- \' {
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
: n/ b% U8 w" E0 N: p' u" @- x;; 加1子 程 序 ;;
* q0 i3 M! z' z {/ \, N; {( V;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. o) Q, N* x) a( {" w;
4 Q5 X4 r* a$ J3 GADD1: MOV A,@R0 ;取当前计时单元数据到A
6 q& y8 t1 r* l! ODEC R0 ;指向前一地址
# E$ v1 H- t4 W5 a1 j' ]. h( W8 \SWAP A ;A中数据高四位与低四位交换
; [) f/ z0 L- {8 yORL A,@R0 ;前一地址中数据放入A中低四位" l5 j2 N8 ?$ A2 J8 @6 R% d
ADD A,#01H ;A加1操作6 x$ }8 J+ M, z4 D& f# D
DA A ;十进制调整% W9 ?. p H; w# X I
MOV R3,A ;移入R3寄存器
8 z, z8 F6 g& M8 hANL A,#0FH ;高四位变0
9 u+ [/ y s3 y; q6 V+ R$ }MOV @R0,A ;放回前一地址单元/ d* V9 K! [/ D0 ~0 X
MOV A,R3 ;取回R3中暂存数据
4 B% b! _8 y6 R! M5 tINC R0 ;指向当前地址单元9 L+ D' K5 _1 |# T
SWAP A ;A中数据高四位与低四位交换, Y, m: s, D1 v$ w+ f+ R) `
ANL A,#0FH ;高四位变0. W: B3 _9 Z- D( y" A9 E
MOV @R0,A ;数据放入当削地址单元中
& l, W: C- y- ^% a) @+ [3 QRET ;子程序返回
+ F8 d; \( B0 v& H0 j% b! w, L6 u;. Y" I: b4 |% }# K0 T) r. U) r- J: y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7 q5 n) \+ j: B+ w# e/ Y
;; 清零程序 ;;" Q' v" G# X5 Y2 {' h% P' K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 v5 ~ a: F9 ]9 D;.............
- B- {0 ^$ ^4 y4 u" j;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 I: M7 z. P" E0 w( `: w;; 时钟调整程序 ;;1 |+ s; }$ B A+ O
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 _ U; z3 D2 g$ j;当调时按键按下时进入此程序
$ p6 w: t. y% W7 X, j- P; s* oSETMM: cLR ET0 ;关定时器T0中断+ S u6 C, m8 f& P I
CLR TR0 ;封闭定时器T0
4 c4 J" |4 C' A5 ALCALL DL1S ;调用1秒延时程序- _2 F3 _! J$ |7 ]8 h0 z: m& y
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)
1 _: E( H$ F4 G/ O2 ^ N6 oMOV R2,#06H ;进入调时状态,赋闪烁定时初值% e0 z8 g% R$ [" R( E$ X# n
SETB ET1 ;答应T1中断
8 N# H. ]( F% {6 W( z% [8 rSETB TR1 ;开启定时器T1
5 A0 g l8 J- z6 ]SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待9 Z$ o" k0 p+ A1 y" }
SETB 00H ;键开释,分调整闪烁标志置1
5 T9 X* ^" o- `: M1 ZSET4: JB P3.7,SET3 ;等待键按下9 J1 F* y" d2 w5 x* x
LCALL DL05S ;有键按下,延时0.5秒
; u y4 w6 ?, G) SJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态$ _( w# d1 Q4 W n
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作) z4 @4 u7 }( a; }5 G3 u+ ~% ]+ Y$ S8 L
LCALL ADD1 ;调用加1子程序" v# P' F4 T$ @2 b% `8 H2 j7 e5 g1 o
MOV A,R3 ;取调整单元数据
3 b" \" S+ W kCLR C ;清进位标志
, K1 h: e0 \$ W# e0 w G! ~- x( KCJNE A,#60H,HHH ;调整单元数据与60比较" g( D" w! U- Q+ d9 P- Y9 y# J
HHH: JC SET4 ;调整单元数据小于60转SET4循环. q X8 D. K$ d3 _) ]$ z9 x
LCALL CLR0 ;调整单元数据大于或即是60时清0
) E' A. y; M i; C6 i1 L2 PCLR C ;清进位标志- A3 ~" W2 [" z! f) P# d
AJMP SET4 ;跳转到SET4循环
, v+ A! p6 @2 F# P- kCLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断8 P$ D& k' C8 h& W, I
SETB TR0 ;开启T0定时器(开时钟)2 J! F' y- a- }3 c* Q# ~
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。
) h3 c7 v M9 \LCALL DISPLAY ;有键按下,调显示子程序延时削抖6 @# I6 K- U5 L% n3 d
JB P3.7,CLOSE ;是干扰返回CLOSE等待. m6 U1 u; r Y; P' l5 d1 C
WAITH: JNB P3.7,WAITH ;等待键开释
0 Z- Y1 T5 u e6 g( |& i- jLJMP START1 ;返回主程序(LED数据显示亮)
6 M; S, H. N4 {8 sSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)4 u* `& y0 y# x/ y& n+ o
SETHH1: JNB P3.7,SET5 ;等待键开释. c3 K1 F2 Q, z- M
SETB 01H ;小时调整标志置17 U% ~' ?( {4 _& V
SET6: JB P3.7,SET7 ;等待按键按下* K$ P* g! z- F: o! a! y
LCALL DL05S ;有键按下延时0.5秒
+ {8 b- k9 }! KJNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整0 a3 R0 _5 C% k
MOV R0,#79H ;按下时间小于0.5秒加1小时操作
1 X9 k* B' u" S k8 q+ L' FLCALL ADD1 ;调加1子程序% T3 X3 ?, @% j: V' U M
MOV A,R3 ;
2 d% u9 d6 u/ }6 ]% b5 S. KCLR C ;' l+ f0 P- _/ x* L9 c4 c( @5 z
CJNE A,#24H,HOUU ;计时单元数据与24比较 F; M- @8 w& A, p. M) N
HOUU: JC SET6 ;小于24转SET6循环9 x% @; {5 n2 z% Y- Q- q
LCALL CLR0 ;大于或即是24时清0操作
, Q' c) y) g& e: G8 mAJMP SET6 ;跳转到SET6循环# x, C8 G$ l9 D) |% G
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释8 z. ?" w3 t4 @4 t
LCALL DISPLAY ;延时削抖7 u: t1 ]$ ]# }
JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待' k& S9 V8 h, e5 e
CLR 01H ;清调小时标志
3 O( A4 d( k% a& N4 N( @6 sCLR 00H ;清调分标志" a* a- L1 J4 @3 U: W
CLR 02H ;清闪烁标志
* M( {" W. L+ e7 P( D: z* c8 ACLR TR1 ;封闭定时器T1
2 W5 e) Z2 F& }# J; @CLR ET1 ;关定时器T1中断4 _# u0 g! X: V: f' Z6 G% a1 \
SETB TR0 ;开启定时器T0( ~9 o3 t1 }2 c2 i1 f* w
SETB ET0 ;开定时器T0中断(计时开始)1 H& K0 {; ^7 V) B! |0 ]: c
LJMP START1 ;跳回主程序
0 U. r8 o+ g. Q* vSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
7 l! ?7 K( |( t3 C0 Q, a1 q9 NAJMP SET2 ;防止键按下时无时钟显示. u" M- r5 K( { Y
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
# _' _+ t5 V& B( {AJMP SET4
6 T0 C9 U2 M( R* @% hSET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
6 `8 U* g+ a/ Z% \' q) LAJMP SETHH1 ;防止键按下时无时钟显示 }! p4 k, I. [9 ]( D
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
S" H6 c; \5 R8 X. @AJMP SET6
x$ A; C3 i' n( K. CSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
7 g1 r9 b( V1 r1 I+ a, |3 oAJMP SETOUT ;防止键按下时无时钟显示9 c9 j2 m$ c3 q
;
" @3 Y/ J5 i# w8 w3 V4 a! H, y; w;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 G& G: ]% c2 d# A+ p;; 显示程序 ;;5 @! R$ l. k# L3 K' z% k
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
& N% s3 D3 P. f2 Q$$$$$$$$$$$$$$$$$$$$$$$$$$$
- s: B4 g! {4 \' u: @- c. A;1MS延时程序,LED显示程序用
1 Y3 D: ?+ }! q8 P# a2 U `7 }; \DL1MS: MOV R6,#14H# y! [! c$ w5 {8 N
DL1: MOV R7,#19H9 {. F8 K) a/ j
DL2: DJNZ R7,DL2+ S/ ~& c: f; {+ z: B
DJNZ R6,DL15 I- A: Z, E1 Q1 e* i# x4 j: Q
RET
0 k9 P2 W& g* q/ m0 k;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象# J; N7 E9 S. a- _5 r% P5 P
DS20MS: ACALL DISPLAY
, Q% M% s+ {1 ~6 vACALL DISPLAY8 l O! ]' L' L& k: s
ACALL DISPLAY
8 @: j7 ~, U1 K# W6 q+ z$ L1 ^RET: `+ f/ I% ^# J
;延时程序,用作按键时间的长短判定
0 I+ C( R8 | f/ w) K/ I5 RDL1S: LCALL DL05S
' V' t5 r9 S7 g* CLCALL DL05S3 A6 i3 K: F( N7 w5 N- V
RET9 `: u* o! a" t+ H% W& C
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒0 w$ e% @0 z, t! ?4 y
DL05S1: LCALL DISPLAY
; ~/ C3 O5 I) ^; v$ S# {2 l2 {6 ~DJNZ R3,DL05S12 K/ Y* U) g( q% `
RET% _3 m l& _( O( \' Q/ ]
END ;程序结束( F! q+ ^0 w4 ?9 a- z/ F; K
|