题目2_时钟.c
上传用户:wzx8880901
上传日期:2009-04-09
资源大小:37k
文件大小:9k
开发平台:

C/C++

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit p34=P2^2;
  5. sbit p35=P2^1;
  6. sbit p36=P2^0;
  7. sbit dula=P2^7;
  8. sbit wei1=P2^6;
  9. sbit wei2=P2^5;
  10. bit runnian,dayue,flag;
  11. uchar code tabledu[]={
  12. 0x3f,0x06,0x5b,0x4f,
  13. 0x66,0x6d,0x7d,0x07,
  14. 0x7f,0x6f,0x00};
  15. uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  16. uchar nian,yue,ri,shi,fen,miao,xq,cont,day,days,s,tt,a;
  17. uint temp;
  18. int week(int y,int m,int d) ;
  19. void init();
  20. void display1();
  21. void display2();
  22. void delay(uchar z);
  23. void time();
  24. void year();
  25. void key();
  26. void jia();
  27. void jian();
  28. void xiaoy();
  29. void xiaoy1();
  30. void dxyue();
  31. void main()
  32. {  
  33. init();    //初始化
  34. dxyue();
  35. while(1)
  36. {
  37. time();
  38. display1();
  39. display2();
  40. key();
  41. }
  42. }
  43. void key()
  44. {
  45.  if(p34==0)   //选择更改位。
  46.  {
  47.    delay(20); //去抖
  48.  if(p34==0)
  49.  {
  50.  while(!p34) 
  51. {
  52. display1();  //显示子函数打包
  53. display2();
  54. }
  55.  delay(10);
  56.  s++;
  57.  cont=0; //保证按键按下时间过长时,松开后,能马上闪烁而不用等待.
  58.  if(s==7)
  59.  {
  60.   s=0;
  61.  }
  62.  }
  63.  }
  64.  if(p35==0)     //加位
  65.  {
  66.   if(s==0)   // 没有按p34的情况下,按P35或P36的无效。
  67.   {}
  68. else
  69. { delay(10);
  70. if(p35==0)
  71. {
  72.   while(!p35)
  73. {
  74. display1();  //显示子函数打包
  75. display2();
  76. }
  77.   jia();
  78.  }
  79. }
  80.  }
  81.  if(p36==0) //减位
  82.  {  
  83.   if(s==0) // 没有按p34的情况下,按P35或P36的无效。
  84. {}
  85. else
  86. { delay(10);
  87. if(p36==0)
  88. {
  89.   while(p36==0)
  90. {
  91. display1();  //显示子函数打包
  92. display2();
  93. }
  94. jian();
  95. }
  96. }
  97.  }  
  98. }
  99. void jian()  //减
  100. {
  101.   if(s==1) //年
  102. {
  103. nian--;  xq=week(nian,yue,ri);
  104. if(nian==0xff)  //2099年
  105. {
  106. nian=99;
  107. }
  108. year();
  109. }
  110. if(s==2)  //月
  111. {
  112. yue--; xq=week(nian,yue,ri);
  113. if(yue==0)
  114. {
  115. yue=12;
  116. }
  117. dxyue();
  118. }
  119. if(s==3) //日
  120. {
  121. ri--; xq=week(nian,yue,ri);
  122. if(ri==0)
  123. {
  124. if(yue==2)
  125. {
  126. if(runnian)
  127. {
  128. ri=29;
  129. }
  130. else
  131. {
  132. ri=28;
  133. }
  134. }
  135. else
  136. {
  137.    if(dayue)
  138. {
  139. ri=31;
  140. }
  141. else
  142. {
  143. ri=30;
  144. }
  145. }
  146. }
  147. }
  148. if(s==4)
  149. {
  150. shi--;
  151. if(shi==0xff)
  152. {
  153. shi=23;
  154. }
  155. }
  156. if(s==5)
  157. {
  158.  fen--;
  159.  if(fen==0xff)
  160.  {
  161.   fen=59;
  162.  }
  163. }
  164. if(s==6)
  165. {
  166. miao--;
  167. if(miao==0xff)
  168. {
  169. miao=59;
  170. }
  171. }
  172. }
  173. void jia()
  174. {
  175.   if(s==1)
  176. {
  177. nian++; xq=week(nian,yue,ri);
  178. year();
  179. }
  180. if(s==2)
  181. {
  182. yue++; xq=week(nian,yue,ri);
  183. if(yue==13)
  184. {
  185. yue=1;
  186. }
  187. dxyue();
  188. }
  189. if(s==3)
  190. {
  191. ri++; xq=week(nian,yue,ri);
  192. if(yue==2)
  193. {
  194. if(ri>=day)
  195. {
  196. ri=1;
  197. }
  198. }
  199. else
  200. {
  201. if(ri>=days)
  202. {
  203. ri=1;
  204. }
  205. }
  206. }
  207. if(s==4)
  208. {
  209. shi++;
  210. if(shi==24)
  211. {
  212. shi=0;
  213. }
  214. }
  215. if(s==5)
  216. {
  217.  fen++;
  218.  if(fen==60)
  219.  {
  220.   fen=0;
  221.  }
  222. }
  223. if(s==6)
  224. {
  225. miao++;
  226. if(miao==60)
  227. {
  228. miao=0;
  229. }
  230. }
  231. }
  232. void init()
  233. {
  234. flag=1;
  235. TMOD=0x01;
  236. TH0=0X4C;
  237. TL0=0X00;
  238. EA=1;
  239. ET0=1;
  240. TR0=1;
  241. nian=8;
  242. yue=11;
  243. ri=22;
  244. shi=20;
  245. fen=30;
  246. year();
  247. s=0;
  248. P0=0;
  249. dula=wei1=wei2=0;
  250. }
  251. void xiaoy()
  252. {
  253. //------------------------------
  254. P0=0;
  255. dula=1;
  256. P0=0;
  257. dula=0;
  258. P0=0xff;
  259. wei2=1;
  260. P0=tablewe[7];
  261. wei2=0;
  262. delay(1);
  263. //------------------------------
  264. }
  265. void xiaoy1()
  266. {
  267. //------------------------------
  268. P0=0;
  269. dula=1;
  270. P0=0;
  271. dula=0;
  272. P0=0xff;
  273. wei1=1;
  274. P0=tablewe[7];
  275. wei1=0;
  276. delay(1);
  277. //------------------------------
  278. }
  279. void display2()    //时分秒
  280. uchar x,y;
  281. //----------------------------------
  282. x=shi%100/10; //时十位
  283. y=shi%10; //时个位
  284. P0=0x00;
  285. if(s==4)   //校对时间时闪烁用。
  286. {
  287. if(cont==12)
  288. {
  289. cont=0;
  290. flag=~flag;
  291. }
  292. if(flag)
  293. {
  294. x=0x0a;
  295. y=0x0a;
  296. }
  297. }
  298. P0=0;
  299. dula=1;
  300. P0=tabledu[x];
  301. dula=0;
  302. P0=0xff;
  303. wei2=1;
  304. P0=tablewe[0];
  305. wei2=0;
  306. delay(2);
  307. //--------------------------
  308. xiaoy(); //消隐
  309. //--------------------------
  310. P0=0; //时个
  311. dula=1;
  312. P0=tabledu[y];
  313. dula=0;  
  314. P0=0xff;
  315. wei2=1;
  316. P0=tablewe[1];
  317. wei2=0;
  318. delay(2);
  319. //--------------------------
  320. xiaoy(); //消隐
  321. //--------------------------
  322. x=fen%100/10; //分十位
  323. y=fen%10; //分个位
  324. if(s==5)
  325. {
  326. if(cont==12)
  327. {
  328. cont=0;
  329. flag=~flag;
  330. }
  331. if(flag)
  332. {
  333. x=0x0a;
  334. y=0x0a;
  335. }
  336. }
  337. P0=0;
  338. dula=1;
  339. P0=tabledu[x];
  340. dula=0; P0=0xff;
  341. wei2=1;
  342. P0=tablewe[2];
  343. wei2=0;
  344. delay(2);
  345. //--------------------------
  346. xiaoy(); //消隐
  347. //--------------------------
  348. //分个位
  349. P0=0;
  350. dula=1;
  351. P0=tabledu[y];
  352. dula=0; P0=0xff;
  353. wei2=1;
  354. P0=tablewe[3];
  355. wei2=0;
  356. delay(2); 
  357. //--------------------------
  358. xiaoy(); //消隐
  359. //--------------------------
  360. x=miao%100/10; //秒十位
  361. y=miao%10;
  362. //秒十位
  363. if(s==6)
  364. {
  365. if(cont==12)
  366. {
  367. cont=0;
  368. flag=~flag;
  369. }
  370. if(flag)
  371. {
  372. x=0x0a;
  373. y=0x0a;
  374. }
  375. }
  376. P0=0;
  377. dula=1;
  378. P0=tabledu[x];
  379. dula=0;
  380. P0=0xff;
  381. wei2=1;
  382. P0=tablewe[4];
  383. wei2=0;  
  384. delay(2);
  385. //--------------------------
  386. xiaoy(); //消隐
  387. //--------------------------  
  388. P0=0; //秒个位
  389. dula=1;
  390. P0=tabledu[y];
  391. dula=0;
  392. P0=0xff;
  393. wei2=1;
  394. P0=tablewe[5];
  395. wei2=0;
  396. delay(2);
  397. P0=0;
  398. //--------------------------
  399. xiaoy(); //消隐
  400. //--------------------------
  401. //----------------------------------
  402. P0=0; //星期显示
  403. dula=1;
  404. P0=tabledu[xq];
  405. dula=0;
  406. P0=0xff;
  407. wei2=1;
  408. P0=tablewe[6];
  409. wei2=0;
  410. delay(2);
  411. P0=0;
  412. //--------------------------------
  413. P0=0; //无效作用位
  414. dula=1;
  415. P0=0;
  416. dula=0;
  417. P0=0xff;
  418. wei2=1;
  419. P0=tablewe[7];
  420. wei2=0;
  421. delay(2);
  422. P0=0;
  423. //-----------------
  424. }
  425. void display1() //年月日
  426. {
  427. uchar x,y;
  428. //----------------------------------
  429. x=nian%100/10; //年十位
  430. y=nian%10; //年个位
  431. P0=0x00;
  432. if(s==1)   //校对时间时闪烁用。
  433. {
  434. if(cont==12)
  435. {
  436. cont=0;
  437. flag=~flag;
  438. }
  439. if(flag)
  440. {
  441. x=0x0a;
  442. y=0x0a;
  443. }
  444. }
  445. P0=0;
  446. dula=0;
  447. dula=1;
  448. P0=tabledu[x];
  449. dula=0;
  450. P0=0xff;
  451. wei1=0;
  452. wei1=1;
  453. P0=tablewe[0];
  454. wei1=0;
  455. delay(2);
  456. //--------------------------
  457. xiaoy1(); //消隐
  458. //--------------------------
  459. dula=0;
  460. P0=0; //年个
  461. dula=1;
  462. P0=tabledu[y];
  463. dula=0;  
  464. P0=0xff;
  465. wei1=1;
  466. P0=tablewe[1];
  467. wei1=0;
  468. delay(2);
  469. //--------------------------
  470. xiaoy1(); //消隐
  471. //--------------------------
  472. //----------------------------------
  473. //----------------------------------
  474. x=yue%100/10; //月十位
  475. y=yue%10; //月个位
  476. if(s==2)
  477. {
  478. if(cont==12)
  479. {
  480. cont=0;
  481. flag=~flag;
  482. }
  483. if(flag)
  484. {
  485. x=0x0a;
  486. y=0x0a;
  487. }
  488. }
  489. P0=0;
  490. dula=1;
  491. P0=tabledu[x];
  492. dula=0; P0=0xff;
  493. wei1=1;
  494. P0=tablewe[2];
  495. wei1=0;
  496. delay(2);
  497. //--------------------------
  498. xiaoy1(); //消隐
  499. //--------------------------
  500. //月个位
  501. P0=0;
  502. dula=1;
  503. P0=tabledu[y];
  504. dula=0; P0=0xff;
  505. wei1=1;
  506. P0=tablewe[3];
  507. wei1=0;
  508. delay(2); 
  509. //--------------------------
  510. xiaoy1(); //消隐
  511. //--------------------------
  512. //----------------------------------
  513. //----------------------------------
  514. x=ri%100/10; //日十位
  515. y=ri%10;
  516. //日个位
  517. if(s==3)
  518. {
  519. if(cont==12)
  520. {
  521. cont=0;
  522. flag=~flag;
  523. }
  524. if(flag)
  525. {
  526. x=0x0a;
  527. y=0x0a;
  528. }
  529. }
  530. P0=0;
  531. dula=1;
  532. P0=tabledu[x];
  533. dula=0; P0=0xff;
  534. wei1=1;
  535. P0=tablewe[4];
  536. wei1=0;  
  537. delay(2); 
  538. //--------------------------
  539. xiaoy1(); //消隐
  540. //-------------------------- 
  541. P0=0; //日个位
  542. dula=1;
  543. P0=tabledu[y];
  544. dula=0;
  545. P0=0xff;
  546. wei1=1;
  547. P0=tablewe[5];
  548. wei1=0;
  549. P0=0;
  550. delay(2);
  551. //--------------------------
  552. xiaoy1(); //消隐
  553. //--------------------------  
  554. //----------------------------------
  555. P0=0; //第一锁存器无效作用位
  556. dula=1;
  557. P0=0 ;
  558. dula=0;
  559. P0=0xff;
  560. wei1=1;
  561. P0=tablewe[6];
  562. wei1=0;
  563. P0=0;
  564. delay(2); 
  565. //---------------------
  566. }
  567. void year()  //平润年
  568. {
  569. uint aaa;
  570. aaa=2000+nian;  //为了计算闰年。
  571. if(((aaa%4 == 0)&&(aaa%100!=0)) || (aaa%400==0))
  572. {
  573. runnian=1;
  574. day=30;    //闰年
  575. }
  576. else
  577. {
  578. runnian=0;
  579. day=29;  //平年
  580. }
  581. }
  582. void dxyue()    //大小月
  583. {
  584. if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
  585. {
  586. days=32; //31天
  587. }
  588. else
  589. {  
  590. days=31;  //30天
  591. }
  592. }
  593. void time()
  594. {
  595. if(cont==40)  //一秒钟加一。不是很精确。
  596. {
  597.    cont=0;
  598.    miao++;
  599.    if(miao==60)
  600.    {
  601.     miao=0;
  602. fen++;
  603. if(fen==60)
  604. {
  605. fen=0;
  606. shi++;
  607. if(shi==24)
  608. {
  609. shi=0;
  610. ri++; 
  611. xq=week(nian,yue,ri);
  612. dxyue();
  613. if(yue!=2)
  614. {
  615. if(ri==days)
  616. {
  617. ri=1;
  618. yue++;
  619. xq=week(nian,yue,ri);
  620. if(yue==13)
  621. {
  622. yue=1;
  623. nian++;
  624. xq=week(nian,yue,ri);
  625. year();
  626. }
  627. }
  628. }
  629. else
  630. {
  631.    if(ri==day)
  632. {
  633. ri=1;
  634. yue++;
  635. }
  636. }
  637. }
  638. }
  639.    }
  640. }
  641. }
  642. void dingshi() interrupt 1
  643. {
  644. TH0=0x4C;
  645. TL0=0x00;
  646. cont++;
  647. }
  648. void delay(uchar z)
  649. {
  650. uint x,y;
  651. for(x=z;x>0;x--)
  652. for(y=20;y>0;y--);
  653. }
  654. int week(int y,int m,int d) 
  655. int m_d[12]={2,5,5,1,3,6,1,4,7,2,5,7}; 
  656. int i,j,k=0; 
  657. int s=2; 
  658. int w=0; 
  659. y=2000+y;
  660. if (((y%4==0)&&(y%100!=0))||(y%400)==0) 
  661.    if (m<=2) 
  662.    j=y-1; 
  663.    else 
  664.    j=y; 
  665. else 
  666. j=y; 
  667. for (i=1904;i<=y;i=i+4) 
  668.    if (i%100!=0) 
  669.    k++; 
  670.    else if (i%400==0) 
  671.            k++; 
  672. w=((j-1904+s+k)+m_d[m-1]+d)%7; 
  673. return (w);