#PCF8563C语言可调时钟日历_第1页
#PCF8563C语言可调时钟日历_第2页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1/25PCF8563可调时钟日历定义 POI I 为段输出端 I I定义 Pl 11 为位输出端 11用 74HC573驱动数码管四按键可调时间口期*/# iiicludedefine uchai unsigned chardefine umt unsigned mtbit daolS=Oo 到 1秒标志位bit dao2MS=0o /到 2亳秒标志位bit daolOMS=Oo 到 10 亳秒标志位bit dao05s=0obit dao500MS=0osbit dulal=P3A5o / 定义口期段选sbit welal=P3A2o /定义口期位选sbit dula2=P3A4o 定义时

2、间星期段选sbit wela2=P3A3o /定义时间星期位选sbit shaiishuo=P2A4ouchai num,num 1 ,nuni2 anain_flag osbit kevl=P2A0osbit kev2=P2Al。sbit kev3=P2A2osbit kev4=P2A3。bit set,xiaoshi,feiizhong4iiiaozliong,xmgqijiiaiifen.yuefen4ifen。sbit scl=P3A0o 定义 8563 I2C 的时钟线sbit sda=P3T。定义 8563 I2C 的数据线#define led.data P0定义 P0 11 为

3、段输出端口define led_wei P1定义 P1 口为位输出端口char aaiiiao,shi,fenjiumber, b,ms,mg,fs,fg,ss,sg,countochar day.week4u0nth.year ouchai Sbtime=0,0Q0Q0Q0。时间星期缓冲区uchartabdafa=0,0,0,0,0,0Q0。口期缓冲区uchai weitime=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80。时间星期显示位 uchaiweidata0=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0

4、x40,0 x80。/口期显示位uchai tab=0 xc0.0 xf9,0 xa4.0 xb0,0 x99,0 x92,0 x82,0 xfB.0 x80,0 x90o /0-9 数字uchai xing=0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 x80。define KEY_1 OxOe 定义各按键键值#define KEY_2 OxOd#define KEY_3 0 x0b#define KEY_4 0 x072/25#define KEY_NULL OxOfdefine KEY.PRESS 0 x80 定义各按键状态#define KEY.LONG

5、0 x40#define KEY_.STATE.INIT 0 /定义按键状态#define KEY_STATE_PRESS 1#define KEY_STATE_LONG 2#define KEY_.STATE.UP 3define KEY_LONG_PERIOD 20 定义长按键的 TICK 数,以及连发间隔的 TICK 数#define KEY_CONTINUE_PERIOD 10uchai KevScan( 按键扫描函数if(keyl=O leturn KEY_1。if(key2=0 return KEY_2。if(key3=0 leturn KEY_3。if(key4=0 return

