|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
带农历的电子万年历 单片机软件程序与proteus仿真6 B4 i7 R/ y g) f- t" e
# g& c( v) c( K
4 X* T1 D1 U* g7 C+ O1 M: G
电子万年历软件程序。整个软件程序分模块编写:
4 r7 ^ K) v2 E9 g$ \$ I& W+ A 1.包含主程序模块main.c
u+ `/ G$ b5 G 2.日历时钟程序模块ds1302.c
# N, } s: S; F% h' N! P7 G- u9 p 3.年历转换程序模块lunarc.c 6 J3 f' R6 v; ~/ Q5 r1 R; B) R
4.键盘处理程序模块keyinput.c 3 `/ h) V# E0 Y" ]
5.液晶显示程序模块12864.h
4 f/ q- Y+ |1 h- r 6.字模模块model.h/ _3 i6 g/ P) w" y0 T
5 g ?: L2 D' f
1 d$ M6 A2 r: m
6 ?1 V& }/ l3 L( B
4 [& S ~$ F9 i( b" J: p单片机主程序:: j) u, w t( s1 R
#include l7 k7 q0 z T, K, u
#include "12864.h"1 ]' W! }- f& I) E6 k0 W
#include "model.h"; [% [7 [8 n! ]
#include "ds1302.h"
( `/ `& F; m( S4 p1 Z#include "lunar.h". f1 e& K" q) ~/ D: {# Z
#include "keyinput.h"+ Y# t& ~4 A( `( _* D3 t% A" @4 z
+ B) g$ \: M% a
#define uchar unsigned char
. { W1 `; {6 M6 z# r, Q9 l#define uint unsigned int2 J, z2 _5 y2 z) L9 I
#define NoUpLine 1: L* m1 `4 T9 P! Y0 a
#define UpLine 0/ ^2 V/ Y0 v3 Y# B! s! X% V, a
#define NoUnderLine 1* q! X" u& W( Y% L
#define UnderLine 0
+ G6 V0 D; t& ^8 T#define FALSE 0
7 q6 b- \* r$ V3 m# O1 P#define TRUE 1
. N7 m2 J2 f" D: }, c) O+ T- M3 j/ A% n6 T# v& b
uchar dispBuf[7];9 M0 Y- A( Z, Z+ C9 K* j
uchar T0_Count=0,Tmp_Count=0;. ~& c$ |3 Z9 U( a
bit T0_Flag,Tmp_Flag,Flash_Flag;2 d$ |6 s$ J! Z3 j; Y
$ ~# }+ G; s" ^SYSTIME sys; //系统日期
7 j% Q# K+ G' W2 U6 h/ l( f; kSPDATE SpDat; //农历日期" N# T1 o' M- s2 P( v+ C# q
0 G8 l% Z5 j) d3 {
bit Hour_Flag=TRUE,Min_Flag=TRUE,Sec_Flag=TRUE; //设置时间标志" z' m& O& Q# V' c( K) `
bit Year_Flag=TRUE,Mon_Flag=TRUE,Day_Flag=TRUE;% ^& T0 J4 V1 a! h3 J4 M* p
0 W, k7 v( R6 X0 D, l) [uchar State_Set=0; //设置时、分、秒、日、月、年等状态
, L8 M4 Z4 W; ~4 B R
- B7 l3 B/ W! o' R2 t9 \bit State_Flag=FALSE,Inc_Flag=FALSE,Dec_Flag=FALSE; //三个按键是否按下的标志
& o0 W+ |/ A0 {6 l- p% ?$ V$ R- C6 t l" ^
uchar code Mon2[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
8 _( K' r8 E( \# J) W6 n. L 0,31,29,31,30,31,30,31,31,30,31,30,31};; H' k7 D' p6 }
1 x5 ^. S7 P+ M% C0 h/*****************************LCD显示函数******************************9 u) e c4 ] m s, a6 m
入口参数:5 X/ o# n' X' K( }
cDat: 要显示的数) C; u7 t0 p( g
X: 行数 0~7
8 w( F3 t v9 D; |& z Y: 列数 0~1274 ~. b5 ?% f6 Z% N
show_flag: 是否反白显示,0反白,1不反白
: o. ^) I: x3 y( r- E; D. W0 y upline: 上划线, 0表示带上划线
) M! g) q' Y; }2 O& M+ w8 C7 ^3 e underline: 下划线, 0表示带下划线
; {5 Z, r1 A6 _2 I: J0 x9 N***********************************************************************/
1 l2 _6 J/ n: ]/ w/ Dvoid LCD_ShowTime(char cDat,uchar X,uchar Y,bit show_flag,bit up,bit under){
& _ c* N' d0 R0 O uchar s[2];
9 W8 J; q" z. j5 w5 Z. N s[0]=cDat/10+'0';6 @; }+ K0 y. n X4 R# k( T
s[1]=cDat%10+'0';; |! d3 W- O) X* ?$ q
en_disp(X,Y,2,Asc,s,show_flag,up,under);: r8 \* [" R- o
}/ h; I3 l$ G0 e2 W
7 N \: C% h' {3 Q- R: Mvoid Show_YMD(){ //年、月、日、星期、显示函数% V8 T% ~+ C- d: V
uchar uiTempDat;1 Y0 {0 P# D ~+ ^) |9 c+ Y H
uiTempDat=RDS1302(0x88|0x01);
7 L( N- m0 s- u* L sys.cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f); ' y! o8 l$ u) |( t9 I# r+ [
LCD_ShowTime(sys.cMon,2,5,Mon_Flag,NoUpLine,NoUnderLine); ; j- ^! S+ R" ?5 G2 @5 T C
hz_disp(4,5,1,uMod[1],1,NoUpLine,NoUnderLine); //月
( Q9 M, J0 K8 a Show16X32(2,27,ucNum3216[sys.cDay/10],Day_Flag); //日
# L0 y4 }* l8 t/ j6 T9 }( N M" l Show16X32(2,43,ucNum3216[sys.cDay%10],Day_Flag); 5 p; X3 f M$ z6 G* C6 H" w
hz_disp(6,8,2,ucLunar[13],1,UpLine,UnderLine); ' ~9 i) C0 j$ H, S( C
if(sys.cWeek==7)& Q( f5 w A6 f6 y: H. k
hz_disp(6,40,1,uMod[2],1,UpLine,UnderLine); //星期
& O4 g9 t. p8 t8 Q1 M* O else
: x5 W7 t; l& }$ ]6 `* x) R hz_disp(6,40,1,ucLunar[sys.cWeek],1,UpLine,UnderLine); //星期& C0 U2 }& ]/ G# r
LCD_ShowTime(20,0,9,1,UpLine,UnderLine);
& z% b1 i/ E1 H* b: b7 D- } LCD_ShowTime(sys.cYear,0,25,Year_Flag,UpLine,UnderLine); i8 x4 X* r( W# q
hz_disp(0,41,1,uMod[0],1,UpLine,UnderLine); //年* |2 z" i3 O2 n' Z
1 R! g3 d6 D5 J4 s
SpDat=GetSpringDay(sys.cYear,sys.cMon,sys.cDay); //获得农历
, d; P: o/ B, _) F) K. E if(SpDat.cMon==1) //显示农历月
! {, I" b: L) B0 X2 ~) [ hz_disp(4,64,1,ucLunar[15],1,UpLine,NoUnderLine); //"正"- b8 g: y1 u: H
else if(SpDat.cMon==11)
! t! M* c! O- _8 Q# E1 n* E hz_disp(4,64,1,ucLunar[16],1,UpLine,NoUnderLine); //"冬"( R! g) q; R1 B% D
else if(SpDat.cMon==12)- {% z% ?# Z! V% Z$ P
hz_disp(4,64,1,ucLunar[17],1,UpLine,NoUnderLine); //"腊") ]5 n" r: a. S+ }
else
|2 r5 l' ]3 L* T1 U hz_disp(4,63,1,ucLunar[SpDat.cMon],1,UpLine,NoUnderLine); //"二"~"十"( u* ~/ w) {2 z& D: {8 h
if(SpDat.cDay/10==1 && SpDat.cDay%10>0) //显示"十" 例如"十四"而不是"一四"- G7 y7 u5 ` i ]& Q# M
hz_disp(4,95,1,ucLunar[10],1,UpLine,NoUnderLine);
; k- L$ h! |2 z/ k else if(SpDat.cDay/10==2 && SpDat.cDay%10>0) //显示"廿" 例如"廿三"而不是"二四"7 Q2 d, G% y* A# _' v
hz_disp(4,95,1,ucLunar[19],1,UpLine,NoUnderLine);
6 s' W. t% E" C9 I7 X6 N2 [! f else
2 C: v) c) @; W/ a# y hz_disp(4,95,1,ucLunar[SpDat.cDay/10],1,UpLine,NoUnderLine); //正常数字/ v$ C' R; M- @. ~6 A$ a1 j# r. z
if(!(SpDat.cDay%10)) //"十"6 @7 S* x# p8 F
hz_disp(4,111,1,ucLunar[10],1,UpLine,NoUnderLine);6 f% z! ~ F8 \. M3 \- D3 X
else //正常数字
0 l& g( {' b7 I) o2 j' [' S0 v hz_disp(4,111,1,ucLunar[SpDat.cDay%10],1,UpLine,NoUnderLine);
. y* R. m# z5 h7 t, `/ N6 b% O/ y# n) j' M% o& ^
hz_disp(0,104,1,SX[(uint)(2000+SpDat.cYear)%12],1,UpLine,UnderLine); //生肖
1 J% c9 o' J5 Z
! \$ H/ k9 W5 w# g# F& A. N hz_disp(2,95,1,TianGan[(uint)(2000+SpDat.cYear)%10],1,NoUpLine,NoUnderLine); //天干
+ v. }* `( b( e& @; j! a9 E, D2 z hz_disp(2,111,1,DiZhi[(uint)(2000+SpDat.cYear)%12],1,NoUpLine,NoUnderLine); //地支
0 b9 h, C, b5 f7 V}- d' d6 R4 H/ W$ ?
" S% ^% D- l2 S3 _6 r3 b- I
void LCD_ShowWNL(){ //万年历显示函数
s; [' Y$ `7 b$ K/ r/ E9 T: S LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine); //秒,每秒钟刷新0 ]5 ~& Q3 }/ y6 `
if(!sys.cSec || State_Set) //分,普通模式每分钟刷新
2 N' a- k. n4 O LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); // 设置模式每次刷新
. I$ o, N2 Y, M4 { u" K! a9 l. q% k- r3 l" }
if(!sys.cSec && !sys.cMin || State_Set) //时,普通模式每小时刷新
7 r2 {( N6 h. G6 u; e) ?/ e LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine); // 设置模式每次刷新# v* `/ g) U# j) @6 v$ g
; }6 e4 x% {' \1 o% q& p
if(!sys.cSec && !sys.cMin && !sys.cHour || State_Set ){ //公历农历的年、月、日、星期. @5 Q0 _9 \$ m, K- ?9 i, s6 o
Show_YMD(); //普通模式每天刷新
6 P. c" E7 R8 Y: L( E1 `6 d$ [& M# \ if(State_Set==7) State_Set=0; //设置模式每次刷新1 Q3 w- C/ _8 ?, X$ r6 b4 S. H" u
}
# U2 t& z. |1 m3 F/ Q- ]}
0 D! @. i! W0 P0 f3 B1 b0 ]- H5 H; w3 l9 A% S% s
void CAL_Init(){ //日期初始化函数7 d1 J$ h$ F/ S
sys.cYear=0x13; //BCD码表示的日历时间值+ q# i! p3 S5 ~9 W' G
sys.cMon=0x06;- S% g" X$ ^7 C% ]9 {1 t9 j& j+ U
sys.cDay=0x030;
7 ~" T9 `- k/ h: t sys.cHour=0x23;- X$ t; O/ s5 S4 ]+ d
sys.cMin=0x59;
0 | y2 l3 z# e4 G sys.cSec=0x55;6 L3 f7 N# e# o% c
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay);
7 A* C3 J+ t% }# o! b F}2 x9 }; ^7 g1 W4 b/ [. U' b
! l, F/ h" ]8 X" y) ~' `" v
void SFR_Init(){ //定时器1初始化函数
) d/ X3 `2 ~4 R" U- l5 ^ Flash_Flag=FALSE;- T/ i+ c4 a! x
TMOD=0x11;
. b1 R% d3 C2 D& H ET1=1;
! }& w! U& C9 q: F5 x% Q# \ TH1= (-10000)/256;
+ o) f; w8 m8 p# g* @ TL1= (-10000)%256;( D: z4 k9 p* g! D. }
EA=1;! [ u8 | X5 _+ [+ Y. ]
}( Y' @' ]: T" W8 X; O6 m2 S
4 g3 E" G) u4 [: B- fvoid GUI_Init(){ //LCD图形初始化函数3 q7 F0 c+ c1 |6 n G: r9 R+ `2 C* Y
LCD12864_init();
: R3 `+ c5 j8 T& W, K8 ` ClearLCD();
( F! [1 k& r* r$ ~2 |. x5 ?% } Rect(0,0,127,63,1); //描绘框架: x, l. ]$ q3 Q d
Line(62,0,62,62,1);
5 K6 M& v) u1 Z q8 r Line(0,48,127,48,1);
- N' ?8 j* D: j6 E2 Q Line(0,15,127,15,1);; D8 v2 u: }* ?, `- d p+ l" _
Line(24,15,24,48,1);: `% c' C! ?) N1 ?& i
Line(63,32,128,32,1);0 P# J+ B) D. k% j6 l: e2 v
$ X. ^6 y- u" M' ^" v" P0 w
SetTime(sys); //设置时间; L) t2 `& h5 f" X& L6 t
GetTime(&sys); //获得时间
( w# [) |4 `, p$ e N
2 N$ ~2 m4 t4 S/ M8 J& u Show_YMD();
% u0 X9 r+ A; K LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine);5 `. [0 x0 Y" Y. t' x
en_disp(6,103,1,Asc,":",1,UpLine,UnderLine);
2 R7 w+ K/ m3 H `6 p LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); 6 y& m. [# ^6 o7 @
en_disp(6,79,1,Asc,":",1,UpLine,UnderLine); 2 r4 }6 z" s$ w$ G
LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine);
9 `, D- J5 b2 Z1 @3 y5 v, R4 ]: Z9 n
1 p2 |0 ?# d3 } hz_disp(2,64,1,ucLunar[11],1,NoUpLine,NoUnderLine); //"农"7 T; _1 M( R5 ~& Y' H2 G
hz_disp(2,80,1,ucLunar[12],1,NoUpLine,NoUnderLine); //"历"9 {" V2 L+ b' l# W
hz_disp(4,79,1,uMod[1],1,UpLine,NoUnderLine); //"月"
2 n [0 J: H; C0 Y2 E+ ]}' w0 Z/ N- F' b0 {5 S; ~
) ~! l/ b8 n) @. v- Hvoid DecToBCD(){ //二-十进制转换函数
4 s( }3 p; n, z; m" Z; H1 @) G( f sys.cHour=(((sys.cHour)/10)<<4)+((sys.cHour)%10);
, L W9 a9 b" j3 J* d N sys.cMin=(((sys.cMin)/10)<<4)+((sys.cMin)%10);8 }6 a+ U# R1 @" A0 s
sys.cSec=((sys.cSec/10)<<4)+((sys.cSec)%10);2 f; I3 u8 Y( S# B! w' k& K. s
sys.cYear=((sys.cYear/10)<<4)+((sys.cYear)%10);' O; S; T# Z% ]% @9 a
sys.cMon=((sys.cMon/10)<<4)+((sys.cMon)%10);
0 j; T+ i, ~+ |6 V sys.cDay=((sys.cDay/10)<<4)+((sys.cDay)%10);
/ c S$ s S( ~& @! A l}
3 Z! ^4 r+ u4 k. M) C5 v
1 ?: C& e3 l8 Pvoid Time_Set(){ //时间设置函数! s+ G9 l2 Y8 W
if(State_Flag){ //设置键按下
/ m4 Y( B0 h; c, b. U' E State_Flag=FALSE;
8 A0 C8 D7 r, g$ E$ L State_Set++;2 t+ t$ ?5 o, v8 y" A! ]/ l
if(State_Set==8) State_Set=0;3 z1 `0 @' S, U' y& `6 r6 H: g) h
}$ E$ F+ j4 L$ t2 r
( r5 R8 }8 X7 `/ y" n1 B
Hour_Flag=TRUE;Min_Flag=TRUE;Sec_Flag=TRUE;" J) u& H9 M) z. X+ S, S" z M
Year_Flag=TRUE;Mon_Flag=TRUE;Day_Flag=TRUE;
) b8 l; H6 x g/ n
7 _$ A# B; k& `8 \ switch(State_Set){ //设置类型
* W8 @5 u! u# x5 S* E case 0: //无设置
U9 k5 k' }# M a& T$ L break;
9 h5 B& }9 f8 J6 l; z case 1: //设置时 N% Z/ T9 T- W
Hour_Flag=FALSE;
7 \( e1 j9 B4 {/ ~" I% X$ o4 v- y break;
8 V/ {1 ?+ `" m2 @. f( r; Y case 2: //设置分* U+ j" `2 k2 ?7 C6 p
Min_Flag=FALSE;
2 y- ]* h1 ~" y& x' g) L break;
8 O* r" b6 _" c- ?: I6 l0 E! u$ b$ y case 3: //设置秒
' f1 N; Q4 D( t3 N Sec_Flag=FALSE;: `1 K8 A. Z: @) J( A" h1 Z
break;" S/ a# M5 N9 Q1 {" x
case 4: //设置天! y& ? e8 ~3 O# e" y0 Y
Day_Flag=FALSE;% g+ v/ G" w6 s& w$ G
break;& h! Y; Q2 w) s& O% e
case 5:
. v' Y! g6 {6 ?. ^ Mon_Flag=FALSE; //设置月5 K" V+ i- F. p5 X( {
break;, k, ^; S% m/ y' ]3 Y8 X
case 6:
9 _7 V v# y$ @$ c Year_Flag=FALSE; //设置年( `7 Y5 G# |1 b' l' P \
break;
% ~# ]( Z7 q3 ~1 Q2 x case 7: //无动作,设置此值为让"年"的反白消失。
$ T* @! D! H7 F S; b( @8 }! m* d break;" X6 Y0 O: t, B n5 c, }5 N
} 5 v# G' t5 s7 i* r
H8 T2 q4 F! l5 i Z2 b4 ?7 [ if(Inc_Flag){ //加键被按下
% _ b5 H) ?+ k+ u% F7 a% F$ C( [ Inc_Flag=FALSE;
/ H3 D! \. m5 ^) M/ @ switch(State_Set) {
o+ c, j4 g$ U0 e case 0:0 p% Q+ d5 @: U! I" m# M- W H
break;! X3 e& M8 U/ U
case 1: //小时加
& H6 y7 F Z, b* q6 P: q7 @ sys.cHour++;
+ S6 Q. n& q- v$ d- u5 M3 z (sys.cHour)%=24;
' o4 q1 m# P4 M; Z break;
1 G8 z0 x! Z8 n case 2: //分加1
( u+ f% g1 V2 T5 S sys.cMin++;9 }' |6 |: L1 ]: b8 \8 {
sys.cMin%=60;
/ E) N: L. U4 L) O# o; T break;& j$ W9 K( k1 Q% S( X8 E
case 3: //秒加1
K* }& A4 W* s" z* C( b sys.cSec++;
. D- U$ f; |0 r$ W7 O4 `( q sys.cSec%=60;7 G3 @) K0 Q8 m: C5 o/ U$ @
break;" d! ^7 D0 o2 d4 j
case 4: //天加1
% D' o/ n v) k (sys.cDay)=(sys.cDay%Mon2[YeaRFlag(sys.cYear)][sys.cMon])+1;
2 G7 L! b0 s+ t4 j( y$ b7 a6 U& R2 N break;* F1 V- i1 @, Q0 t/ c5 H' R1 q
case 5: //月加1
1 Z2 X, ~/ X; `! k0 q( ^/ \9 F h0 c sys.cMon=(sys.cMon%12)+1;7 g6 s8 P+ p2 @8 |! ~
break;
; @! m0 {. S6 s- Q1 v3 R( c case 6:
3 c+ Q q$ B+ z3 j- P: D2 L: L& U Z sys.cYear++; //年加10 P7 S! c' X! q s1 v- v z
sys.cYear=sys.cYear%100;
# g% z/ ~2 I# a6 w1 v3 X6 T break;! z; r2 y) F/ h, S7 u/ O
}
* A; v. T* u; _+ }5 W4 A# R+ n DecToBCD(); //转为BCD数# l* S/ }3 S6 m& M
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay); //算出星期
, s( K5 S- Y, V- ]& N, P SetTime(sys); //存入DS1302
& ]+ q; S( {& g% ]# J }
5 o! i, C6 ]& \4 K4 U% I" |' G; A. q8 V& ^: Z$ Q
if(Dec_Flag){ //减键按下- J, |4 x' N, D) c) ~( T
Dec_Flag=FALSE;
y6 Q0 g& e; n( V# [ switch(State_Set){) l3 B- P# Z( X: C( x% A- K
case 0:- a' w8 N8 \" c% g: T2 Z7 N
break;7 U" i4 ~5 Z/ C( D, L
case 1:
- N6 M5 r# l# x6 b sys.cHour=(sys.cHour+23)%24; //时减15 v0 ] K* Q( K% V; m
break;7 q3 w/ ?" V5 c) o3 H8 R" L# i# b
case 2: //分减1
6 s1 _% O4 t1 W4 _ sys.cMin=(sys.cMin+59)%60;& P& d3 X; A$ u$ v4 u4 g
break;6 |" p# A/ W6 U0 h
case 3: //秒减1
; Y9 L, N. P: z+ m- B( M2 N sys.cSec=(sys.cSec+59)%60;
2 H/ |/ W9 E# v# m0 \ break;
% z, [: |/ q/ p8 u: B case 4: //天减1# U K) n3 _0 R; x; _' t
sys.cDay=((sys.cDay+Mon2[YearFlag(sys.cYear)][sys.cMon]-1)%Mon2[YearFlag(sys.cYear)][sys.cMon]);
' [- ]* m! q7 g" G6 | if(sys.cDay==0) sys.cDay=Mon2[YearFlag(sys.cYear)][sys.cMon];( v0 h3 U) C$ `! x5 J( u( m8 q6 {) e
break;
( ?' N: C' r7 a& T* v case 5: //月减1! L) }- q3 a% ~2 g3 d s; D* g4 \& L7 O
sys.cMon=(sys.cMon+11)%12;
9 Q. v: J a: O, j if(sys.cMon==0) sys.cMon=12;
9 Q+ l& Q4 n3 l% l& @" ?0 N break;+ B0 q1 K) q/ l7 y4 h
case 6: //年减1
7 E* W$ O4 M" l- s; `0 ]/ l sys.cYear=(sys.cYear+99)%100;
7 u5 Z: a: i1 v& ~9 ?" N) Y9 y break;
4 l( R' Q. c( B I; d }
0 y) @% A0 m: O2 b7 R1 M DecToBCD();3 K, V: p( o! w9 c, \( j6 ]- T" h
sys.cWeek=GetWeekDay(sys.cYear,sys.cMon,sys.cDay); : ]- ]) e8 v. k! U% J6 n, J
SetTime(sys);
. L5 t$ [7 I: P. s3 ?, }, l }" n8 w! X# {$ {
}$ C6 A- W: Y" S3 h: r
/ q7 D: b( k3 Z- b$ P5 q2 V% u0 k
void main(){ //主函数$ l+ V: z. g Q, b) r; ?% s* J
SFR_Init();
3 b# A7 p6 _/ K4 t* _- p3 p) } CAL_Init();/ ?/ i+ n% t3 v
GUI_Init();
3 o# r1 ~" G& |6 C/ }3 b2 w4 Q( I TR1=1;3 Y) d7 E' q$ C7 k+ t
while(1){9 a% T' O: X) L$ g- T
GetTime(&sys); //获得时间1 P5 F9 U( g: u H* E
LCD_ShowWNL(); //显示万年历
, T L Z4 d) P% Q1 x Time_Set(); //时间设置
3 y6 v8 @$ G) S% u) x- J' S1 t } 1 s9 { ~" M. J6 Q3 \% j- ^
}: W/ _3 R# d1 Y3 @. s( c# a
$ f! m& R( G D- z$ o5 X
void timer1() interrupt 3 { //定时器1中断服务函数& m' R4 ^! N9 L) b
TH1= (-10000)/256;
+ w* w; u0 R' O! P6 `6 b$ h TL1= (-10000)%256;
2 a/ o- m& w( c. _8 e, E0 _ keyinput(); //读取按键
+ p5 n0 x: A4 k6 ~$ J" O1 [( J if (keyvalue&0x10){
g& r0 Z' L( S5 a2 a1 d8 s State_Flag=TRUE;" W: \6 E. f1 U; K2 P& n
keyvalue &= 0xef; //清键值,保证一直按下只执行一次按键动作。
+ K2 X$ d) D9 W, r1 U } " d. p4 K( ]2 Y a' W; H
if (keyvalue&0x20 ){ //加
4 X3 f$ x/ T) ? Inc_Flag=TRUE;
# L( z8 O5 M& n* e keyvalue &= 0xdf; //清键值,保证一直按下只执行一次按键动作。9 e: E; U, M; v( b1 W* y
}
) R& O$ L; f6 b4 } H if (keyvalue&0x40){ //减3 r6 w2 M2 d6 v- U% g* e s; j s
Dec_Flag=TRUE;
l; F* K- V& u9 ^/ u keyvalue &= 0xbf; //清键值,保证一直按下只执行一次按键动作。9 a- M% O9 F, ~
}
" N3 i) |# L# T. O
u' ~+ u/ y3 {; J" w# K% b}
: R3 I. K, B9 [1 U
; w1 ]4 T+ [- ^% N. ^ n; r5 N下载:
1 @1 F% ]) u: t4 S# t3 u
( N' \, x1 C/ C% s6 z( G$ V! O2 C4 Q/ _) M
|
|