|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
自作的1602数字时钟(带温度带单片机程序带电路图)$ _! q& } A- n0 {' F7 z
( |0 s! h' y" \6 Q8 `$ c5 |
/ ` h1 z# u; c, Y
y" M' S+ ^8 \
% ]0 p2 x, O0 E! z) F单片机源程序: |
" Q# A. Q `- X0 ]- g( Y5 j4 f4 C1 f# [. v! U
#include <REG51.H>8 b: r& V7 d8 b! x2 E1 f
#include <intrins.h>0 N- {9 c5 W# S+ c8 q1 _) t$ a
//#include "LCD1602.h"
: k8 t& j1 ]/ T+ r8 m3 ~//#include "DS1302.h"
, h& \- Y6 E9 \3 q- n4 b#define uint unsigned int
4 k D4 q# P% W$ b- X) q#define uchar unsigned char" {' G+ k: b6 s1 d& Q' [
sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚
( `- S6 R1 D* {% Bsbit DS1302_IO = P1^6; //实时时钟数据线引脚
1 q* m& x2 w* G4 H6 [6 a; R4 Hsbit DS1302_RST = P1^5; //实时时钟复位线引脚
5 s: t8 G) R) u* j0 ~; A5 gsbit wireless_1 = P3^0;
) s; @1 B, `- {' X( b! [sbit wireless_2 = P3^1;
: h) ] u8 k# ~sbit wireless_3 = P3^2;
9 y# w+ v# E9 P& hsbit wireless_4 = P3^3;
- N( v3 C/ K7 e. L. m dsbit ACC0 = ACC^0;8 \" P8 g! y) ]5 F; ~; }0 Z
sbit ACC7 = ACC^7;
- i# y" i) E3 h/ jchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
/ @1 I6 p6 G4 A2 k ]/ V8 esbit Set = P2^0; //模式切换键
/ b" [& [" @1 i) N* R* f' X3 Ssbit Up = P2^1; //加法按钮5 `$ v/ f! U# l+ P$ F
sbit Down = P2^2; //减法按钮 F2 i$ T% A: ~9 p* @/ U) `& z) P
sbit out = P2^3; //立刻跳出调整模式按钮
, E' P8 X I1 `" msbit DQ = P1^0; //温度传送数据IO口
6 J8 U" _, R* [% Uchar done,count,temp,flag,up_flag,down_flag;
$ I+ h( ]% y& D" |/ `9 tuchar temp_value; //温度值
7 m( ?+ n6 L4 Auchar TempBuffer[5],week_value[2];
5 B2 D* M8 a+ z( A: Q. P4 j& t3 X
, U4 @5 r( d( ]8 a4 D/ \% Z7 \, `3 {( j7 S t
void show_time(); //液晶显示程序
2 T* }# ^8 _# Y \; U9 f& ?/***********1602液晶显示部分子程序****************/
, ?; Z# ~. h- N: Z. @" e/ L5 s. S
2 p/ M" `% J6 D# x* \% S2 T
, r' B, Y7 x3 }" i) J//Port Definitions**********************************************************
! x6 b' F Z1 o. W3 K8 }' Lsbit LcdRs = P2^5;
8 i1 ?, m0 @0 { t1 [- A, @2 }sbit LcdRw = P2^6;( ]7 L: h6 j ]7 P
sbit LcdEn = P2^7;/ | c: z* J/ n8 _' J3 B
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口1 Z7 S1 r6 K' c" n9 H
+ f# G* e& U3 c! {) T9 y2 j
//内部等待函数************************************************************************** f0 Z/ m- s9 ?: S
unsigned char LCD_Wait(void)
, J0 j" E& x- `& |# g Z8 M{' b1 S; V) o2 }; ]! |: f" b5 U5 N
LcdRs=0;- ?1 O. \& N! h
LcdRw=1; _nop_(); o- ~& Y3 a9 ~' {$ V2 X! f
LcdEn=1; _nop_();6 E% L8 y4 `$ k6 B4 t
( z* W+ d, F/ K2 i f8 z LcdEn=0;
4 g; w& i) s9 V1 Y return DBPort; + m9 U0 U5 k( ~/ ]+ _
}
' B% Q6 ~# j) }//向LCD写入命令或数据************************************************************
1 A: M6 @+ f' l b* s#define LCD_COMMAND 0 // Command
. a' I# z; T7 C0 M2 [0 w3 I#define LCD_DATA 1 // Data9 q+ z2 F6 ^/ L. \2 I6 d
#define LCD_CLEAR_SCREEN 0x01 // 清屏7 ~1 M+ W. |+ k- C, x m) W8 M
#define LCD_HOMING 0x02 // 光标返回原点
9 t" v; B5 k/ {4 rvoid LCD_Write(bit style, unsigned char input); U9 Y. M3 ]9 m# V
{! i6 u* A3 s/ @% ?! ~
LcdEn=0;6 |: v1 a+ ]/ A" j2 o
LcdRs=style;
- l( c0 q' a. Y2 x LcdRw=0; _nop_();
+ K% @( H: ?& h, D( K% R DBPort=input; _nop_();//注意顺序
: {; p, ]0 j, J0 |6 Z) j: J LcdEn=1; _nop_();//注意顺序
7 K5 Z& A- G, n! o- T$ M6 Y LcdEn=0; _nop_();' A/ `( N7 k2 B, T" q
LCD_Wait(); 3 k; T. N g( `3 b$ D
}
2 R7 X( k3 s( G/ O' P+ ~- [0 [7 o! `5 q/ X# ~
//设置显示模式************************************************************" p2 k9 u/ ^* J$ L$ s
#define LCD_SHOW 0x04 //显示开
, `, b. z/ N+ a8 S, d2 N$ a3 F#define LCD_HIDE 0x00 //显示关
. W: }5 c! a& W0 Q3 [" {6 l& ?, N7 Y: \. G( }
#define LCD_CURSOR 0x02 //显示光标
! Y" K& n5 p$ L$ i$ X1 H1 \#define LCD_NO_CURSOR 0x00 //无光标
$ l+ u% ]- M# k9 D5 S* Q& p4 X' z3 a1 F
#define LCD_FLASH 0x01 //光标闪动
1 E! T4 q9 l2 j, g#define LCD_NO_FLASH 0x00 //光标不闪动
& W2 j; U! J/ I- v: x3 b* `# T, K! u, a4 O4 _
void LCD_SetDisplay(unsigned char DisplayMode)
; m H1 x/ C% [! `{% ]) U) N: a. ]" f0 w$ I' a
LCD_Write(LCD_COMMAND, 0x08|DisplayMode); 1 W, _' ]7 l2 n8 X* @
}. f# p% H" I. U- a5 c2 f7 Z
' l( H ?( ?# c5 a. K2 U//设置输入模式************************************************************
0 E" E9 n) s0 j* f- G5 m#define LCD_AC_UP 0x02; k/ d* e- E$ }( c2 n
#define LCD_AC_DOWN 0x00 // default* d' h2 f3 E' [7 O
- ~ E3 K+ |* }% G. I7 w& M' v2 B/ m#define LCD_MOVE 0x01 // 画面可平移 b& j' @6 Z8 V7 `
#define LCD_NO_MOVE 0x00 //default7 M: s. j+ _% ~' L$ X
, R0 T( i9 h& K9 n. | s }% \9 k5 Ovoid LCD_SetInput(unsigned char InputMode)1 z0 N9 A3 Y9 o
{& [6 t0 J ]+ ]6 |/ g
LCD_Write(LCD_COMMAND, 0x04|InputMode);/ o0 p- E# V" O$ f6 W0 ^& a# c
}3 j7 ~& o! l* p' X9 s+ Z! _: y
" T4 M- a2 u* l' Y" R
//初始化LCD************************************************************
+ l8 ~9 b* Y; |* Jvoid LCD_Initial()' t* Z+ p5 V. L, y$ j8 D* D) `5 S3 g
{
1 H$ o" s; H2 S/ q: P7 b' S( Q LcdEn=0;
+ q3 w m* n9 d/ n+ j- I+ M LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵! p- E. d2 w; ^! ?: P1 p
LCD_Write(LCD_COMMAND,0x38);
* l" Z, A3 x9 }, K( B2 K, G LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标9 v* u3 ~2 z$ W! {6 j6 W8 P% [4 _
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
! W( E. b: r! K- C. |# a; A! [ LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动% x+ |1 Y4 o6 [: o q4 v7 Q# C( w* \
}
# s* i' A5 o' H$ J! G' f# _: a6 M0 l
+ \: @- o0 f6 B3 }- }+ h# m//液晶字符输入的位置************************
- T, V8 e) [# d* q. bvoid GotoXY(unsigned char x, unsigned char y) V% R2 ^' Q; h8 h3 I
{2 K& f& n' t& R4 r
if(y==0)& k+ j+ ]- Z0 D
LCD_Write(LCD_COMMAND,0x80|x);8 M' k0 s$ R, }
if(y==1). N8 x$ P" E# B* P5 d" Z
LCD_Write(LCD_COMMAND,0x80|(x-0x40));8 _& C( Y0 [% H7 ?; Y) x8 r2 f
}9 T' O2 Z2 C) `, G( Q
; j* C+ X" {2 m( n
//将字符输出到液晶显示5 |4 B! |' [$ N9 T
void Print(unsigned char *str)! p0 J8 [$ y) }9 E) a
{1 c" c: E8 X' p2 S8 \4 O$ ^, K! h
while(*str!='\0')
$ O0 r/ Z/ c2 ] {2 M/ M4 _. r0 |1 W% z
LCD_Write(LCD_DATA,*str);
7 k4 s' l9 p# n; n str++;: R( F' c& @0 A& Z. X1 R% Q" L, f
}
: I0 }. {) J- ?& U/ C}
! Q _1 c) C0 W, p
" o$ W) v0 w: W" g) ^* G) @; Q) b7 o8 G3 W m, p' ^
5 f/ v5 r; d9 {2 q
/ w0 y$ a; \$ y0 j/ e
3 j; y9 X6 X- g6 o! R, G1 Y) D
' Q6 v( d2 ^/ T$ G2 T O9 |0 \/***********DS1302时钟部分子程序******************/
! q7 ?# W+ k( Ytypedef struct __SYSTEMTIME__0 A5 E" |/ k! m
{
) ~. K7 w- N7 B& P+ n unsigned char Second;. T/ A7 J8 _3 O5 k1 S6 t4 N9 A- t
unsigned char Minute;
* ] }; l5 { k N) u) O$ n, F! ] unsigned char Hour;
/ O- a s* x5 L: T$ S) l( O( J unsigned char Week;
+ {' R& L+ [2 u unsigned char Day;3 O4 L% j( @. e. W T- O5 O0 a
unsigned char Month;
2 e; O7 e4 D8 I/ m) L5 p" h, C$ ~ unsigned char Year;! p' [9 t: y1 |) I5 p2 _, w
unsigned char DateString[11];
4 F! H* m5 H5 i, l R$ F unsigned char TimeString[9];: c: ]' G6 S# Y
}SYSTEMTIME; //定义的时间类型8 v+ p' o2 m- [. y$ o q3 s# i/ M
SYSTEMTIME CurrentTime;, v3 w0 U8 `3 d' ^# x& n5 d
0 `8 G, a0 N1 ]7 X4 ?& T
. V/ M' _+ j* ~9 K
#define AM(X) X5 s& }, a+ b% I6 x; U
#define PM(X) (X+12) // 转成24小时制+ @1 J, Z" x! v
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
9 s+ J3 X r, Q# \' s2 N9 y#define DS1302_MINUTE 0x82
3 u: P- U6 c3 l ]1 |6 B$ g#define DS1302_HOUR 0x84
# [: z, \. {6 Z; r' u" N#define DS1302_WEEK 0x8A
1 l! A6 N2 J; H4 d% W#define DS1302_DAY 0x86
5 A4 O) }- X9 l5 q( x4 v#define DS1302_MONTH 0x882 e, d4 p( _/ B: x. ?/ H# @5 q& z. e
#define DS1302_YEAR 0x8C
, C/ E# \" d5 C5 L
u; c' }! L4 U# rvoid DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
" n& h6 z$ F9 J9 a( \{
9 _! T+ @2 {. R+ m unsigned char i;
[( ^: t4 {, N3 \' a ACC = d;
# q$ b5 y* o/ S' e( W' ]5 w for(i=8; i>0; i--)
: h& Z# V+ P; p2 X: o9 N {
3 Z. L# v7 O( `0 A DS1302_IO = ACC0; //相当于汇编中的 RRC
Z7 `. E# j! m3 Q* q E" }# G DS1302_CLK = 1;4 |, H; B- j- c3 H
DS1302_CLK = 0;1 j) i0 f8 P) g9 p; n Y/ {5 e
ACC = ACC >> 1; $ r* I2 `! ^# {! h9 q' S
}
4 c- G% M# H" a0 {: Z" x4 V3 z}1 z- O: N0 d/ u }* Z1 ?0 t
# \/ | ]" c5 b7 H8 y5 w& @- o& F2 l
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
9 Z' M/ o$ H, a. ]! r2 l{ # t1 x4 U6 U( p/ k
unsigned char i;- @& B, T G$ V; ]% R
for(i=8; i>0; i--)( h; c7 J, i4 V" \+ \! K
{
& d ~$ B( q( f; n* E4 Z ACC = ACC >>1; //相当于汇编中的 RRC
' Q$ c8 q- s2 z4 N ACC7 = DS1302_IO;
8 D7 D$ e, U- C' M& c4 W$ Q DS1302_CLK = 1;
' Y- x2 V- f, A% [ DS1302_CLK = 0;: x& n+ y- K% G% M) y
} , E) v3 ?7 ]. p3 q- X7 P
return(ACC);
4 A* J: U/ Z- d/ \! s# f}& X+ j ~" T/ L! W
2 \( q; y4 u) Q& H* L* V Avoid Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
/ ~( y& Y6 H* m: r) E{& e! ]9 |: [ u `% \
DS1302_RST = 0;
- t2 J2 Q" s3 Z# C! J: B DS1302_CLK = 0;
9 l# F0 {# g; g8 R DS1302_RST = 1;
$ O9 m7 }) B8 L$ R% R7 X: v DS1302InputByte(ucAddr); // 地址,命令 & G6 a. \* w0 w, a6 T( e; X
DS1302InputByte(ucDa); // 写1Byte数据
$ P- h3 y' x) P6 ? C9 A% u! ^ DS1302_CLK = 1;
% S6 _( k8 S" {8 H) E DS1302_RST = 0;
$ B; P* T: U; Y# W& y} 5 ?% [/ h/ h7 ] c
! R* z" d; a+ J' M$ Z2 r2 W
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据/ w" t! n+ B& y
{% k" B/ B1 f) J
unsigned char ucData;
, I+ }8 o# X( H' T: u/ } DS1302_RST = 0;
$ `2 }4 T; d1 A( P DS1302_CLK = 0;0 ~: }% X% Q$ ^& K) v7 | p
DS1302_RST = 1;7 ^- x1 a) d/ P7 w# m$ k
DS1302InputByte(ucAddr|0x01); // 地址,命令
- d- g& X3 Y8 V ucData = DS1302OutputByte(); // 读1Byte数据" i5 E1 E- T5 L/ y0 Q$ g% D. v
DS1302_CLK = 1;+ [8 E3 B# k) {* _
DS1302_RST = 0;1 h0 ]/ m% P% |) F
return(ucData);2 o5 [" V! o7 i% H3 A( g6 s; U
}
0 t0 q J S1 Z, n- k7 J1 Y7 V- R5 C- V$ G. r. a
' ^9 t: B# W; |5 G) J( H" F" I5 [4 w4 W* P% q v3 [' x' `5 P
void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
3 \: k- }* `3 L% |5 q- _& @+ Z3 I{
1 s2 I' M2 @) P3 Q unsigned char ReadValue;
: n4 G8 p( u8 }+ W- M2 L( m ReadValue = Read1302(DS1302_SECOND);
/ S/ i$ G( ^4 F9 E Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
% k9 H6 |& S- Y" L ReadValue = Read1302(DS1302_MINUTE);
, V# S. q/ D3 s7 K& E- } Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);' _. M V7 s" R+ n
ReadValue = Read1302(DS1302_HOUR);
/ U2 V; I1 F$ e3 K7 ?8 t Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
, K- C3 [8 A( U E6 C1 t! w: H ReadValue = Read1302(DS1302_DAY);: L' ?% Y: `3 r# Q' a/ j
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
. m5 ]8 Y8 W: g: x% ]3 @ ReadValue = Read1302(DS1302_WEEK);! a. k. J a3 @# M9 S
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
# | j; v, {( y+ u+ e6 _ ReadValue = Read1302(DS1302_MONTH);
0 [1 e2 G9 {/ y2 f' O9 A& Y Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
2 j. r8 T- y. h7 |# n! e ReadValue = Read1302(DS1302_YEAR);
, A3 V9 l% i" F* Z; h6 d Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
7 S p9 d; d! |, Z8 f+ {, q}
9 Y: }. e7 e( i- q( y- J# i. V* d9 G% F3 V( v
void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]7 s* g$ G1 E. q/ C- k7 Z
{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22: b6 B5 K# U& ?+ ]$ Z
{ - q. ?& h- G! A/ z; o
Time->DateString[0] = '2';% s* c( W8 q+ G; P$ m- F! r
Time->DateString[1] = '0'; ' a: [7 k$ p) W1 C" L
Time->DateString[2] = Time->Year/10 + '0';) K0 p# e; y% }9 e6 [- @
Time->DateString[3] = Time->Year%10 + '0';" i3 k+ b+ o/ p6 I
}2 d0 {5 k7 }' p. D: `
else: ]" E$ V( Z+ g
{
4 q" z% s0 ^- \2 @ Time->DateString[0] = ' ';- Y5 g9 ]2 v7 A7 t% [/ f
Time->DateString[1] = ' ';
* r. L6 Z- O- h6 I" j; q Time->DateString[2] = ' ';# v! i+ N) M& U# h$ R
Time->DateString[3] = ' ';
+ R6 }% b0 I; U8 j7 j0 m" _ }# j5 r) A& z% ~0 `3 Q) Y1 n
Time->DateString[4] = '/';3 j7 }1 X5 R1 P: _# Z% [; h6 v2 m2 O
if(hide_month<2); i% n6 w& |; j8 `% W& B: ~* F# L* v
{# M/ z. y+ |( W# t* h5 @ x4 Q& O
Time->DateString[5] = Time->Month/10 + '0';
0 ` L: t- U9 C4 y4 m Time->DateString[6] = Time->Month%10 + '0';# l/ w% W2 v0 y- L
}. K4 }' P2 t! A- J+ w
else
4 E; G" v+ Q9 W8 d% h4 g6 l6 V {: b& }1 @3 q; V2 ~. A' u* z
Time->DateString[5] = ' ';& W( }0 B! ^; m' Q
Time->DateString[6] = ' ';" g: ]$ k& R9 K$ B8 Y
}
; g- Q) p- Z7 d+ I* M! } Time->DateString[7] = '/';3 l5 v- [$ ], o# R$ \; [
if(hide_day<2)9 ]) t3 k) T T& q$ w
{
- v6 a w% I Q+ x$ ?( t Time->DateString[8] = Time->Day/10 + '0';4 \. g9 s5 F3 Z5 S5 O
Time->DateString[9] = Time->Day%10 + '0';# v" ]7 b3 o w. v; {& H! g* I1 l
}
, F1 k7 g0 V4 E/ O# g7 ?$ l" `% w else$ d- Q( ~) q6 W0 l- n3 B% V
{
9 d' d' p# V8 V2 J, G5 z" T6 D Time->DateString[8] = ' ';* ^: M8 H& `$ ?8 w! U" g; J
Time->DateString[9] = ' ';
& a: E, }% _& o% f& W4 e1 k; a }, x9 P" Q8 a. Z7 u2 T" J
if(hide_week<2)& J7 g6 m9 N! W
{
3 d5 k5 D' v7 F8 |7 N! H X week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
1 C1 F, ^/ _* @" K6 m; j }
, N9 |* k* e3 I z0 t8 ~ else
3 a, J- o( j6 T6 g$ o& r- { {
) F/ I1 t& P/ b) _ @. ?3 W: u week_value[0] = ' ';
! x. f: [3 z/ ^: Q8 S# p" y }
$ U2 q) R9 b0 }' {1 [2 u" `4 u+ J week_value[1] = '\0';
: ^& G' g4 E; E% ?8 b; k' \# h5 U+ ?4 T1 Z3 ?4 K9 p
Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
. j6 X3 F+ X, I* [# F}# j5 v# w' N. B2 h7 x( ~" C6 R4 d
; R9 | o% j( Y' Y
void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];( `; e `( n, i+ h! c$ e# W: \3 T
{ if(hide_hour<2) F+ I+ ]- h* S5 n1 W
{' V3 U+ u, a- w
Time->TimeString[0] = Time->Hour/10 + '0';1 {) b7 H c% F
Time->TimeString[1] = Time->Hour%10 + '0';
+ w8 `9 l Q) x! G! Z" M }
; {9 W+ ]3 q( T; W else
: y6 l: t {/ \& ~* e! G& q {) n7 F7 K& M, d8 W9 Q0 s
Time->TimeString[0] = ' ';
3 ?6 e* u/ \4 x d/ u0 K7 y Time->TimeString[1] = ' ';7 c# R1 q; w2 ]1 h9 D2 e
}
% L! i% d$ T# ~) O Time->TimeString[2] = ':';0 v2 T- t- k5 m; R
if(hide_min<2)+ q( h3 ?. d% B& [6 r
{! P5 p8 P/ ]1 c* [1 o0 P0 N) I( ?
Time->TimeString[3] = Time->Minute/10 + '0';, l6 H% `" H+ Z* k, C) E7 a
Time->TimeString[4] = Time->Minute%10 + '0';
. A; r" d4 z- U }2 j5 I% w1 m f5 l
else7 s& A1 h; v5 w! J. B( _
{
0 s# U7 W+ l9 n" [0 r Time->TimeString[3] = ' ';. s- X- I5 D: ]' k
Time->TimeString[4] = ' ';! r V. e9 o K; T
}0 [9 _' B2 f7 y
Time->TimeString[5] = ':';# s* ]/ i) F& W% \
# x. c. L7 f" h9 a! P+ M. y( H& c, f) R8 Y" _( ~: [
…………限于本文篇幅 余下代码请从论坛下载附件…………' Z- A5 S; S2 [
$ M# u4 I; b7 {, g
X# z0 U" }4 d2 Z9 V9 a4 y' @6 x |
|