6、 KEY_4。return KEY_NULL。uchai GetKey(uchai keyRetu=O.keyTemp=KEY_NULL ostatic uchar s_kevState=KEY_STATE_INIT,keyTime=0.keyLast=KEY_NULLokeyTemp=KeyScan(。switch (s_keyStatecase KEY_STATE_INIT:if(kevTemp! =KE Y_NULLs_keyState=KE Y_STATE_PRESS break ocase KEY_STATE_PRESS:if(kevTemp! =KE Y_NULLs_keyStat

7、e=KE Y_STATE_LONG。keyTmie=0okeyLast=keyTemp。elses_keyState=KEY_STATE_INIT。break ocase KEY.STATE.LONG:3/25if(kevTemp=KEY_NULLs_keyState=KEY_STATE_INITkeyRetu=(kevLast|KEY_PRESS。elseif(+keyTune=KEY-LONG_PERIOD 按 F 时间 1 ss_k 亡 yState=KE Y_STATE_UP。keyTiine=Oobreak ocase KEY_STATE_URif(kevTemp=KEY_NULLs

8、_keyState=KEY_STATE_INIT。elseif(+keyTimeA=KEY_CONTINUE_PERIOD 按 F 时间0.5skeyTiine=OokeyRetu=(keyLast|KEY_LONG。break oreturn kevRetUouchai bcdtoasc(uchar chareturn (cha/16 * 10+(cha% 16 ouchai asctobcd(uchar chareturn (cha/10 * 16+(cha% 10 o=延时子程序 MS=void delayl(uiiit xuiiit a,bofbi(a=Xo a0o a4/25fbr(

9、b=100a b0o b-o=短 暂延时=void delay(一=8563起始信号子程序=void start(sda=lodelay(oscl=lodelay(osda=Oodelay(o一=8563终止信号子程序=一一=void stop(sda=Oodelay(oscl=lodelay(osda=lodelay(o一=8563 应答信号子程序=一=一一一=void respons(uchai ioscl=lodelay(oxvliile(sda=l&(io一=8563总线初始化子程序=void p8563uiit(sda=lodelay(oscl=lodelay(o=一写入 1 字节子

10、程 =5/25void write_byte(uchai- datetemp=dateo 写入数据 datefbr(i=Oo itemp=templ。scl=Oodelay(osda=CYo 往数据线送 date 最高位,循坏 8次送完 datedelay(oscl=lodelay(oscl=Oodelay(osda=K 释放数据总线,以便读取应答信号delay(o一=一读取 1 字节子程序=_=一一=uchai read_byte(uchai i.koscl=0odelay(osda=lodelay(ofor(i=0o i/i回时是一位一位的所以要读 8次scl=lo scl 置 1数据才稳

11、定才可以读取数据delay(ok=(kl|sdao sda 送过来的数据送到 k的最底位,循坏 8次从最高位读完 sda上的数据 scl=0odelay(oretuin k。程序执行完返回 k的值一=一写一 8 位数据子程庁=_=void write_add(uchar address,uchar datestart(0/调用起始信号子程序,开始写入信号write_bvte(0 xa2。找芯片所在地址respons(。/调用应答信号write_bvte(addiess。找芯片内部存储器地址respons(o6/25wnte_byte(dateo 写入数据,写进芯片内部存储器respons(o7

12、/25stop(o 调用终止信号子程序,终止信号写入一=一读一 8 位数据子程序=uchai read_add(uchar addiessuchai dateostart( o调用起始信号子程序wiite_byte(0 xa2。/ 取芯片地址respons(owrite_bvte(addiess。/取芯片内部存储器地址respons(ostart(o调用起始信号子程序,开始读取信号wiite_byte(0 xa3o 芯片读地址respons(odate=read_bvte(o 把读取字节子程序的返回值给 dateStop(0return date。 程序执行完返回 date 的值/=写时间子程

13、序=void wiite_8563(uchar w_iniao,uchai w_fen,uchai- w_slii.uchar w_day,uchar w_month,uchai w_year p8563init(ostart(owrite_add(0 x00.0 x00。write_add(OxO 1,0 x00。write_add(0 x02, w_miao。delayl(100owrite_add(0 x03 ,w_fen。delayl(100owrite_add(0 x4Av_slii。delayl(100owrite_add(0 x05 ,w_dav。delayl(100owrite

14、_add(0 x06,w_week。delayl(100owrite_add(0 x7Av_month。delayl(100owrite_add(O x&w_year。delayl(100o=卖时间子程序=r_week.uchar8/25void read_8563(niiao=read_add(0 x02&0 x7f。获取秒数据nuao=(miao&0 xf0AA4&0 x0f*10+(miao&0 xOf。/BCD 码转换成 10 进制数/if(iniao=60niiao=0。fen=read_add(0 x03&0 x7f。获取分钟fen=(fen&0 xf04&0 x0*10+(fen

15、&0 x0fo BCD 码转换成 10 进制数/if(fen=60 fen=0。slii=read_add(0 x04&0 x3f。获取小时shi=(shi&0 xfD4&0 x0f*10+(shi&0 x0f。/BCD 码转换成 10 进制数 /if(slii=24 slii=0o week=iead_add(0 x06&0 x07。获取星期/if(week6 week=0。dav=read_add(OxO5&0 x3f。获取 口数据dav=( day&0 xf04&0 x0f*10+( day&OxOfX /BCD 码转换成 10 进制数/ if( day=31 dav=O。montli=

16、read_add(0 x07&0 x 1 f。获取月montli=(month&0 xfD4&0 x0f*10+(month&OxOf。/BCD 码转换成 10 进制数 /if(month=24 month=0 o yeai-read_adcl(OxO8&OxfL 获取年yea 尸(year&0 xf04&0 x0f*10+(y 亡 a【&OxOf。/BCD 码转换成 10 进制数void uuiit( welal=0odulal=Oowela2=0odula2=0oTMOD=0X01o/ TH0=(65536-50000/256o/ TL0=(65536-50000%256oTH0=0XF8

17、o /2msTL0=0XCCoEA=loET0=loTR0=lovoid T_0tmie( intemipt 1严 TH0=(65536-45872/256oTL0=(65536-45872%256oTH0=0XF8o /2msTL0=0XCConum-H-onunil-H-onuni2-H-ocount-H-o关闭口期位选通关闭口期段选通关闭时间星期位选通关闭时间星期段选通9/25if(numl=5numl=OadaolOMS=l oif(nuni2=250nuni2=0adao500MS=loif(?(count%25 set = !set。if(count=500count=Ooif(n

18、um=250num=0oshanshuo=shanshuo。void updatetiine(read_8563(o 读取秒时分 tabtune0=shvl0otabtiine 1 =shi% 10。tabtune2=feiv 10。 tabtune3=fen% 10。tabtiine 4=miao/10 tabtune5=iniao% 10。tabtune6=week% 10。tabdata0=2otabdatal=Ootabdata2=year/10。 tabdata3=year% 10。tabdata4=month;10 tabdata5=month% 10。tabdata6=day/1

19、0otabdata7=day% 10。/*/=显示子程序= void displav(uchai k=0o10/25fbi(k=Oo kwela2=1 o时间星期led_wei=weitimek o dula2=loled_data=tabtabtmiek o dula2=0owela2=0oled_data=Oxffodelayl(lowela 1=1。口期 led_wei=weidatak odulal=loled_data=tabtabdatakodulal=0owelal=0o led_data=Oxffo delayl(lo */void displav(wela2=1 o时间星期l

20、ed_wei=weitimeO o dula2=loled_data=tabtabtmieO o if(set&xboshiled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelayl(lowela 1=1。口期 led_wei=weidataOo dulal=lo led_data=tabtabdataO odulal=0owelal=0oled_data=Oxffodelayl(lowela2=1。时间星期led_wei=weitime 1 。dula2=lo led_data=tabtabtiinel o消除时间变化时的阴影消除时间变化时的阴影1

21、1/25if(set&xiaoshiled.data=OXFFodula2=0owela2=0oled_data=Oxffodelayl(lowelal=lo 口 期led_wei=weidatalodulal=loled_data=tabtabdatalodulal=0owelal=0oled_data=Oxffo delayl(lowela2=1。时间星期led_wei=weitime2 o dula2=loled_data=tabtabtmie2 o if(set&fbnzhongled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelayl(lo

22、welal=lo口期led_wei=weidata2odulal=loled_data=tabtabdata2 o if(set&led.data=OXFFo dulal=0owelal=0oled_data=Oxffodelayl(lo wela2=1。时间星期led_wei=weitime3 o dula2=loled_data=tabtabtmie3 oif(set&fbnzhongled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelay! (lo消除时间变化时的阴影消除时间变化时的阴影消除时间变化时的阴影12/25welal=lo 口期led

23、_wei=weidata3 odulal=loled_data=tabtabdata3 oif(set&led.data=OXFFo dulal=0owelal=0oled_data=Oxffodelayl(lowela2=l o时间星期led_wei=weitime4 odula2=loled_data=tabtabtmie4 oif(set&miaozhongled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelayl(lo消除时间变化时的阴影welal=lo 口期 led_wei=weidata4 odulal=loled_data=tabtab

24、data4 oif(set&yuefbnled.data=OXFFo dulal=0owelal=0oled_data=Oxffodelayl(lowela2=1。时间星期led_wei=weitime5 odula2=loled_data=tabtabtmie5 oif(set&miaozhongled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelayl(lo消除时间变化时的阴影welal=lo 口期 led_wei=weidata5 odulal=loled_data=tabtabdata5J o13/25if(set&yuefbnled.dat

25、a=OXFFo dulal=Oowelal=Ooled_data=Oxffodelayl(lowela2=1。时间星期led_wei=weitime6 odula2=loled_data=xmgtabtmie6 o llllllllllllllllllllllllllllllllllllllllllllllllllllllif(set& &xingqiled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelayl(lo消除时间变化时的阴影welal=lo 口期led_wei=weidata6 odulal=loled_data=tabtabdata6 o

26、if(set&led.data=OXFFo dulal=0owelal=0oled_data=Oxffodelayl(lowela2=1。时间星期led_wei=weitime7 odula2=loled_data=tabtabtiine7 oif(set& &xingqiled.data=OXFFo dula2=0owela2=0oled_data=Oxffodelayl(lo消除时间变化时的阴影welal=lo 口期led_wei=weidata7odulal=loled_data=tabtabdata7 oif(set&led.data=OXFFo dulal=0ow 亡 la 1=0。

27、14/25led_data=Oxffodelayl(lovoid main(p8563iiiit(oUllllt(owmj8563(0 x20ex52,0 xl&0 x03ex05exl2.0 x20I8。初始化秒 分时,口,星期,月, 年wlule(lupdatetiine(odisplay(0if(daolOMS 每 10ms 扫描一次按键daol0MS=0oswitch (GetKey(case (KEY_1 |KEY_PRESS:if(+niaiii_flag=8maiii_flag=0oswitch(main_flagcase 1:xiaoshi=lobreak ocase 2:fe

28、iizhong=loxiaoshi=0obreak ocase 3:niiaozhong=l。feiizhong=Oobreak ocase 4:xhigqi=l onuaozhong=0obreak ocase 5:iiianfen=loxnigqi=0obreak o15/25case 6:yuefen=lo niaiifen=Oo break ocase 7:rifen=l。 vuefen=Oo break ocase 0: rifen=0obreak ocase (KEY_1|KEY_LONG: if(+niaiii_flag=8 maiii_flag=0o switch(main_f

29、lagcase 1:xiaoshi=lobreak o case 2:feiizhong=lo xiaoshi=0o break o case 3:niiaozhong=l。feiizhong=0o break o case 4:xhigqi=l o niiaozhong=0o break ocase 5:iiianfen=lo xhigqi=0o break o case 6:yuefen=lo niaiifen=0o break ocase 7:rifen=l。 vuefen=0oJbreak ocase 0:rifen=0cbreak ocase (KEY_2|KEY_PRESSKswi

30、tch(mam_flagcase 1: slii=read_add(0 x04。shi= shi&O x3foshi=bcdtoasc(slii。shi+=l oif(shi=24shi=0oshi=asctobcd(slii。wiite_add(0 x04,shi o 写分数据shi=iead_add(0 x04A&0 x3f。读取秒数据shi=(shi&0 xf0A4&0 x0f*10+(shi&0 x0f。BCD 码转换成 10 进制数display(o16/25break ocase 2:fen=read_add(0 x03。fen= fbn&0 x7f。fen=bcdtoasc(fe

31、n fen+=l oif(fen=60fen=0ofen=asctobcd(fen wiite_add(0 x03,fen。写分数据fen=read_add(0 x03&0 x7f。读取秒数据fen=(fen&0 xf04&0 x0f*10+(fen&0 x0fo/BCD 码转换成 10 进制数display(obreak ocase 3:iniao=iead_add(0 x02。iniao= niiao&0 x7foiniao=bcdtoasc(niiao。miao+=l oif(iiiiao=60iniao=Oo iniao=asctobcd(niiao。write_add(0 x02,n

32、iiao 写分数据nuao=read-add(0 x02&0 x7f。读取秒数据nuao=(niiao&0 xf0A4&0 x0f*10+(niiao&0 xOf /BCD 码转换成10 进制数display(obreak ocase 4: week=iead_add(0 x06 oweek= week &0 x07。week=bcdtoasc(week。week+=l oif(week6week=0。/week=asctobcd(week。write_add(0 x06,week。写分数据week=read_add(0 x06&0 x07。读取秒数据17/25week=(week&0 xf0

33、4&0 xOf* 10+(week&0 x0fo /BCD 码转换成10 进制数display(obreak ocase 5:yeai-read-add(0 x08。yeai- y 亡如 &0 xff。yeai-bcdtoasc(year。veai+=l oJif(yeai=100veai-0oJyear=asctobcd(year。write_add(0 x08,yeai。写分数据yeai-=read_add(0 x08&0 xff 读取秒数据veai-(year&0 xf04&0 x0f*10+(yeai-&0 xOf。/BCD 码转换成 10进制数display(obreak ocase

34、 6:month=read_add(0 x07。month= month&0 xlfomonth=bcdtoasc(montli。month+=l oif(month=13month=l o month=asctobcd(montli。write_add(0 x07,month。写分数据month=read_add(0 x07&0 x 1 f。读取秒数据month=(montli&OxfO4&0 x0f*10+(month&0 x0f。/BCD 码转换成 10 进制display(obreak ocase 7:day=read_add(0 x05。dav= dav&0 x3foJJday=bc

35、dtoasc(dav。18/25dav+=loJif(day=32dav=loJday=asctobcd(dav。write_add(0 x05,dav。写分数据dav=read_add(0 x05&0 x3f。读取秒数据day=(dav&0 xf04&0 x0f*10+(day&0 x0fo /BCD 码转换成 10 进制数display(obreak obreak ocase (KEY_3|KEY_PRESS:switch(mam_flagcase 1: slii=read_add(0 x04。shi= shi&O x3foshi=bcdtoasc(slii。shi-=l oif(shis

36、hi=23 oshi=asctobcd(slii。wiite_add(0 x04,shi o 写分数据slii=iead_add(0 x04&0 x3f。读取秒数据shi=(shi&0 xf0A4&0 x0f*10+(shi&0 x0f。/BCD 码转换成 10 进制数display(obreakocase 2:fen=read_add(0 x03。fen= fbn&0 x7f。fen=bcdtoasc(fen。fen-=loif(fenfen=59ofen=asctobcd(fen。wiite_add(0 x03,fen。写分数据fen=read_add(0 x03&0 x7f。读取秒数据f

37、en=(fen&0 xf04&0 x0f*10+(fen&0 x0fo /BCD 码转换成 10 进制19/25数display(obreakocase 3:iniao=iead_add(0 x02。iniao= niiao&0 x7foiniao=bcdtoasc(niiao。iniao-=loif(iniaomiao=59。iniao=asctobcd(niiao。write_add(0 x02,nuao 写分数据nuao=read-add(0 x02&0 x7f。读取秒数据nuao=(niiao&0 xf04&0 x0f*10+(miao&0 xOf /BCD 码转换成 10进制数dis

38、play(obreakocase 4: week=read_add(0 x06 oweek= week &0 x07。week=bcdtoasc(week。week-=l oif(weekweek=6oweek=asctobcd(week。write_add(0 x06,week。写分数据week=read_add(0 x06&0 x07。读取秒数据week=(week&0 xfD4&0 xOf* 10+(week&0 x0fo /BCD 码转换成10 进制数 display(obreak ocase 5:yeai-read-add(0 x08。veai- v 亡如&0 xff。Jyeai-b

39、cdtoasc(year。veai-=l oJif(yeaiveai-99oJyear=asctobcd(year。20/25write_add(0 x08,yeai 写分数据yeai-=read_add(0 x08&0 xff 读取秒数据yeai-(year&0 xf04&0 x0f*10+(yeai-&0 xOf。/BCD 码转换成 10进制数 display(obreak ocase 6:month=read_add(0 x07。month= month&0 xlfomonth=bcdtoasc(montli。month-=l oif(monthmonth=12omonth=asctob

40、cd(montli owrite_add(0 x07,month。写分数据 month=read_add(0 x07&0 x1 f。读取秒数据 month=(montli&0 xf04&0 x0f*10+(month&0 x0f。/BCD 码转换成 10 进制display(obreak ocase 7:day=read_add(0 x05。dav= dav&0 x3f。JJday=bcdtoasc(dav。day-=loif(daydav=31 oJday=asctobcd(dav。write_add(0 x05,dav。写分数据dav=read_add(0 x05&0 x3f。读取秒数据d

41、ay=(dav&0 xf04&0 x0f*10+(day&0 x0f。ECD 码转换成 10 进制数display(o break obreak ocase (KEY_2|KEY_LONG:switch(mam_flag21/25case 1: slii=read_add(0 x04。 shi= shi&Ox3foshi=bcdtoasc(shi。shi+=l oif(shi=24shi=0oshi=asctobcd(slii。write_add(0 x04,shi。写分数据 shi=read_add(0 x04&0 x3f。读取秒数据 shi=(slii&0 xfD4&0 x0f*10+(s

42、hi&0 x0f。/BCD 码转换成10 进制数display(o breakocase 2:fen=read_add(0 x03。 fen= fm&0 x7f。fen=bcdtoasc(fen。 fen+=l oif(fen=60 fen=0o fen=asctobcd(fen。write_add(0 x03,fen。写分数据 fen=read_add(0 x03&0 x7f。读取秒数据 fen=(fen&0 xf04&0 x0f*10+(fen&0 x0fo /BCD 码转换成10 进制数display(o breakscase 3:iniao=read-.add(0 x02。 iniao

43、= niiao&0 x7foiniao=bcdtoasc(niiao。 iniao+=loif(iiiiao=60iniao=Ooiniao=asctobcd(niiao。write_add(0 x02,nuao 写分数据nuao=read_add(0 x02&0 x7f。读取秒数据nuao=(niiao&0 xf04&0 x0f*104-(nuao&0 xOf /BCD 码转换成 10进制数 display(obreak ocase 4: week=iead_add(0 x06 oweek= week &0 x07。week=bcdtoasc(week。week+=l oif(week6we

44、ek=0oweek=asctobcd(week。write_add(0 x06,week。写分数据22/25week=read_add(0 x06&0 x07。读取秒数据week=(week&0 xf04&0 x0f*10+(week&0 x0f。/BCD 码转换成 10进制数display(obreak ocase 5:yeai-read-add(0 x08。yeai- y 亡如&0 xff。yeai-bcdtoasc(year。 veai+=l oJif(yeai=100veai-0oJyear=asctobcd(year。wiite_add(0 x0&y亡 ar。写分数据yeai-iead_add(0 x08&0 xff 读取秒数据yeai-(year&0 xf04&0 x0f*10+(yeai-&0 xOf。/BCD 码转换成 10进制数display(obreak ocase 6: month=read_add(0 x07。month= month&0 xlfomonth=bcdtoasc(montli。month+=l oif(month=13month=lo month=asctobcd(montli。write_add(0 x07,month。写分数据month=read_add(0 x07&0 x 1 f。读取秒数据month=(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论