|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
带农历的电子万年历 单片机软件程序与proteus仿真
. y2 {0 m. X0 e0 |5 E# P8 q0 F
; X# D- r) | y' a3 W" ]# e
. W+ C ?$ U; r2 V- N# `电子万年历软件程序。整个软件程序分模块编写: 2 K- e' Y$ [/ J
1.包含主程序模块main.c
- p! V- @! X* b4 v H4 N 2.日历时钟程序模块ds1302.c * V1 m+ f; F( M' B
3.年历转换程序模块lunarc.c 6 |6 ^- o& H$ _; Q* a3 U5 _( W
4.键盘处理程序模块keyinput.c
% }" I& y$ F! K. a- } 5.液晶显示程序模块12864.h
. ^8 @0 [2 x8 D5 {: U 6.字模模块model.h+ E' } [! a- g- w' R* P
; X% ^& r9 x1 k7 p
& g5 p: H6 O$ u- G
' G5 l: [$ ?- p$ q) K4 M' B
1 Q# ~% V3 i* J; z+ U( Z5 v
单片机主程序:
; W2 Z# v' J: N6 [1 v#include
1 r6 t1 K* b9 p+ f, B4 s#include "12864.h"$ e% D) y3 a. C9 V$ U
#include "model.h"
" S9 X0 n+ u2 G2 t6 Y/ R#include "ds1302.h"# N: Q9 E. s, c* G: |
#include "lunar.h"
$ T3 P3 ^+ P3 R/ T1 j/ K# g; u+ |#include "keyinput.h"* F' v3 s: s8 Y$ B: Z& x
" k) `& H; ?7 p9 F/ V
#define uchar unsigned char
d6 L1 ?# G# D4 O1 X: R' Z#define uint unsigned int
& d1 h) r9 K9 D& g#define NoUpLine 18 ?4 U' q6 r+ F' t7 A$ Y) \
#define UpLine 0& @4 [6 Y" @( {3 z' k$ [8 ~& Z
#define NoUnderLine 1
]+ n/ p" Z3 }* E$ L1 u. o- v! F#define UnderLine 0% L( G& ^+ S. h0 H% a: c
#define FALSE 09 Q. H0 v& s) V8 [2 Q4 H% L; D
#define TRUE 1. E" \7 G: |+ ^0 D+ V
; s4 _' f D% L; E- U
uchar dispBuf[7];
w I- g; |2 G0 A: c9 A: Guchar T0_Count=0,Tmp_Count=0;
I, M- B, q9 H% ]4 W0 Qbit T0_Flag,Tmp_Flag,Flash_Flag;
) ^4 Q& Q& ~% m9 S/ ], b% Y. O3 H0 z* D8 }2 x- l
SYSTIME sys; //系统日期
2 @% R" W, s4 e7 BSPDATE SpDat; //农历日期9 T( B* k4 e, ^4 j. U
- }- y* H$ H! Y* ^9 W
bit Hour_Flag=TRUE,Min_Flag=TRUE,Sec_Flag=TRUE; //设置时间标志+ W+ U0 _( V; i4 b8 h
bit Year_Flag=TRUE,Mon_Flag=TRUE,Day_Flag=TRUE;+ C) L) h2 I+ s7 j/ C
4 N; u7 c E( [$ @, T* K% W; _
uchar State_Set=0; //设置时、分、秒、日、月、年等状态
8 W. F4 b, }, i3 z/ [* }! R8 A w% U' a/ s5 ]6 P2 ^) }3 y$ G
bit State_Flag=FALSE,Inc_Flag=FALSE,Dec_Flag=FALSE; //三个按键是否按下的标志' ]+ E* O3 c7 r- ^0 K5 R
4 W5 C+ k6 l* p4 X0 l, \uchar code Mon2[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
- W7 c5 b- W# I+ _/ v$ Z5 u L 0,31,29,31,30,31,30,31,31,30,31,30,31};
9 F. Y0 Y9 t$ r0 N7 B0 B) w$ k2 m% H* @ Z
/*****************************LCD显示函数******************************$ Y$ x# ^0 P) N/ ]" s" g8 f0 D4 d0 j
入口参数:
$ }% ?6 `: j1 v5 ]; t" L: w cDat: 要显示的数
0 Q8 |4 e, u- b! q$ {) R( \7 p) R X: 行数 0~7
) t2 Z6 U; |8 [ Y: 列数 0~127
( ]& V( G% e L1 p: `3 q# m show_flag: 是否反白显示,0反白,1不反白 . ?5 p" n: g3 \
upline: 上划线, 0表示带上划线# K @4 U3 [1 g+ K
underline: 下划线, 0表示带下划线, u4 p" S# b0 o4 c
***********************************************************************/5 }0 Y0 m2 L5 S
void LCD_ShowTime(char cDat,uchar X,uchar Y,bit show_flag,bit up,bit under){0 o% p/ z8 s9 K8 V8 w5 r9 g
uchar s[2];, j5 o" J& I# f9 y9 V
s[0]=cDat/10+'0';
1 W* i( ]3 z' h s[1]=cDat%10+'0';
4 {4 Z& w. W. V# {( f en_disp(X,Y,2,Asc,s,show_flag,up,under);
" X7 G2 c R; B1 `4 ^ G. E1 a}
: E7 ?+ q1 j; D1 p) Z
9 m7 ?& O+ V( V% H! J* j+ r6 C0 pvoid Show_YMD(){ //年、月、日、星期、显示函数
2 I* A) U, Y2 P, H uchar uiTempDat;
7 F, m6 r* Z$ ? uiTempDat=RDS1302(0x88|0x01);
0 r! H* A3 N- S& q& Q sys.cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);
! s7 \, F- A3 n3 w: E( {: t% e LCD_ShowTime(sys.cMon,2,5,Mon_Flag,NoUpLine,NoUnderLine);
+ ?1 n' `* U2 a/ B+ z6 K( k+ ~ hz_disp(4,5,1,uMod[1],1,NoUpLine,NoUnderLine); //月1 ^2 U9 c% D1 X
Show16X32(2,27,ucNum3216[sys.cDay/10],Day_Flag); //日. r5 R# } |0 r4 F/ L/ p. P7 X. H
Show16X32(2,43,ucNum3216[sys.cDay%10],Day_Flag);
$ O0 E/ ]6 C7 V! C" t7 r# m hz_disp(6,8,2,ucLunar[13],1,UpLine,UnderLine); & U" t' r O6 M/ o, g
if(sys.cWeek==7)+ V8 |1 [0 a, @
hz_disp(6,40,1,uMod[2],1,UpLine,UnderLine); //星期
4 ?6 X1 y5 C, { else% N9 P+ {0 ?/ G
hz_disp(6,40,1,ucLunar[sys.cWeek],1,UpLine,UnderLine); //星期
8 r* P8 g- s+ o U" l$ V LCD_ShowTime(20,0,9,1,UpLine,UnderLine);$ U. O1 `2 g( U, Q. j+ W0 {
LCD_ShowTime(sys.cYear,0,25,Year_Flag,UpLine,UnderLine);6 Q& V2 H# E+ E: y2 \' A
hz_disp(0,41,1,uMod[0],1,UpLine,UnderLine); //年
$ A: @8 o- B+ P5 a6 v8 K7 ^( u/ E4 L
SpDat=GetSpringDay(sys.cYear,sys.cMon,sys.cDay); //获得农历
, z4 j, J6 W* |# P9 b4 ?% O if(SpDat.cMon==1) //显示农历月
4 K. V3 q- X' z5 S hz_disp(4,64,1,ucLunar[15],1,UpLine,NoUnderLine); //"正"7 s! X F( R9 t; W1 `: U# h
else if(SpDat.cMon==11)
; m" [7 ?! D4 s) t- y- o hz_disp(4,64,1,ucLunar[16],1,UpLine,NoUnderLine); //"冬"; v" h# @ K1 u& s4 c7 V
else if(SpDat.cMon==12)
2 I2 a5 {4 F7 m% F9 Z4 W hz_disp(4,64,1,ucLunar[17],1,UpLine,NoUnderLine); //"腊"
' k+ x4 W: Z' F& A( p else
0 q; J( q/ l# |6 o" E: t: f0 t) K hz_disp(4,63,1,ucLunar[SpDat.cMon],1,UpLine,NoUnderLine); //"二"~"十"
3 p2 R% Q# b4 ?9 c9 t$ D; p if(SpDat.cDay/10==1 && SpDat.cDay%10>0) //显示"十" 例如"十四"而不是"一四"5 X9 k$ F& i0 y0 j, G B, o
hz_disp(4,95,1,ucLunar[10],1,UpLine,NoUnderLine);3 T# A, H9 y; E. y# ~
else if(SpDat.cDay/10==2 && SpDat.cDay%10>0) //显示"廿" 例如"廿三"而不是"二四"$ Z- s" R4 w& D4 z
hz_disp(4,95,1,ucLunar[19],1,UpLine,NoUnderLine);, \ T2 g3 ?3 N8 c8 M6 v
else
6 x- ?% ]8 L$ L6 M* w) S0 K& i hz_disp(4,95,1,ucLunar[SpDat.cDay/10],1,UpLine,NoUnderLine); //正常数字
9 z7 B# J, m4 ]4 p; O if(!(SpDat.cDay%10)) //"十"' `, H X* z: W i9 M4 H
hz_disp(4,111,1,ucLunar[10],1,UpLine,NoUnderLine);
" \6 l' P: N: Y J+ v1 X' \ else //正常数字
$ X1 U* p2 u& `% E hz_disp(4,111,1,ucLunar[SpDat.cDay%10],1,UpLine,NoUnderLine);1 @# d; t$ E' V
* H1 e. g! _4 i0 L
hz_disp(0,104,1,SX[(uint)(2000+SpDat.cYear)%12],1,UpLine,UnderLine); //生肖) [' T6 C4 E/ Q) G, R* A
B! y& [9 w8 X4 k0 Q; P
hz_disp(2,95,1,TianGan[(uint)(2000+SpDat.cYear)%10],1,NoUpLine,NoUnderLine); //天干% e( j9 w" F& C+ W$ U F. k
hz_disp(2,111,1,DiZhi[(uint)(2000+SpDat.cYear)%12],1,NoUpLine,NoUnderLine); //地支
P. D4 @9 g8 [# M}% B) [* c- G# r4 R) J
6 j4 Z# t' o* I5 g8 s7 f( Evoid LCD_ShowWNL(){ //万年历显示函数- Q+ C9 j( h+ R4 R3 @
LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine); //秒,每秒钟刷新
! {: T8 [9 n: ~ if(!sys.cSec || State_Set) //分,普通模式每分钟刷新, b6 q: Z5 _* }8 }" u1 r
LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); // 设置模式每次刷新
8 w4 R' _7 H9 e1 Z# x. B
) c% D1 ?& S! Q) A8 K6 q# f& ^ if(!sys.cSec && !sys.cMin || State_Set) //时,普通模式每小时刷新* S3 k# T3 J: N% c2 ]
LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine); // 设置模式每次刷新5 z4 X; H" o) m. ^3 ?; p$ y
: [0 U! U( N* q1 z. F if(!sys.cSec && !sys.cMin && !sys.cHour || State_Set ){ //公历农历的年、月、日、星期
0 a, V- q1 a0 h3 k' Y) a8 P! \ Show_YMD(); //普通模式每天刷新
0 L% X% Y" B# K/ }+ s0 i/ m if(State_Set==7) State_Set=0; //设置模式每次刷新
: S# ~6 U9 H# ^( T; h; b }
1 i- H8 U' M3 R0 `0 A4 Y6 D}
$ z. |, L% f# x) f" z
8 g" N: W: n) V8 [! s& tvoid CAL_Init(){ //日期初始化函数$ |/ y" b5 n) f; F
sys.cYear=0x13; //BCD码表示的日历时间值
0 T7 B) I$ J; b N sys.cMon=0x06;
/ c7 C; R& E, P n% v sys.cDay=0x030;
0 `% I6 x! m- N) n sys.cHour=0x23;
/ o. }8 R. a$ | K l sys.cMin=0x59; N9 x; }( m$ g c% f/ u/ T
sys.cSec=0x55;3 {4 Z* n: x5 f: T* P( R
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);. v6 u( D. g/ @0 i. L
}
6 L! ~9 Z6 _, l6 ^0 Y
N$ Q# \* r0 J \0 K: Rvoid SFR_Init(){ //定时器1初始化函数+ K$ f2 h, _ b
Flash_Flag=FALSE;
, n; ~* F5 F6 k2 }1 q) C3 r TMOD=0x11;
( L4 I, U2 D+ m& @( g/ m: x* ^ ET1=1;
9 {4 Y* J; `/ a1 o; ] TH1= (-10000)/256;
: {/ y: H9 J: s7 ?! T: R$ o, ^ TL1= (-10000)%256;/ k* q1 o) R A& _0 f1 [+ f
EA=1;
' j8 T$ C4 S& E. u. H}7 v* H9 ]9 W7 m& a
; C: h" V% u) U, h/ Zvoid GUI_Init(){ //LCD图形初始化函数- {% {. T, R# X9 R4 Z( W6 L
LCD12864_init(); `- H6 _0 Q K; Z
ClearLCD();
" |2 q9 n9 @9 P Rect(0,0,127,63,1); //描绘框架( W4 O+ ^7 ?2 ?8 t# K
Line(62,0,62,62,1);* X. j7 S( L" A, c
Line(0,48,127,48,1);
8 ]3 f) Y3 p$ A9 h3 p) s% e4 J+ s Line(0,15,127,15,1);- p! o2 P: O" p) G N
Line(24,15,24,48,1);
- O& I2 `# f8 S! s' @ Line(63,32,128,32,1);' p) A5 ^ F! j+ r# P+ V
1 B6 v0 n2 m( w+ o% P
SetTime(sys); //设置时间) V# `. F G8 ]3 h+ v% Y& p
GetTime(&sys); //获得时间
+ P- B+ P5 J7 |5 c. b0 T% b. d; Z' p! ]$ u9 W/ ^( F
Show_YMD();
. m* [- `. ~% G* X! @' M LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);& h9 M U2 v2 K4 G, Z3 v
en_disp(6,103,1,Asc,":",1,UpLine,UnderLine);. G7 }( b$ {! P
LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine);
5 | q- b3 b) t' H. P9 C& c en_disp(6,79,1,Asc,":",1,UpLine,UnderLine); 2 b# N I' z/ _. y' t' c
LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);
/ \; S' x+ u. K0 D+ l
# {' h, A/ A6 ], E! M hz_disp(2,64,1,ucLunar[11],1,NoUpLine,NoUnderLine); //"农"' U, V( s0 b# f) E
hz_disp(2,80,1,ucLunar[12],1,NoUpLine,NoUnderLine); //"历"
/ u% Z" ~3 ]! T; V. f hz_disp(4,79,1,uMod[1],1,UpLine,NoUnderLine); //"月", s9 J7 l: w5 o* }' ^
}/ z6 d. |3 y2 X6 \& U
, }5 O- P5 g7 Gvoid DecToBCD(){ //二-十进制转换函数
: X. {' a4 B. s7 }. L sys.cHour=(((sys.cHour)/10)<<4)+((sys.cHour)%10);
& k6 }6 a- F+ ~, @4 H sys.cMin=(((sys.cMin)/10)<<4)+((sys.cMin)%10);; T B! x% t/ [* L9 a
sys.cSec=((sys.cSec/10)<<4)+((sys.cSec)%10);
6 b( t4 E2 r( n! L# k sys.cYear=((sys.cYear/10)<<4)+((sys.cYear)%10);1 ]8 S: W- E% i6 ]) ^
sys.cMon=((sys.cMon/10)<<4)+((sys.cMon)%10);1 `7 p. m) T! t2 z8 y& M7 e
sys.cDay=((sys.cDay/10)<<4)+((sys.cDay)%10);
% T$ b5 H& @: V& k}
1 ] e) @7 N' o7 \
1 \( Y q. c+ K, ~: @& Zvoid Time_Set(){ //时间设置函数. x$ H4 c/ M4 u2 Y9 A
if(State_Flag){ //设置键按下; Q2 _: j3 S0 q0 @" j8 b! c
State_Flag=FALSE;+ L `7 J* v6 v. i. }% k, Y
State_Set++;
' y4 I! C9 q* E5 [) s5 X if(State_Set==8) State_Set=0;
9 T l+ ~$ o0 m! | }5 d( _1 e& U! y2 l- e9 j( N/ e* ?' Q8 s2 c
, P: `4 W% l0 z- U1 V: Y
Hour_Flag=TRUE;Min_Flag=TRUE;Sec_Flag=TRUE;
+ G" `6 Y; j( d" j* \ Year_Flag=TRUE;Mon_Flag=TRUE;Day_Flag=TRUE;
7 A- R* {$ J" i' U2 s1 l( t' R% |3 s5 J- }' n: w" g) J/ W
switch(State_Set){ //设置类型8 m0 _0 @2 g! K4 p( X) g3 T6 `
case 0: //无设置0 ^0 D. k; C% J
break;
/ p* I v7 h0 ]0 I+ |8 U case 1: //设置时 k) G" f$ k% p# h+ c3 ?' w4 U
Hour_Flag=FALSE;
. `( R/ o1 w6 W: }3 i- z break;
3 o a. l! j8 z* ] H- U case 2: //设置分3 j5 n. J0 d: n; @7 j6 N
Min_Flag=FALSE;
$ V3 [ m0 Z1 |2 v break;
8 w( q& |; `! g' m K case 3: //设置秒
! H: B* ?$ n+ ~6 J1 S4 C Sec_Flag=FALSE;( Z* @; x- ^3 I
break;. [: E# {* X. i8 Z
case 4: //设置天
; d$ @- ]- n) Q7 @ o Day_Flag=FALSE;
# E+ u7 ^( \6 T h9 S+ U break;
- j% S" W1 x+ a% Z; X case 5:
) c+ a8 e1 H& h. y! B& \2 Q8 b1 G Mon_Flag=FALSE; //设置月. z8 `7 Z6 G- c- |6 a, u/ \5 Q
break;9 i$ K# V/ B- L2 r$ M; O/ O; T* p9 j
case 6:+ s2 x) k8 |: k: \8 E
Year_Flag=FALSE; //设置年
" E; g; m" l/ ` break;7 v3 Q* U4 f6 |3 X
case 7: //无动作,设置此值为让"年"的反白消失。9 p/ Y7 j! ^) M, o! r a
break;
. \1 j# s3 X7 c }
& U. Y" ^8 Q! A1 o H4 W" I) w% g, a1 w8 |; h ]
if(Inc_Flag){ //加键被按下! R2 p6 i8 J7 @3 {) d
Inc_Flag=FALSE;, ~3 }- h7 |9 X
switch(State_Set) {: j8 K0 Y I( R
case 0:
% Q' b, i r& T) m, [ break;
$ n8 T$ D9 R) G case 1: //小时加
* M) \2 @( u2 m) v! a1 z+ I sys.cHour++;
7 T' k0 K3 n1 E& n+ z1 M0 m' I8 o (sys.cHour)%=24;) t& _% g" Q* M0 Q1 ~0 i0 {
break; M# C7 g' Y- @ B
case 2: //分加1
: G# z7 A/ [ _8 f$ h' T sys.cMin++;
( d) z! r. @9 ^0 M) F$ P( p/ ^ sys.cMin%=60;4 N9 {( S6 h% _ {+ k5 \6 _
break;8 V) ~+ N8 W j
case 3: //秒加1
& z& X5 }( F1 |1 |. f. b sys.cSec++;
- ?$ k: @9 P- s2 q sys.cSec%=60;% U# b" J& x) ?( A8 \/ h
break;
/ B$ s4 Q3 W L. h1 A' J case 4: //天加1
. ^3 |: y, x) z$ y; l3 [+ f0 H (sys.cDay)=(sys.cDay%Mon2[YeaRFlag(sys.cYear)][sys.cMon])+1; ; T' L- m7 Z, x4 a( g! W2 k
break;. C# P/ M/ q7 z* j
case 5: //月加1
: N( \: v- c* h9 l1 t sys.cMon=(sys.cMon%12)+1;
2 o, j* ^9 w4 t0 \. k) v break;
+ p1 I) k- H5 O& T case 6:& W- M6 b$ ]3 t- h5 g/ B
sys.cYear++; //年加1
; c! n; {& h( c" L$ c sys.cYear=sys.cYear%100;
) y. b7 J! b: I break;
, g9 B! K% S# w( S" Y/ b3 U }
4 r/ Y, [+ Y1 c/ t# u4 j# w DecToBCD(); //转为BCD数/ f3 U& [6 G, A) d; ?$ _
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay); //算出星期
0 h2 |5 |/ V: `. }/ w& Q3 \ SetTime(sys); //存入DS1302
0 K% i2 B# D5 `( M8 V }- |' R& @; u7 ]. |$ K
& r+ b) ~0 K7 i6 w8 Z( q" e( d
if(Dec_Flag){ //减键按下 P- Q$ N5 T- p2 ?1 i, T1 C
Dec_Flag=FALSE;
: _: u- {8 Q7 d* R% [ switch(State_Set){
D. _' @) `0 m+ r+ }+ Z Q0 U case 0:
9 l9 o$ [' [6 r' Y/ z break;
2 F: r( R$ D' S. ~. N case 1: , ?% |) A$ E" n0 s
sys.cHour=(sys.cHour+23)%24; //时减1& w# c1 G+ v) [8 C
break;
7 D5 F6 F- `! |$ Z$ b case 2: //分减14 m4 u1 r) X0 ^3 R
sys.cMin=(sys.cMin+59)%60;
9 w% L5 v6 n- ^ break;9 u+ B5 N) M e* R
case 3: //秒减1$ W0 T5 g5 P2 a+ t
sys.cSec=(sys.cSec+59)%60;( e, Y3 P9 [' j5 j" F! C% ?5 u. J
break;
0 ~7 N" Z9 S& A7 U case 4: //天减1, M3 H: D, I5 Q: B$ n6 g, P
sys.cDay=((sys.cDay+Mon2[YearFlag(sys.cYear)][sys.cMon]-1)%Mon2[YearFlag(sys.cYear)][sys.cMon]);
# t% F+ D. x5 U, I) D( g- x, B$ ]+ D if(sys.cDay==0) sys.cDay=Mon2[YearFlag(sys.cYear)][sys.cMon];2 q0 h+ A9 j+ I2 A* P
break;
( }1 h$ Z4 s: x, w0 ?' u case 5: //月减1
7 k: r9 p7 ]! S; L) ?) e6 @/ |+ w6 G sys.cMon=(sys.cMon+11)%12;7 r/ Y% K) B; W. v. C
if(sys.cMon==0) sys.cMon=12;" x* P& C6 x7 ^1 M% i
break;5 v* |$ P( e/ a5 E
case 6: //年减1
: O+ J$ T/ w( n$ P4 i sys.cYear=(sys.cYear+99)%100;' m* d7 u) g! Z. V0 a4 Z
break;
) R7 K' X: e8 T( r7 d }
+ ?# q9 ]! a6 W, g! v! Q( O DecToBCD();
' N- @2 ^/ ^9 _" r sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);
! C& g, L0 t2 D2 p9 S9 c SetTime(sys);
1 e2 Z1 A5 N/ l$ ~ }
2 \3 ~/ t" m( w" M$ { x2 J7 u}( I0 W2 u- M& N( R$ Y
, b! T* B1 K1 z# Z7 ^1 p
void main(){ //主函数; b, B# K3 K( g' ]; s
SFR_Init();2 P: X n4 C# F/ V* ^. `) G% W
CAL_Init();% k: z9 u. r1 A. X
GUI_Init();- F! ?0 z# d {4 ?2 T4 p
TR1=1;
2 L% l$ o7 N5 e1 `* i0 ~3 L% i! O while(1){
# n$ X2 G8 V9 v/ I3 K8 Z8 |1 m GetTime(&sys); //获得时间' g/ N- f7 F& M
LCD_ShowWNL(); //显示万年历
' d+ g5 q9 I! `' L Time_Set(); //时间设置3 V# H& y$ h1 y7 B$ ?( D9 ^6 O5 L
}
* t. N4 Y b1 S) d$ E! j}% o% U' Q% c7 y8 K
$ f9 m8 C& X: R4 @# I2 w* c0 }void timer1() interrupt 3 { //定时器1中断服务函数( g/ j1 H3 H+ R1 h l) E: |
TH1= (-10000)/256;3 \' b* s. x! U3 z* y
TL1= (-10000)%256;, i6 _) J4 G2 h4 I+ Q+ O5 t3 `
keyinput(); //读取按键& g: e$ }) W( R4 v# H# t' Z
if (keyvalue&0x10){ ; ^" w, ?. V. i6 y& C
State_Flag=TRUE;
2 p1 b" B% o( b+ U9 V, Y keyvalue &= 0xef; //清键值,保证一直按下只执行一次按键动作。) a) r q# r6 @
} & }8 \5 \/ h9 V2 ]& o! i
if (keyvalue&0x20 ){ //加# D/ g# b5 o# j, o1 t4 @ B; d
Inc_Flag=TRUE;+ Y4 B% Q' I) D5 b
keyvalue &= 0xdf; //清键值,保证一直按下只执行一次按键动作。 J" w! E" g" @; @* H, w* b
} 1 l/ J0 Z) H7 z' m# m( K9 c* q
if (keyvalue&0x40){ //减
, D8 e8 G1 ]# V0 G! [6 `+ F/ ]1 O Dec_Flag=TRUE;
5 B i" }5 \& H9 ]2 ]5 ` keyvalue &= 0xbf; //清键值,保证一直按下只执行一次按键动作。
: p/ b' t0 t% ^' e& Q }) Q& t6 U, k* M1 C8 F. b7 M
! g2 K- j1 T0 U% I' A% i}
# R' t7 @+ _% f5 ~! s ]$ u' h4 B! c5 S* Q
下载:: \5 L: R* ?2 S7 a+ k/ u
: b2 D5 V! m! C$ c
( b( _! P, X# o |
|