久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2148|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

1602 定時器 點掃描做萬年歷、時鐘 走時精度已經(jīng)可觀

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:155127 發(fā)表于 2016-12-15 21:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
僅使用內(nèi)部定時器,走時精度已經(jīng)可觀。
難度在于使用鍵盤調(diào)節(jié)萬年歷。

下載:
1602 定時器 點掃描做時鐘.rar (2.62 KB, 下載次數(shù): 20)

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar shi,fen,miao,ri,yue,nian,rimax,keyn,xq,flag;
  5. uint tt;
  6. uchar code table[]="2011-11-11 FRI";
  7. uchar code table1[]="23:59:51";
  8. uchar code tablex[]="MON TUE WED THU FRI SAT SUN ";
  9. sbit dula=P2^6;
  10. sbit wela=P2^7;
  11. sbit lcden=P3^4;
  12. sbit rs=P3^5;
  13. sbit key=P3^0;
  14. sbit keyg=P3^1;
  15. sbit keyd=P3^2;        //原計劃寫調(diào)減,不想寫了。
  16. sbit gnd=P3^7;
  17. void init();
  18. void write_com(uchar com);
  19. void write_date(uchar date);
  20. void write_sfm(uchar wei,uchar date);
  21. void write_nyr(uchar wei,uchar date);
  22. void write_xq();
  23. void delay(uchar z);
  24. void yueday();
  25. void shunbianday();
  26. void keyscan();
  27. void clockrun();
  28. void main()
  29. {
  30.         init();
  31.         while(1)
  32.         {
  33.                 keyscan();
  34.                 clockrun();
  35.         }
  36. }

  37. void init()
  38. {
  39.         uchar a,b;

  40.         dula=0;
  41.         wela=0;
  42.         lcden=0;

  43.         shi=23;
  44.         fen=59;
  45.         miao=58;

  46.         nian=16;
  47.         yue=2;
  48.         ri=29;

  49.         keyn=0;

  50.         write_com(0x38);
  51.         write_com(0x0c);
  52.         write_com(0x06);
  53.         write_com(0x01);

  54.         write_com(0x80+1);
  55.         for(a=0;a<14;a++)
  56.         {
  57.                 write_date(table[a]);
  58.         }

  59.         write_com(0x80+0x40+4);
  60.         for(b=0;b<8;b++)
  61.         {
  62.                 write_date(table1[b]);
  63.         }

  64.         write_nyr(2,nian);
  65.         write_nyr(5,yue);
  66.         write_nyr(8,ri);
  67.         write_sfm(0,shi);
  68.         write_sfm(3,fen);
  69.         write_sfm(6,miao);

  70.         write_xq();

  71.         yueday();

  72.         TMOD=0x02;        //設(shè)定定時/計數(shù)器工作方式2,自動重裝初值
  73.         TH0=0;        //高八位+1計數(shù)器,工作方式1中,(65536-46080)/256=高八位,高八位總共可以裝256,減76后可裝180,即:當(dāng)?shù)桶宋粸榱銜r,高八位加一計數(shù)器+1次數(shù)180次時剛好50ms
  74.         TL0=0;        //低八位+1計數(shù)器,工作方式2中,第八位用于+1計數(shù)完成計時,高八位用于保留初值給第八位重寫初值
  75.         EA=1;        //現(xiàn)在因不需占用機器周期重裝初值,若還有誤差,則只能是晶振的誤差
  76.         ET0=1;
  77.         TR0=1;
  78. }

  79. void timer0() interrupt 1
  80. {       
  81.         tt++;        //由于第八位加計數(shù)器只能計256,
  82. }

  83. void write_sfm(uchar wei,uchar date)
  84. {
  85.         uchar ge,shi;
  86.         shi=date/10;
  87.         ge=date%10;
  88.         write_com(0x80+0x40+4+wei);
  89.         write_date(0x30+shi);
  90.         write_date(0x30+ge);
  91. }

  92. void write_nyr(uchar wei,uchar date)
  93. {
  94.         uchar ge,shi;
  95.         shi=date/10;
  96.         ge=date%10;
  97.         write_com(0x80+1+wei);
  98.         write_date(0x30+shi);
  99.         write_date(0x30+ge);
  100. }

  101. void write_xq()        //寫星期數(shù)
  102. {
  103.         uchar q;
  104.         write_com(0x80+12);
  105.         for(q=0;q<4;q++)
  106.         {
  107.                 write_date(tablex[xq]);
  108.                 xq++;
  109.                 if(xq==28)
  110.                         xq=0;
  111.         }
  112. }

  113. void yueday()        //程序?qū)戦L了,改子函數(shù)名有困難,以后注意。
  114. {                                //該子函數(shù)表示月+1后計算引用的天數(shù)
  115.         if(yue==1)
  116.                 rimax=32;
  117.         if(yue==2)
  118.         {
  119.                 if(nian%4==0)
  120.                         rimax=30;
  121.                 else
  122.                         rimax=29;
  123.         }
  124.         if(yue==3)
  125.                 rimax=32;
  126.         if(yue==4)
  127.                 rimax=31;
  128.         if(yue==5)
  129.                 rimax=32;
  130.         if(yue==6)
  131.                 rimax=31;
  132.         if(yue==7)
  133.                 rimax=32;
  134.         if(yue==8)
  135.                 rimax=32;
  136.         if(yue==9)
  137.                 rimax=31;
  138.         if(yue==10)
  139.                 rimax=32;
  140.         if(yue==11)
  141.                 rimax=31;
  142.         if(yue==12)
  143.                 rimax=32;
  144. }

  145. void shunbianday()        //該子函數(shù)表示月+0后計算引用的天數(shù)
  146. {                       
  147.         if(yue==2)        //實際調(diào)用1月份天數(shù)最大31
  148.                         rimax=31;
  149.                 if(yue==3)        //實際調(diào)用2月份天數(shù)最大28/29
  150.                 {
  151.                         if(nian%4==0)
  152.                                 rimax=29;
  153.                         else
  154.                                 rimax=28;
  155.                 }
  156.                 if(yue==4)
  157.                         rimax=31;        //實際調(diào)用3月份天數(shù)最大31
  158.                 if(yue==5)
  159.                         rimax=30;        //實際調(diào)用4月份天數(shù)最大30
  160.                 if(yue==6)
  161.                         rimax=31;        //實際調(diào)用5月份天數(shù)最大31
  162.                 if(yue==7)
  163.                         rimax=30;        //實際調(diào)用6月份天數(shù)最大30
  164.                 if(yue==8)
  165.                         rimax=31;        //實際調(diào)用7月份天數(shù)最大31
  166.                 if(yue==9)
  167.                         rimax=31;        //實際調(diào)用8月份天數(shù)最大31
  168.                 if(yue==10)
  169.                         rimax=30;        //實際調(diào)用9月份天數(shù)最大30
  170.                 if(yue==11)
  171.                         rimax=31;        //實際調(diào)用10月份天數(shù)最大31
  172.                 if(yue==12)
  173.                         rimax=30;        //實際調(diào)用11月份天數(shù)最大30
  174. }

  175. void delay(uchar z)
  176. {
  177.         uchar i,j;
  178.         for(i=z;i>0;i--)
  179.                 for(j=115;j>0;j--);
  180. }

  181. void write_com(uchar com)
  182. {
  183.         rs=0;
  184.         P0=com;
  185.         delay(4);
  186.         lcden=1;
  187.         delay(4);
  188.         lcden=0;
  189. }

  190. void write_date(uchar date)
  191. {
  192.         rs=1;
  193.         P0=date;
  194.         delay(4);
  195.         lcden=1;
  196.         delay(4);
  197.         lcden=0;       
  198. }

  199. void keyscan()
  200. {
  201.         uchar temp,p;
  202.         gnd=0;
  203.         if(key==0)
  204.         {
  205.                 delay(5);
  206.                 if(key==0)
  207.                 {
  208.                         TR0=0;
  209.                         keyn++;
  210.                         if(keyn==7)
  211.                                 keyn=0;
  212.                         write_com(0x0f);
  213.                         if(keyn==0)
  214.                         {       
  215.                                 TR0=1;
  216.                                 write_com(0x0c);
  217.                         }
  218.                         if(keyn==1)
  219.                                 write_com(0x80+0x40+11);
  220.                         if(keyn==2)
  221.                                 write_com(0x80+0x40+8);
  222.                         if(keyn==3)
  223.                                 write_com(0x80+0x40+5);
  224.                         if(keyn==4)
  225.                                 write_com(0x80+10);
  226.                         if(keyn==5)
  227.                                 write_com(0x80+7);
  228.                         if(keyn==6)
  229.                                 write_com(0x80+4);
  230.                         while(!key);
  231.                 }
  232.         }
  233.         if(keyn==1)
  234.         {
  235.                 if(keyg==0)
  236.                 {
  237.                         delay(5);
  238.                         if(keyg==0)
  239.                         {
  240.                                 miao++;
  241.                                 if(miao==60)
  242.                                         miao=0;
  243.                                 write_sfm(6,miao);
  244.                                 write_com(0x80+0x40+11);
  245.                                 while(!keyg);
  246.                         }
  247.                 }
  248.         }
  249.         if(keyn==2)
  250.         {
  251.                 if(keyg==0)
  252.                 {
  253.                         delay(5);
  254.                         if(keyg==0)
  255.                         {
  256.                                 fen++;
  257.                                 if(fen==60)
  258.                                         fen=0;
  259.                                 write_sfm(3,fen);
  260.                                 write_com(0x80+0x40+8);
  261.                                 while(!keyg);
  262.                         }
  263.                 }
  264.         }
  265.         if(keyn==3)
  266.         {
  267.                 if(keyg==0)
  268.                 {
  269.                         delay(5);
  270.                         if(keyg==0)
  271.                         {
  272.                                 shi++;
  273.                                 if(shi==24)
  274.                                         shi=0;
  275.                                 write_sfm(0,shi);
  276.                                 write_com(0x80+0x40+5);
  277.                                 while(!keyg);
  278.                         }
  279.                 }
  280.         }
  281.         if(keyn==4)
  282.         {
  283.                 if(keyg==0)
  284.                 {
  285.                         delay(5);
  286.                         if(keyg==0)
  287.                         {
  288.                                 yueday();
  289.                                 ri++;
  290.                                 if(ri>=rimax)
  291.                                 {
  292.                                         ri=1;
  293.                                         temp=(rimax-2)%7;                                       
  294.                                         for(p=6-temp;p>0;p--)
  295.                                         {
  296.                                                 write_xq();                //因為跳出循環(huán)后,下面還會再重復(fù)一次,所以這里只循環(huán)5次
  297.                                         }
  298.                                 }
  299.                                 write_xq();

  300.                                 write_nyr(8,ri);
  301.                                 write_com(0x80+10);
  302.                                 while(!keyg);
  303.                         }
  304.                 }
  305.         }
  306.         if(keyn==5)
  307.         {
  308.                 if(keyg==0)
  309.                 {
  310.                         delay(5);
  311.                         if(keyg==0)
  312.                         {
  313.                                 yue++;
  314.                                 if(yue==13)
  315.                                 {
  316.                                         yue=1;        //情況二,跨月數(shù)調(diào)月(12變1)后,間隔天數(shù)
  317.                                         if(nian%4==0)        //情況二分支1,閏年
  318.                                         {        //因為12月、1月均為月大,日編號不會變
  319.                                                 for(p=(366-33)%7;p>0;p--)
  320.                                                         write_xq();       
  321.                                         }
  322.                                         else        //情況二分支2,平年
  323.                                         {
  324.                                                 for(p=(365-31)%7;p>0;p--)
  325.                                                         write_xq();               
  326.                                         }
  327.                                 }
  328.                                 write_nyr(5,yue);
  329.                                 //標(biāo)記點
  330.                                 yueday();        //情況一,順序調(diào)月后(1→12),間隔天數(shù)。本句判斷本月有多少天供后續(xù)利用
  331.                                 if(ri>rimax-1)        //情況一分支1。當(dāng)當(dāng)前顯示的天數(shù)小于本月最大天數(shù)時,顯示本月最大天數(shù)
  332.                                 {                               
  333.                                         write_nyr(8,rimax-1);        //上個注釋的執(zhí)行部分,將示數(shù)改到最大值范圍
  334.                                         temp=ri-rimax;        //情況一分支1,判斷當(dāng)月數(shù)加一后,天數(shù)增加數(shù)量
  335.                                         ri=rimax-1;        //上個注釋的執(zhí)行部分,不能光改示數(shù),而不改實際運行值。
  336.                                         shunbianday();        //更換rimax值
  337.                                         for(p=(rimax+temp-1)%7;p>0;p--)
  338.                                                 write_xq();       
  339.                                 }
  340.                                 else        //情況一分支2,判斷當(dāng)月數(shù)加一后,天數(shù)增加數(shù)量
  341.                                 {        //當(dāng)初值大于29時,1月變2月,是順變,同時顯示值大于最大允許值
  342.                                         shunbianday();
  343.                                         for(p=rimax%7;p>0;p--)
  344.                                                 write_xq();       
  345.                                 }

  346.                                 write_com(0x80+7);
  347.                                 while(!keyg);
  348.                         }
  349.                 }
  350.         }
  351.         if(keyn==6)
  352.         {
  353.                 if(keyg==0)
  354.                 {
  355.                         delay(5);
  356.                         if(keyg==0)
  357.                         {
  358.                                 if(nian%4==0&&yue==2&&ri==29)        //分支3,當(dāng)年+0為閏年2月29日時,年+1后2月只有28號。
  359.                                 {
  360.                                         ri=28;        //改日的值
  361.                                         write_nyr(8,ri);        //改日顯示
  362.                                         for(p=7;p>0;p--)        //改星期顯示       
  363.                                                 write_xq();                //循環(huán)七次,相當(dāng)于沒改
  364.                                         flag=1;        //分支4,當(dāng)閏年2月29調(diào)過年數(shù),調(diào)年再經(jīng)過閏年未能識別閏年
  365.                                 }
  366.                                 nian++;
  367.                                 if(nian>99)        //分支1,嘿嘿,百年蟲
  368.                                 {
  369.                                         nian=0;
  370.                                         write_xq();
  371.                                 }
  372.                                 if(nian%4==0)        //分支2.1,年+1為閏年
  373.                                 {
  374.                                         if(flag==1)
  375.                                         {
  376.                                                 for(p=(365-28)%7;p>0;p--)
  377.                                                         write_xq();
  378.                                                 flag=2;
  379.                                         }
  380.                                         else
  381.                                         {
  382.                                                 for(p=(366-35)%7;p>0;p--)
  383.                                                         write_xq();       
  384.                                         }
  385.                                 }
  386.                                 else        //分支2.2,年+1為平年
  387.                                 {
  388.                                         if(flag==2)
  389.                                         {
  390.                                                 for(p=2;p>0;p--)
  391.                                                         write_xq();
  392.                                                 flag=1;
  393.                                         }
  394.                                         else
  395.                                         {
  396.                                                 for(p=(365-28)%7;p>0;p--)
  397.                                                         write_xq();
  398.                                         }
  399.                                 }
  400.                                 write_nyr(2,nian);
  401.                                 write_com(0x80+4);
  402.                                 while(!keyg);
  403.                         }
  404.                 }
  405.         }
  406. }

  407. void clockrun()
  408. {
  409.         if(tt==3600)
  410.         {
  411.                 tt=0;
  412.                 miao++;
  413.                 if(miao>=60)
  414.                 {
  415.                         miao=0;
  416.                         fen++;
  417.                         if(fen>=60)
  418.                         {
  419.                                 fen=0;
  420.                                 shi++;
  421.                                 if(shi>=24)
  422.                                 {
  423.                                         shi=0;
  424.                                         ri++;
  425.                                         write_xq();
  426.                                         yueday();
  427.                                         if(ri>=rimax)
  428.                                         {
  429.                                                 ri=1;
  430.                                                 yue++;
  431.                                                 if(yue>=13)
  432.                                                 {
  433.                                                         yue=1;
  434.                                                         nian++;
  435.                                                         if(nian>=100)
  436.                                                                 nian=0;
  437.                                                         write_nyr(2,nian);
  438.                                                 }
  439.                                                 write_nyr(5,yue);
  440.                                         }
  441.                                         write_nyr(8,ri);
  442.                                 }
  443.                                 write_sfm(0,shi);
  444.                         }
  445.                         write_sfm(3,fen);
  446.                 }
  447.                 write_sfm(6,miao);
  448.         }
  449. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一级一级国产 | 日韩视频在线观看一区二区 | 欧美精品乱码久久久久久按摩 | 亚洲精品一区二区三区在线观看 | av色噜噜| 亚洲人人| 在线欧美a | 狠狠操av| 欧美福利影院 | 国产精品亚洲精品日韩已方 | 精品美女久久久 | 欧美黄在线观看 | 毛片一区二区 | 欧美精品久久久久 | 18成人在线观看 | 亚洲有码转帖 | 婷婷毛片 | 一区二区三区视频播放 | 精品久久av | 国产视频中文字幕 | 国产999精品久久久久久绿帽 | 日日日干干干 | 一区二区日韩 | 国产精品福利在线观看 | 日韩欧美在线一区 | 欧美8一10sex性hd | 中文字幕不卡视频在线观看 | 日日躁狠狠躁aaaaxxxx | 一区二区三区四区在线 | 在线黄av| 亚洲一级二级三级 | 亚洲日本视频 | 美国十次成人欧美色导视频 | 亚洲一区二区av在线 | 美女黄视频网站 | 成人精品一区二区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 日韩在线综合网 | 欧美aaaaaaaaaa| 91久久久久久久久久久 | 久久久久国产一区二区三区不卡 |