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

標題: DS1302程序(帶校準),LCD1602顯示 [打印本頁]

作者: 1536730359    時間: 2017-3-19 16:18
標題: DS1302程序(帶校準),LCD1602顯示
DS1302(帶校準),LCD1602顯示




  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar a,miao,shi,fen,ri,yue,nian,week,flag,temp,key1n;
  5. #define yh 0x80  //第一行的初始位置
  6. #define er 0x80+0x40 //第二行初始位置

  7. sbit dula=P2^6;
  8. sbit wela=P2^7;

  9. sbit wr=P1^1;
  10. sbit rs=P1^0;
  11. sbit en=P2^5;

  12. sbit SCLK=P0^1;  // 6  P1.1
  13. sbit IO=P0^2;    // 7  P1.0
  14. sbit RST=P0^3;   //時鐘 5  P1.2
  15. sbit ACC0=ACC^0;
  16. sbit ACC7=ACC^7;


  17. sbit key1=P3^5;
  18. sbit key2=P3^6;
  19. sbit key3=P3^7;
  20. uchar code tab1[]={"2009-  -   THU"};
  21. uchar code tab2[]={"  :  :  "};
  22. void delay(uint xms)//延時函數
  23. {
  24.         uint x,y;
  25.         for(x=xms;x>0;x--)
  26.          for(y=110;y>0;y--);
  27. }
  28. /******************液晶寫入************************/
  29. write_1602com(uchar com)//液晶寫入指令函數
  30. {
  31.         rs=0;//置為寫入命令
  32.         P0=com;//送入數據
  33.         delay(1);
  34.         en=1;//拉高使能端
  35.         delay(1);
  36.         en=0;//完成高脈沖
  37. }
  38. write_1602dat(uchar dat)
  39. {
  40.         rs=1;//置為寫入數據
  41.         P0=dat;//送入數據
  42.         delay(1);
  43.         en=1;
  44.         delay(1);
  45.         en=0;
  46. }
  47. /*********************over***********************/
  48. /********************ds1302****************************/
  49. void write_byte(uchar dat)
  50. {
  51.         ACC=dat;
  52.         RST=1;
  53.         for(a=8;a>0;a--)
  54.         {
  55.                 IO=ACC0;
  56.                 SCLK=0;
  57.                 SCLK=1;
  58.                 ACC=ACC>>1;
  59.         }
  60. }
  61. uchar read_byte()
  62. {
  63.         RST=1;
  64.         for(a=8;a>0;a--)
  65.         {
  66.                 ACC7=IO;
  67.                 SCLK=1;
  68.                 SCLK=0;
  69.                 ACC=ACC>>1;

  70.         }
  71.         return (ACC);
  72. }
  73. void write_1302(uchar add,uchar dat)
  74. {

  75.         RST=0;
  76.         SCLK=0;
  77.         RST=1;
  78.         write_byte(add);
  79.         write_byte(dat);
  80.         SCLK=1;
  81.         RST=0;
  82. }
  83. uchar read_1302(uchar add)
  84. {
  85.         uchar temp;
  86.         RST=0;
  87.         SCLK=0;
  88.         RST=1;
  89.         write_byte(add);
  90.         temp=read_byte();
  91.         SCLK=1;
  92.         RST=0;
  93.         return(temp);
  94. }
  95. uchar BCD_Decimal(uchar bcd)
  96. {
  97. uchar Decimal;
  98. Decimal=bcd>>4;
  99. return(Decimal=Decimal*10+(bcd&=0x0F));
  100. }
  101. void ds1302_init()
  102. {
  103. RST=0;
  104. SCLK=0;
  105. write_1302(0x80,miao|0x00);//允許寫
  106. }


  107.        

  108. void write_sfm(uchar add,uchar dat)//寫時分秒
  109. {
  110.         uchar gw,sw;
  111.         gw=dat%10;
  112.         sw=dat/10;
  113.         write_1602com(er+add);
  114.         write_1602dat(0x30+sw);
  115.         write_1602dat(0x30+gw);
  116.                                

  117. }
  118. void write_nyr(uchar add,uchar dat)
  119. {
  120.         uchar gw,sw;
  121.         gw=dat%10;
  122.         sw=dat/10;
  123.         write_1602com(yh+add);
  124.         write_1602dat(0x30+sw);
  125.         write_1602dat(0x30+gw);
  126.        

  127. }
  128. void write_week(uchar week)//寫星期函數
  129. {
  130.         write_1602com(yh+0x0d);
  131.         switch(week)
  132.         {
  133.                 case 1:write_1602dat('M');
  134.                            write_1602dat('O');
  135.                            write_1602dat('N');
  136.                            break;
  137.           
  138.                 case 2:write_1602dat('T');
  139.                            write_1602dat('U');
  140.                            write_1602dat('E');
  141.                            break;
  142.                
  143.                 case 3:write_1602dat('W');
  144.                            write_1602dat('E');
  145.                            write_1602dat('D');
  146.                            break;
  147.                
  148.                 case 4:write_1602dat('T');
  149.                            write_1602dat('H');
  150.                            write_1602dat('U');
  151.                            break;
  152.                
  153.                 case 5:write_1602dat('F');
  154.                            write_1602dat('R');
  155.                            write_1602dat('I');
  156.                            break;
  157.                
  158.                 case 6:write_1602dat('S');
  159.                            write_1602dat('T');
  160.                            write_1602dat('A');
  161.                            break;
  162.                
  163.                 case 7:write_1602dat('S');
  164.                            write_1602dat('U');
  165.                            write_1602dat('N');
  166.                            break;


  167. }



  168. }
  169. lcd_init()//液晶初始化函數
  170. {       wr=0;
  171.         write_1602com(0x38);//設置液晶工作模式
  172.         write_1602com(0x0c);//開顯示不顯示光標
  173.         write_1602com(0x06);//整屏不移動,指針加一
  174.         write_1602com(0x01);
  175.         write_1602com(yh+2);//字符寫入的位置
  176.         for(a=0;a<14;a++)
  177.         {
  178.         write_1602dat(tab1[a]);
  179.         //delay(3);
  180.         }
  181.         write_1602com(er+4);
  182.         for(a=0;a<8;a++)
  183.         {
  184.         write_1602dat(tab2[a]);
  185.         //delay(3);
  186.         }

  187. }
  188. void keyscan()
  189. {

  190.         if(key1==0)//key1為功能鍵
  191.         {
  192.         delay(5);
  193.         if(key1==0)
  194.         {
  195.         while(!key1);
  196.         key1n++;
  197.         if(key1n==9)
  198.                 key1n=1;
  199.         switch(key1n)
  200.         {
  201.        
  202.         case 1: TR0=0;//關閉定時器
  203.                         //TR1=0;
  204.                         write_1602com(er+0x0b);//寫入光標位置
  205.                            write_1602com(0x0f);//設置光標為閃爍
  206.                            temp=(miao)/10*16+(miao)%10;
  207.                            write_1302(0x8e,0x00);
  208.                            write_1302(0x80,0x80|temp);//miao
  209.                            write_1302(0x8e,0x80);
  210.                            break;
  211.         case 2:  write_1602com(er+8);//fen
  212.                        
  213.                      //write_1602com(0x0f);
  214.                         break;
  215.         case 3: write_1602com(er+5);//shi
  216.                      //write_1602com(0x0f);
  217.                         break;
  218.         case 4: write_1602com(yh+0x0f);//week
  219.                      //write_1602com(0x0f);
  220.                         break;
  221.         case 5: write_1602com(yh+0x0b);//ri
  222.                      //write_1602com(0x0f);
  223.                         break;
  224.         case 6: write_1602com(yh+0x08);//yue
  225.                      //write_1602com(0x0f);
  226.                         break;
  227.         case 7: write_1602com(yh+0x05);//nian
  228.                      //write_1602com(0x0f);
  229.                         break;
  230.         case 8:
  231.                         write_1602com(0x0c);//設置光標不閃爍
  232.                         TR0=1;//打開定時器
  233.                         temp=(miao)/10*16+(miao)%10;
  234.                            write_1302(0x8e,0x00);
  235.                            write_1302(0x80,0x00|temp);//miao
  236.                            write_1302(0x8e,0x80);
  237.             break;
  238.                                

  239.                                                                                                        
  240.                        
  241.         }
  242.        
  243.        

  244.         }

  245.         }
  246.         if(key1n!=0)//當key1按下以下。再按以下鍵才有效
  247.         {
  248.        
  249.         if(key2==0)  //上調鍵
  250.         {
  251.         delay(5);
  252.         if(key2==0)
  253.         {
  254.         while(!key2);
  255.         switch(key1n)
  256.         {
  257.         case 1:miao++;
  258.                         if(miao==60)
  259.                                 miao=0;
  260.                         write_sfm(0x0a,miao);//寫入新的秒數
  261.                         temp=(miao)/10*16+(miao)%10;
  262.                            write_1302(0x8e,0x00);
  263.                            write_1302(0x80,0x80|temp);
  264.                            write_1302(0x8e,0x80);
  265.                         write_1602com(er+0x0b);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  266.                         //write_1602com(0x0b);
  267.                         break;
  268.         case 2:fen++;
  269.                         if(fen==60)
  270.                                 fen=0;
  271.                         write_sfm(0x07,fen);
  272.                         temp=(fen)/10*16+(fen)%10;
  273.                            write_1302(0x8e,0x00);
  274.                            write_1302(0x82,temp);
  275.                            write_1302(0x8e,0x80);
  276.                         write_1602com(er+8);
  277.                         break;
  278.         case 3:shi++;
  279.                         if(shi==24)
  280.                                 shi=0;
  281.                         write_sfm(4,shi);
  282.                         temp=(shi)/10*16+(shi)%10;
  283.                            write_1302(0x8e,0x00);
  284.                            write_1302(0x84,temp);
  285.                            write_1302(0x8e,0x80);
  286.                         write_1602com(er+5);
  287.                         break;
  288.         case 4:week++;
  289.                         if(week==8)
  290.                                 week=0;
  291.                                 write_week(week);
  292.                         temp=(week)/10*16+(week)%10;
  293.                            write_1302(0x8e,0x00);
  294.                            write_1302(0x8a,temp);
  295.                            write_1302(0x8e,0x80);
  296.                        
  297.                         write_1602com(yh+0x0f);
  298.                         break;
  299.         case 5:ri++;
  300.                         if(ri==31)
  301.                                 ri=0;
  302.                         write_nyr(10,ri);
  303.                         temp=(ri)/10*16+(ri)%10;
  304.                            write_1302(0x8e,0x00);
  305.                            write_1302(0x86,temp);
  306.                            write_1302(0x8e,0x80);
  307.                         write_1602com(yh+11);
  308.                         break;
  309.         case 6:yue++;
  310.                         if(yue==13)
  311.                                 yue=0;
  312.                         write_nyr(7,yue);
  313.                         temp=(yue)/10*16+(yue)%10;
  314.                            write_1302(0x8e,0x00);
  315.                            write_1302(0x88,temp);
  316.                            write_1302(0x8e,0x80);
  317.                         write_1602com(yh+8);
  318.                         break;
  319.         case 7:nian++;
  320.                  if(nian==100)
  321.                         nian=0;
  322.                         write_nyr(4,nian);
  323.                         temp=(nian)/10*16+(nian)%10;
  324.                            write_1302(0x8e,0x00);
  325.                            write_1302(0x8c,temp);
  326.                            write_1302(0x8e,0x80);
  327.                         write_1602com(yh+5);
  328.                         break;
  329.                        

  330.         }

  331.         }

  332.         }
  333.         if(key3==0)
  334.         {
  335.         delay(5);
  336.         if(key3==0)
  337.         {
  338.         while(!key3);
  339.         switch(key1n)
  340.         {
  341.                 case 1:miao--;
  342.                                 if(miao==-1)
  343.                                         miao=59;
  344.                         write_sfm(0x0a,miao);//寫入新的秒數
  345.                         write_1602com(er+0x0b);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  346.                         //write_1602com(0x0b);
  347.                         break;
  348.                 case 2:fen--;
  349.                                 if(fen==-1)
  350.                                         fen=59;
  351.                         write_sfm(7,fen);
  352.                         temp=(fen)/10*16+(fen)%10;
  353.                           

  354. …………余下代碼請下載附件…………
復制代碼


完整代碼下載:
DS1302 時鐘內部數據校準 LCD1602顯示.rar (72.29 KB, 下載次數: 60)

作者: 神奇神    時間: 2017-9-1 16:11
改完時間怎么確定啊

作者: 神奇神    時間: 2017-9-1 16:13
請問改完時間后確定鍵是哪個?
作者: piplxh    時間: 2017-9-2 15:02
學習啦!
作者: jhczy    時間: 2017-9-4 11:13
內部時間校準是什么意思?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品久久久免费 | 成人小视频在线观看 | 国产伦精品一区二区三区照片91 | 欧美日韩精品综合 | 国产精品美女久久久久aⅴ国产馆 | 午夜精品一区二区三区在线视频 | 色秀网站 | 男女爱爱网站 | 人成精品 | 四虎首页 | 情侣黄网站免费看 | 国产精品久久精品 | 成人午夜电影在线观看 | 五月天激情综合网 | av免费电影在线 | 久久蜜桃av一区二区天堂 | 日韩av一区二区在线观看 | 精品九九久久 | 欧美在线视频网站 | 成人亚洲 | 黄色网址免费在线观看 | 精品国产伦一区二区三区观看方式 | 亚洲成av | 国产视频一区二区 | 香蕉视频在线播放 | 日本一区二区三区免费观看 | 中文字幕一区二区三区四区五区 | 久久免费看| 亚洲一区成人 | 久久久99国产精品免费 | 一区二区视频在线 | 91国产视频在线观看 | 日韩电影中文字幕在线观看 | 成人国产精品久久 | 久热久热 | 日韩aⅴ片 | 欧美一区二区三区在线看 | 人人人人干 | 国产精品欧美一区二区三区 | 日本福利片 | 日韩欧美手机在线 |