DS1302.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  1. #include <REG51.H>
  2. #include <intrins.h>
  3. //#include "LCD1602.h"
  4. //#include "DS1302.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚
  8. sbit DS1302_IO = P1^6; //实时时钟数据线引脚
  9. sbit DS1302_RST = P1^5; //实时时钟复位线引脚
  10. sbit wireless_1 = P3^0;
  11. sbit wireless_2 = P3^1;
  12. sbit wireless_3 = P3^2;
  13. sbit wireless_4 = P3^3;
  14. sbit ACC0 = ACC^0;
  15. sbit ACC7 = ACC^7;
  16. char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
  17. sbit Set = P2^0; //模式切换键
  18. sbit Up = P2^1; //加法按钮
  19. sbit Down = P2^2; //减法按钮
  20. sbit out = P2^3; //立刻跳出调整模式按钮
  21. sbit DQ = P1^0; //温度传送数据IO口
  22. char done,count,temp,flag,up_flag,down_flag;
  23. uchar temp_value; //温度值
  24. uchar TempBuffer[5],week_value[2];
  25. void show_time(); //液晶显示程序
  26. /***********1602液晶显示部分子程序****************/
  27. //Port Definitions**********************************************************
  28. sbit LcdRs = P2^5;
  29. sbit LcdRw = P2^6;
  30. sbit LcdEn = P2^7;
  31. sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
  32. //内部等待函数**************************************************************************
  33. unsigned char LCD_Wait(void)
  34. {
  35. LcdRs=0;
  36. LcdRw=1; _nop_();
  37. LcdEn=1; _nop_();
  38. LcdEn=0;
  39. return DBPort;
  40. }
  41. //向LCD写入命令或数据************************************************************
  42. #define LCD_COMMAND 0 // Command
  43. #define LCD_DATA 1 // Data
  44. #define LCD_CLEAR_SCREEN 0x01 // 清屏
  45. #define LCD_HOMING 0x02 // 光标返回原点
  46. void LCD_Write(bit style, unsigned char input)
  47. {
  48. LcdEn=0;
  49. LcdRs=style;
  50. LcdRw=0; _nop_();
  51. DBPort=input; _nop_();//注意顺序
  52. LcdEn=1; _nop_();//注意顺序
  53. LcdEn=0; _nop_();
  54. LCD_Wait();
  55. }
  56. //设置显示模式************************************************************
  57. #define LCD_SHOW 0x04 //显示开
  58. #define LCD_HIDE 0x00 //显示关
  59. #define LCD_CURSOR 0x02 //显示光标
  60. #define LCD_NO_CURSOR 0x00 //无光标
  61. #define LCD_FLASH 0x01 //光标闪动
  62. #define LCD_NO_FLASH 0x00 //光标不闪动
  63. void LCD_SetDisplay(unsigned char DisplayMode)
  64. {
  65. LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  66. }
  67. //设置输入模式************************************************************
  68. #define LCD_AC_UP 0x02
  69. #define LCD_AC_DOWN 0x00 // default
  70. #define LCD_MOVE 0x01 // 画面可平移
  71. #define LCD_NO_MOVE 0x00 //default
  72. void LCD_SetInput(unsigned char InputMode)
  73. {
  74. LCD_Write(LCD_COMMAND, 0x04|InputMode);
  75. }
  76. //初始化LCD************************************************************
  77. void LCD_Initial()
  78. {
  79. LcdEn=0;
  80. LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
  81. LCD_Write(LCD_COMMAND,0x38);
  82. LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
  83. LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
  84. LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
  85. }
  86. //液晶字符输入的位置************************
  87. void GotoXY(unsigned char x, unsigned char y)
  88. {
  89. if(y==0)
  90. LCD_Write(LCD_COMMAND,0x80|x);
  91. if(y==1)
  92. LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  93. }
  94. //将字符输出到液晶显示
  95. void Print(unsigned char *str)
  96. {
  97. while(*str!='\0')
  98. {
  99. LCD_Write(LCD_DATA,*str);
  100. str++;
  101. }
  102. }
  103. /***********DS1302时钟部分子程序******************/
  104. typedef struct __SYSTEMTIME__
  105. {
  106. unsigned char Second;
  107. unsigned char Minute;
  108. unsigned char Hour;
  109. unsigned char Week;
  110. unsigned char Day;
  111. unsigned char Month;
  112. unsigned char Year;
  113. unsigned char DateString[11];
  114. unsigned char TimeString[9];
  115. }SYSTEMTIME; //定义的时间类型
  116. SYSTEMTIME CurrentTime;
  117. #define AM(X) X
  118. #define PM(X) (X+12) // 转成24小时制
  119. #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
  120. #define DS1302_MINUTE 0x82
  121. #define DS1302_HOUR 0x84
  122. #define DS1302_WEEK 0x8A
  123. #define DS1302_DAY 0x86
  124. #define DS1302_MONTH 0x88
  125. #define DS1302_YEAR 0x8C
  126. void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
  127. {
  128. unsigned char i;
  129. ACC = d;
  130. for(i=8; i>0; i--)
  131. {
  132. DS1302_IO = ACC0; //相当于汇编中的 RRC
  133. DS1302_CLK = 1;
  134. DS1302_CLK = 0;
  135. ACC = ACC >> 1;
  136. }
  137. }
  138. unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
  139. {
  140. unsigned char i;
  141. for(i=8; i>0; i--)
  142. {
  143. ACC = ACC >>1; //相当于汇编中的 RRC
  144. ACC7 = DS1302_IO;
  145. DS1302_CLK = 1;
  146. DS1302_CLK = 0;
  147. }
  148. return(ACC);
  149. }
  150. void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
  151. {
  152. DS1302_RST = 0;
  153. DS1302_CLK = 0;
  154. DS1302_RST = 1;
  155. DS1302InputByte(ucAddr); // 地址,命令
  156. DS1302InputByte(ucDa); // 写1Byte数据
  157. DS1302_CLK = 1;
  158. DS1302_RST = 0;
  159. }
  160. unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
  161. {
  162. unsigned char ucData;
  163. DS1302_RST = 0;
  164. DS1302_CLK = 0;
  165. DS1302_RST = 1;
  166. DS1302InputByte(ucAddr|0x01); // 地址,命令
  167. ucData = DS1302OutputByte(); // 读1Byte数据
  168. DS1302_CLK = 1;
  169. DS1302_RST = 0;
  170. return(ucData);
  171. }
  172. void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
  173. {
  174. unsigned char ReadValue;
  175. ReadValue = Read1302(DS1302_SECOND);
  176. Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  177. ReadValue = Read1302(DS1302_MINUTE);
  178. Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  179. ReadValue = Read1302(DS1302_HOUR);
  180. Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  181. ReadValue = Read1302(DS1302_DAY);
  182. Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  183. ReadValue = Read1302(DS1302_WEEK);
  184. Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  185. ReadValue = Read1302(DS1302_MONTH);
  186. Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  187. ReadValue = Read1302(DS1302_YEAR);
  188. Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  189. }
  190. void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
  191. { if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
  192. {
  193. Time->DateString[0] = '2';
  194. Time->DateString[1] = '0';
  195. Time->DateString[2] = Time->Year/10 + '0';
  196. Time->DateString[3] = Time->Year%10 + '0';
  197. }
  198. else
  199. {
  200. Time->DateString[0] = ' ';
  201. Time->DateString[1] = ' ';
  202. Time->DateString[2] = ' ';
  203. Time->DateString[3] = ' ';
  204. }
  205. Time->DateString[4] = '/';
  206. if(hide_month<2)
  207. {
  208. Time->DateString[5] = Time->Month/10 + '0';
  209. Time->DateString[6] = Time->Month%10 + '0';
  210. }
  211. else
  212. {
  213. Time->DateString[5] = ' ';
  214. Time->DateString[6] = ' ';
  215. }
  216. Time->DateString[7] = '/';
  217. if(hide_day<2)
  218. {
  219. Time->DateString[8] = Time->Day/10 + '0';
  220. Time->DateString[9] = Time->Day%10 + '0';
  221. }
  222. else
  223. {
  224. Time->DateString[8] = ' ';
  225. Time->DateString[9] = ' ';
  226. }
  227. if(hide_week<2)
  228. {
  229. week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
  230. }
  231. else
  232. {
  233. week_value[0] = ' ';
  234. }
  235. week_value[1] = '\0';
  236. Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
  237. }
  238. void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
  239. { if(hide_hour<2)
  240. {
  241. Time->TimeString[0] = Time->Hour/10 + '0';
  242. Time->TimeString[1] = Time->Hour%10 + '0';
  243. }
  244. else
  245. {
  246. Time->TimeString[0] = ' ';
  247. Time->TimeString[1] = ' ';
  248. }
  249. Time->TimeString[2] = ':';
  250. if(hide_min<2)
  251. {
  252. Time->TimeString[3] = Time->Minute/10 + '0';
  253. Time->TimeString[4] = Time->Minute%10 + '0';
  254. }
  255. else
  256. {
  257. Time->TimeString[3] = ' ';
  258. Time->TimeString[4] = ' ';
  259. }
  260. Time->TimeString[5] = ':';
  261. if(hide_sec<2)
  262. {
  263. Time->TimeString[6] = Time->Second/10 + '0';
  264. Time->TimeString[7] = Time->Second%10 + '0';
  265. }
  266. else
  267. {
  268. Time->TimeString[6] = ' ';
  269. Time->TimeString[7] = ' ';
  270. }
  271. Time->DateString[8] = '\0';
  272. }
  273. void Initial_DS1302(void) //时钟芯片初始化
  274. {
  275. unsigned char Second=Read1302(DS1302_SECOND);
  276. if(Second&0x80) //判断时钟芯片是否关闭
  277. {
  278. Write1302(0x8e,0x00); //写入允许
  279. Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
  280. Write1302(0x88,0x07);
  281. Write1302(0x86,0x25);
  282. Write1302(0x8a,0x07);
  283. Write1302(0x84,0x23);
  284. Write1302(0x82,0x59);
  285. Write1302(0x80,0x55);
  286. Write1302(0x8e,0x80); //禁止写入
  287. }
  288. }
  289. /***********ds18b20子程序*************************/
  290. /***********ds18b20延迟子函数(晶振12MHz )*******/
  291. void delay_18B20(unsigned int i)
  292. {
  293. while(i--);
  294. }
  295. /**********ds18b20初始化函数**********************/
  296. void Init_DS18B20(void)
  297. {
  298. unsigned char x=0;
  299. DQ = 1; //DQ复位
  300. delay_18B20(8); //稍做延时
  301. DQ = 0; //单片机将DQ拉低
  302. delay_18B20(80); //精确延时 大于 480us
  303. DQ = 1; //拉高总线
  304. delay_18B20(14);
  305. x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  306. delay_18B20(20);
  307. }
  308. /***********ds18b20读一个字节**************/
  309. unsigned char ReadOneChar(void)
  310. {
  311. uchar i=0;
  312. uchar dat = 0;
  313. for (i=8;i>0;i--)
  314. {
  315. DQ = 0; // 给脉冲信号
  316. dat>>=1;
  317. DQ = 1; // 给脉冲信号
  318. if(DQ)
  319. dat|=0x80;
  320. delay_18B20(4);
  321. }
  322. return(dat);
  323. }
  324. /*************ds18b20写一个字节****************/
  325. void WriteOneChar(uchar dat)
  326. {
  327. unsigned char i=0;
  328. for (i=8; i>0; i--)
  329. {
  330. DQ = 0;
  331. DQ = dat&0x01;
  332. delay_18B20(5);
  333. DQ = 1;
  334. dat>>=1;
  335. }
  336. }
  337. /**************读取ds18b20当前温度************/
  338. void ReadTemp(void)
  339. {
  340. unsigned char a=0;
  341. unsigned char b=0;
  342. unsigned char t=0;
  343. Init_DS18B20();
  344. WriteOneChar(0xCC); // 跳过读序号列号的操作
  345. WriteOneChar(0x44); // 启动温度转换
  346. delay_18B20(100); // this message is wery important
  347. Init_DS18B20();
  348. WriteOneChar(0xCC); //跳过读序号列号的操作
  349. WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  350. delay_18B20(100);
  351. a=ReadOneChar(); //读取温度值低位
  352. b=ReadOneChar(); //读取温度值高位
  353. temp_value=b<<4;
  354. temp_value+=(a&0xf0)>>4;
  355. }
  356. void temp_to_str() //温度数据转换成液晶字符显示
  357. {
  358. TempBuffer[0]=temp_value/10+'0'; //十位
  359. TempBuffer[1]=temp_value%10+'0'; //个位
  360. TempBuffer[2]=0xdf; //温度符号
  361. TempBuffer[3]='C';
  362. TempBuffer[4]='\0';
  363. }
  364. void Delay1ms(unsigned int count)
  365. {
  366. unsigned int i,j;
  367. for(i=0;i<count;i++)
  368. for(j=0;j<120;j++);
  369. }
  370. /*延时子程序*/
  371. void mdelay(uint delay)
  372. { uint i;
  373. for(;delay>0;delay--)
  374. {for(i=0;i<62;i++) //1ms延时.
  375. {;}
  376. }
  377. }
  378. void outkey() //跳出调整模式,返回默认显示
  379. { uchar Second;
  380. if(out==0||wireless_1==1)
  381. { mdelay(8);
  382. count=0;
  383. hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
  384. Second=Read1302(DS1302_SECOND);
  385. Write1302(0x8e,0x00); //写入允许
  386. Write1302(0x80,Second&0x7f);
  387. Write1302(0x8E,0x80); //禁止写入
  388. done=0;
  389. while(out==0);
  390. while(wireless_1==1);
  391. }
  392. }
  393. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  394. void Upkey()//升序按键
  395. {
  396. Up=1;
  397. if(Up==0||wireless_2==1)
  398. {
  399. mdelay(8);
  400. switch(count)
  401. {case 1:
  402. temp=Read1302(DS1302_SECOND); //读取秒数
  403. temp=temp+1; //秒数加1
  404. up_flag=1; //数据调整后更新标志
  405. if((temp&0x7f)>0x59) //超过59秒,清零
  406. temp=0;
  407. break;
  408. case 2:
  409. temp=Read1302(DS1302_MINUTE); //读取分数
  410. temp=temp+1; //分数加1
  411. up_flag=1;
  412. if(temp>0x59) //超过59分,清零
  413. temp=0;
  414. break;
  415. case 3:
  416. temp=Read1302(DS1302_HOUR); //读取小时数
  417. temp=temp+1; //小时数加1
  418. up_flag=1;
  419. if(temp>0x23) //超过23小时,清零
  420. temp=0;
  421. break;
  422. case 4:
  423. temp=Read1302(DS1302_WEEK); //读取星期数
  424. temp=temp+1; //星期数加1
  425. up_flag=1;
  426. if(temp>0x7)
  427. temp=1;
  428. break;
  429. case 5:
  430. temp=Read1302(DS1302_DAY); //读取日数
  431. temp=temp+1; //日数加1
  432. up_flag=1;
  433. if(temp>0x31)
  434. temp=1;
  435. break;
  436. case 6:
  437. temp=Read1302(DS1302_MONTH); //读取月数
  438. temp=temp+1; //月数加1
  439. up_flag=1;
  440. if(temp>0x12)
  441. temp=1;
  442. break;
  443. case 7:
  444. temp=Read1302(DS1302_YEAR); //读取年数
  445. temp=temp+1; //年数加1
  446. up_flag=1;
  447. if(temp>0x85)
  448. temp=0;
  449. break;
  450. default:break;
  451. }
  452. while(Up==0);
  453. while(wireless_2==1);
  454. }
  455. }
  456. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  457. void Downkey()//降序按键
  458. {
  459. Down=1;
  460. if(Down==0||wireless_3==1)
  461. {
  462. mdelay(8);
  463. switch(count)
  464. {case 1:
  465. temp=Read1302(DS1302_SECOND); //读取秒数
  466. temp=temp-1; //秒数减1
  467. down_flag=1; //数据调整后更新标志
  468. if(temp==0x7f) //小于0秒,返回59秒
  469. temp=0x59;
  470. break;
  471. case 2:
  472. temp=Read1302(DS1302_MINUTE); //读取分数
  473. temp=temp-1; //分数减1
  474. down_flag=1;
  475. if(temp==-1)
  476. temp=0x59; //小于0秒,返回59秒
  477. break;
  478. case 3:
  479. temp=Read1302(DS1302_HOUR); //读取小时数
  480. temp=temp-1; //小时数减1
  481. down_flag=1;
  482. if(temp==-1)
  483. temp=0x23;
  484. break;
  485. case 4:
  486. temp=Read1302(DS1302_WEEK); //读取星期数
  487. temp=temp-1; //星期数减1
  488. down_flag=1;
  489. if(temp==0)
  490. temp=0x7;;
  491. break;
  492. case 5:
  493. temp=Read1302(DS1302_DAY); //读取日数
  494. temp=temp-1; //日数减1
  495. down_flag=1;
  496. if(temp==0)
  497. temp=31;
  498. break;
  499. case 6:
  500. temp=Read1302(DS1302_MONTH); //读取月数
  501. temp=temp-1; //月数减1
  502. down_flag=1;
  503. if(temp==0)
  504. temp=12;
  505. break;
  506. case 7:
  507. temp=Read1302(DS1302_YEAR); //读取年数
  508. temp=temp-1; //年数减1
  509. down_flag=1;
  510. if(temp==-1)
  511. temp=0x85;
  512. break;
  513. default:break;
  514. }
  515. while(Down==0);
  516. while(wireless_3==1);
  517. }
  518. }
  519. void Setkey()//模式选择按键
  520. {
  521. Set=1;
  522. if(Set==0||wireless_4==1)
  523. {
  524. mdelay(8);
  525. count=count+1; //Setkey按一次,count就加1
  526. done=1; //进入调整模式
  527. while(Set==0);
  528. while(wireless_4==1);
  529. }
  530. }
  531. void keydone()//按键功能执行
  532. { uchar Second;
  533. if(flag==0) //关闭时钟,停止计时
  534. { Write1302(0x8e,0x00); //写入允许
  535. temp=Read1302(0x80);
  536. Write1302(0x80,temp|0x80);
  537. Write1302(0x8e,0x80); //禁止写入
  538. flag=1;
  539. }
  540. Setkey(); //扫描模式切换按键
  541. switch(count)
  542. {case 1:do //count=1,调整秒
  543. {
  544. outkey(); //扫描跳出按钮
  545. Upkey(); //扫描加按钮
  546. Downkey(); //扫描减按钮
  547. if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据
  548. {
  549. Write1302(0x8e,0x00); //写入允许
  550. Write1302(0x80,temp|0x80); //写入新的秒数
  551. Write1302(0x8e,0x80); //禁止写入
  552. up_flag=0;
  553. down_flag=0;
  554. }
  555. hide_sec++; //位闪计数
  556. if(hide_sec>3)
  557. hide_sec=0;
  558. show_time(); //液晶显示数据
  559. }while(count==2);break;
  560. case 2:do //count=2,调整分
  561. {
  562. hide_sec=0;
  563. outkey();
  564. Upkey();
  565. Downkey();
  566. if(temp>0x60)
  567. temp=0;
  568. if(up_flag==1||down_flag==1)
  569. {
  570. Write1302(0x8e,0x00); //写入允许
  571. Write1302(0x82,temp); //写入新的分数
  572. Write1302(0x8e,0x80); //禁止写入
  573. up_flag=0;
  574. down_flag=0;
  575. }
  576. hide_min++;
  577. if(hide_min>3)
  578. hide_min=0;
  579. show_time();
  580. }while(count==3);break;
  581. case 3:do //count=3,调整小时
  582. {
  583. hide_min=0;
  584. outkey();
  585. Upkey();
  586. Downkey();
  587. if(up_flag==1||down_flag==1)
  588. {
  589. Write1302(0x8e,0x00); //写入允许
  590. Write1302(0x84,temp); //写入新的小时数
  591. Write1302(0x8e,0x80); //禁止写入
  592. up_flag=0;
  593. down_flag=0;
  594. }
  595. hide_hour++;
  596. if(hide_hour>3)
  597. hide_hour=0;
  598. show_time();
  599. }while(count==4);break;
  600. case 4:do //count=4,调整星期
  601. {
  602. hide_hour=0;
  603. outkey();
  604. Upkey();
  605. Downkey();
  606. if(up_flag==1||down_flag==1)
  607. {
  608. Write1302(0x8e,0x00); //写入允许
  609. Write1302(0x8a,temp); //写入新的星期数
  610. Write1302(0x8e,0x80); //禁止写入
  611. up_flag=0;
  612. down_flag=0;
  613. }
  614. hide_week++;
  615. if(hide_week>3)
  616. hide_week=0;
  617. show_time();
  618. }while(count==5);break;
  619. case 5:do //count=5,调整日
  620. {
  621. hide_week=0;
  622. outkey();
  623. Upkey();
  624. Downkey();
  625. if(up_flag==1||down_flag==1)
  626. {
  627. Write1302(0x8e,0x00); //写入允许
  628. Write1302(0x86,temp); //写入新的日数
  629. Write1302(0x8e,0x80); //禁止写入
  630. up_flag=0;
  631. down_flag=0;
  632. }
  633. hide_day++;
  634. if(hide_day>3)
  635. hide_day=0;
  636. show_time();
  637. }while(count==6);break;
  638. case 6:do //count=6,调整月
  639. {
  640. hide_day=0;
  641. outkey();
  642. Upkey();
  643. Downkey();
  644. if(up_flag==1||down_flag==1)
  645. {
  646. Write1302(0x8e,0x00); //写入允许
  647. Write1302(0x88,temp); //写入新的月数
  648. Write1302(0x8e,0x80); //禁止写入
  649. up_flag=0;
  650. down_flag=0;
  651. }
  652. hide_month++;
  653. if(hide_month>3)
  654. hide_month=0;
  655. show_time();
  656. }while(count==7);break;
  657. case 7:do //count=7,调整年
  658. {
  659. hide_month=0;
  660. outkey();
  661. Upkey();
  662. Downkey();
  663. if(up_flag==1||down_flag==1)
  664. {
  665. Write1302(0x8e,0x00); //写入允许
  666. Write1302(0x8c,temp); //写入新的年数
  667. Write1302(0x8e,0x80); //禁止写入
  668. up_flag=0;
  669. down_flag=0;
  670. }
  671. hide_year++;
  672. if(hide_year>3)
  673. hide_year=0;
  674. show_time();
  675. }while(count==8);break;
  676. case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态
  677. Second=Read1302(DS1302_SECOND);
  678. Write1302(0x8e,0x00); //写入允许
  679. Write1302(0x80,Second&0x7f);
  680. Write1302(0x8E,0x80); //禁止写入
  681. done=0;
  682. break; //count=7,开启中断,标志位置0并退出
  683. default:break;
  684. }
  685. }
  686. void show_time() //液晶显示程序
  687. {
  688. DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
  689. TimeToStr(&CurrentTime); //时间数据转换液晶字符
  690. DateToStr(&CurrentTime); //日期数据转换液晶字符
  691. ReadTemp(); //开启温度采集程序
  692. temp_to_str(); //温度数据转换成液晶字符
  693. GotoXY(12,1); //液晶字符显示位置
  694. Print(TempBuffer); //显示温度
  695. GotoXY(0,1);
  696. Print(CurrentTime.TimeString); //显示时间
  697. GotoXY(0,0);
  698. Print(CurrentTime.DateString); //显示日期
  699. GotoXY(15,0);
  700. Print(week_value); //显示星期
  701. GotoXY(11,0);
  702. Print("Week"); //在液晶上显示 字母 week
  703. Delay1ms(400); //扫描延时
  704. }
  705. main()
  706. {
  707. flag=1; //时钟停止标志
  708. LCD_Initial(); //液晶初始化
  709. Init_DS18B20( ) ; //DS18B20初始化
  710. Initial_DS1302(); //时钟芯片初始化
  711. up_flag=0;
  712. down_flag=0;
  713. done=0; //进入默认液晶显示
  714. wireless_1=0;
  715. wireless_2=0;
  716. wireless_3=0;
  717. wireless_4=0;
  718. while(1)
  719. {
  720. while(done==1)
  721. keydone(); //进入调整模式
  722. while(done==0)
  723. {
  724. show_time(); //液晶显示数据
  725. flag=0;
  726. Setkey(); //扫描各功能键
  727. }
  728. }
  729. }