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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)LCD1602顯示DS1302時(shí)鐘,按鍵可調(diào)時(shí)間程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:445798 發(fā)表于 2018-12-17 11:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
上個(gè)帖子是不可調(diào)節(jié)。這個(gè)程序?yàn)榭烧{(diào)節(jié),用了矩陣按鍵里7個(gè)按鍵,每個(gè)按鍵調(diào)一個(gè),因?yàn)榕晒鈽?biāo)移動(dòng)選擇調(diào)節(jié)的話(huà),光標(biāo)顏色很暗,不知道什么原因。
  1. /********************************************/
  2. #include <reg52.h>
  3. #include"inc/lcd.h"
  4. #include"inc/key.h"

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit IO = P3^6;
  8. sbit SCLK = P3^5;
  9. sbit RST = P3^7;
  10. sbit ACC_0 = ACC^0;
  11. sbit ACC_7 = ACC^7;

  12. //寫(xiě)的地址
  13. uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   
  14. //讀的地址
  15. uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};   

  16. /*形式上為十六進(jìn),數(shù)值是BCD碼*/
  17. //存儲(chǔ)格式是BCD碼秒   分   時(shí)   日   月   周   年
  18. uchar time[7]={0x50,0x59,0x14,0x20,0x06,0x06,0x19};

  19. /*如果數(shù)值時(shí)間是十進(jìn)制,寫(xiě)入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼*/
  20. //uchar time[7]={0,25,15,15,12,6,18}; //十進(jìn)制

  21. uchar KEYRETURN;//鍵值

  22. void write_byte(uchar dat)//寫(xiě)一個(gè)字節(jié)
  23. {        
  24.         uchar i;
  25.         ACC=dat;
  26.         for(i=8;i>0;i--)
  27.         {
  28.                 IO=ACC_0;
  29.                 SCLK=0;
  30.                 SCLK=1;
  31.                 ACC=ACC>>1;
  32.         }
  33.          /*
  34.         uchar i;
  35.         for(i=0;i<8;i++)
  36.         {
  37.                 IO = (bit)(dat & 0x01);
  38.                 SCLK = 0;
  39.                 SCLK = 1;
  40.                 dat >>= 1;
  41.         }
  42.          */         
  43. }


  44. uchar read_byte()                       //讀一個(gè)字節(jié)
  45. {        
  46.         uchar i;                                                
  47.         for(i=0;i<8;i++)
  48.         {        
  49.                 ACC_7=IO;
  50.                 SCLK=1;
  51.                 SCLK=0;
  52.                 ACC=ACC>>1;
  53.         }
  54.         IO=0;
  55.         return (ACC);
  56.         /*
  57.         uchar dat,i;
  58.         for(i=0;i<8;i++)
  59.         {
  60.                 if(IO == 1)
  61.                 {
  62.                         dat = dat|0x80;
  63.                 }
  64.                 SCLK = 1;
  65.                 SCLK = 0;
  66.                 dat >>= 1;        
  67.         }
  68.         IO = 0;
  69.         return (dat);
  70.         */

  71. }

  72. void write_1302(uchar add,uchar dat)    //向1302芯片寫(xiě)函數(shù),指定寫(xiě)入地址,數(shù)據(jù)
  73. {

  74.         RST=0;
  75.         SCLK=0;
  76.         RST=1;
  77.         write_byte(add);
  78.         write_byte(dat);
  79.         SCLK=1;
  80.         RST=0;
  81. }


  82. uchar read_1302(uchar add)                   //從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來(lái)源地址
  83. {
  84.         uchar temp;
  85.         RST=0;
  86.         SCLK=0;
  87.         RST=1;
  88.         write_byte(add);
  89.         temp=read_byte();
  90.         SCLK=1;
  91.         RST=0;
  92.         return(temp);
  93. }


  94. void ds1302_init()
  95. {
  96.         uchar k;
  97.     write_1302(0x8e,0x00);  //禁止寫(xiě)保護(hù),即允許數(shù)據(jù)寫(xiě)入
  98.     for(k=0;k<7;k++)   //寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  99.     {
  100.       write_1302(write_addr[k],time[k]);
  101.     }
  102.     write_1302(0x8e,0x80);  //打開(kāi)寫(xiě)保護(hù)

  103.         /*//寫(xiě)入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼
  104.         uchar i,tmp;
  105.         write_1302(0x8e,0x00);  //禁止寫(xiě)保護(hù),即允許數(shù)據(jù)寫(xiě)入
  106.         for (i=0; i<7; i++)  
  107.         {
  108.                 tmp = time[i] / 10;
  109.                 time[i] = time[i] % 10;
  110.                 time[i] = time[i] + tmp*16;        // 十進(jìn)制轉(zhuǎn)化為BCD格式
  111.                 write_1302(write_addr[i],time[i]);
  112.                 //寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  113.         }
  114.     write_1302(0x8e,0x80);  //打開(kāi)寫(xiě)保護(hù)
  115.         */
  116. }

  117. void BCD_STRING(uchar bcd, uchar *str) //BCD轉(zhuǎn)化為字符串
  118. {         
  119.          *str = (bcd >> 4) + '0';
  120.         *(str+1) = (bcd & 0x0f) + '0';
  121. }

  122. void read_time(uchar *timedata)
  123. {
  124.         uchar n;
  125.         for(n=0;n<7;n++)
  126.         {
  127.                  timedata[n]=read_1302(read_addr[n]);  //讀取分秒時(shí)日月周年
  128.         }        
  129.         BCD_STRING(timedata[6], LCD_TIME+0);//轉(zhuǎn)化后年,存放在LCD_TIME
  130.         BCD_STRING(timedata[4], LCD_TIME+2);//轉(zhuǎn)化后月
  131.         BCD_STRING(timedata[3], LCD_TIME+4);//轉(zhuǎn)化后日
  132.         BCD_STRING(timedata[5], LCD_TIME+6);//轉(zhuǎn)化后周
  133.         BCD_STRING(timedata[2], LCD_TIME+8);//轉(zhuǎn)化后時(shí)
  134.         BCD_STRING(timedata[1], LCD_TIME+10);//轉(zhuǎn)化后分
  135.         BCD_STRING(timedata[0], LCD_TIME+12);//轉(zhuǎn)化后秒
  136. }
  137. uchar TEN_BCD(uchar time_buf ) // 十進(jìn)制轉(zhuǎn)化為BCD格式
  138. {
  139.         uchar tmp;        
  140.         tmp = time_buf / 10;
  141.         time_buf = time_buf % 10;
  142.         time_buf = time_buf + tmp*16;
  143.         return(time_buf);

  144. }
  145. uchar BCD_TEN(uchar bcd) //BCD碼轉(zhuǎn)十進(jìn)制函數(shù)
  146. {
  147.          uchar ten;
  148.          ten=bcd>>4;
  149.          return(ten=ten*10+(bcd&=0x0F));
  150. }

  151. void change_time()
  152. {        
  153. //         年     月     日            周           時(shí)          分   
  154.         uchar tmp=0,tmp1=1,tmp2=1,tmp3=1,tmp4=0,tmp5=0;
  155.         uchar year,mon,day,week,hour,minu;
  156.                 KEYRETURN=KEY();
  157.                 if(KEYRETURN!=0)
  158.                 {         
  159.                      delay(400);
  160.                         switch(KEYRETURN)
  161.                         {        /*************年*************/
  162.                                 case 0x11:                  
  163.                                 write_1302(0x8e,0x00);//關(guān)閉保護(hù)
  164.                                 if(BCD_TEN(time[6])<99)//先將讀取出來(lái)的時(shí)間轉(zhuǎn)化為十進(jìn)制比大小
  165.                                 {
  166.                                         tmp=BCD_TEN(time[6]);//變量等于當(dāng)前值
  167.                                         tmp++;        //變量再++
  168.                                 }                        
  169.                                 else
  170.                                         tmp=0;//大于99變回0
  171.                                   year=TEN_BCD(tmp);//再轉(zhuǎn)化為BCD碼
  172.                                 write_1302(0x8c,year); //再寫(xiě)入
  173.                                 write_1302(0x8e,0x80);;//打開(kāi)保護(hù)
  174.                                 break;
  175.                                 /*效果就是比如初始年是19,按一下鍵,變成20,而不是從0開(kāi)始。
  176.                                 如果把讀取出來(lái)的時(shí)間轉(zhuǎn)化為16進(jìn)制,再改程序,我試了不行*/

  177.                                 /*************月*************/
  178.                                 case 0x21:                        
  179.                                 write_1302(0x8e,0x00);
  180.                                 if(BCD_TEN(time[4])<12)
  181.                                 {
  182.                                         tmp1=BCD_TEN(time[4]);
  183.                                         tmp1++;        
  184.                                 }        
  185.                                 else
  186.                                         tmp1=1;
  187.                                   mon=TEN_BCD(tmp1);
  188.                                 write_1302(0x88,mon);
  189.                                 write_1302(0x8e,0x80);break;
  190.                                 /**********效果同上************/
  191.                                                                
  192.                                 /**************日************/        
  193.                                 case 0x41:                        
  194.                                  write_1302(0x8e,0x00);
  195.                                 if(BCD_TEN(time[3])<31)
  196.                                 {
  197.                                         tmp2=BCD_TEN(time[3]);
  198.                                         tmp2++;        
  199.                                 }
  200.                                 else
  201.                                         tmp2=1;
  202.                                   day=TEN_BCD(tmp2);
  203.                                 write_1302(0x86,day);
  204.                                 write_1302(0x8e,0x80);break;
  205.                                 /**********效果同上*********/

  206.                                 /**************周************/
  207.                                 case 0x81:                  
  208.                                 write_1302(0x8e,0x00);
  209.                                 if(BCD_TEN(time[5])<7)
  210.                                 {
  211.                                         tmp3=BCD_TEN(time[5]);
  212.                                         tmp3++;
  213.                                 }        
  214.                                 else
  215.                                         tmp3=1;
  216.                                   week=TEN_BCD(tmp3);         
  217.                                 write_1302(0x8a,week);
  218.                                 write_1302(0x8e,0x80);break;        
  219.                                 /**********效果同上********/

  220.                                 /**************時(shí)************/
  221.                                 case 0x12:                        
  222.                                 write_1302(0x8e,0x00);
  223.                                 if(BCD_TEN(time[2])<23)
  224.                                 {
  225.                                         tmp4=BCD_TEN(time[2]);
  226.                                         tmp4++;
  227.                                 }        
  228.                                 else
  229.                                         tmp4=0;
  230.                                   hour=TEN_BCD(tmp4);         
  231.                                 write_1302(0x84,hour);
  232.                                 write_1302(0x8e,0x80);break;
  233.                                 /**********效果同上*******/

  234.                                 /**************分************/
  235.                                 case 0x22:                        
  236.                                 write_1302(0x8e,0x00);
  237.                                 if(BCD_TEN(time[1])<59)
  238.                                 {
  239.                                         tmp5=BCD_TEN(time[1]);
  240.                                         tmp5++;        
  241.                                 }
  242.                                 else
  243.                                         tmp5=0;
  244.                                   minu=TEN_BCD(tmp5);         
  245.                                 write_1302(0x82,minu);
  246.                                 write_1302(0x8e,0x80);break;
  247.                                 /***********效果同上*******/
  248.                                 
  249.                                 /**************秒************/        
  250.                                 case 0x42:                          
  251.                                 write_1302(0x8e,0x00);
  252.                                 write_1302(0x80,0x00);        
  253.                                 write_1302(0x8e,0x80);break;
  254.                                 /*效果為按下鍵歸0,不像上面按下加1按下加1*/        
  255.                         }
  256.                 }
  257.                 KEYRETURN=0;
  258.         }
  259.                

  260. void main()
  261. {        

  262.         ds1302_init();//1302初始化,設(shè)定時(shí)間
  263.         Lcd_init();         //        lcd初始化
  264.         while(1)
  265.         {
  266.                 read_time(&time); //讀取時(shí)間
  267.                 lcd_dis();         //        顯示在lcd
  268.                 change_time(); //按鍵調(diào)時(shí)
  269.         }
  270.          while(1); //等待
  271. }
復(fù)制代碼

詳細(xì)程序可下載免費(fèi) 按鍵調(diào)節(jié)加lcd顯示時(shí)鐘.rar (43.4 KB, 下載次數(shù): 176) 附件

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:640928 發(fā)表于 2019-11-23 20:30 來(lái)自手機(jī) | 只看該作者
為什么我試了一下,什么反映也沒(méi)有
回復(fù)

使用道具 舉報(bào)

板凳
ID:84745 發(fā)表于 2020-9-19 22:21 來(lái)自手機(jī) | 只看該作者
沒(méi)Uv2文件,初學(xué)者不會(huì)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: caoporn国产精品免费公开 | 欧美8一10sex性hd | 色综合色综合色综合 | 国产美女一区二区 | 美女黄网 | 天天久久 | 色综合天天天天做夜夜夜夜做 | 午夜欧美一区二区三区在线播放 | 久久久久国产精品 | 欧美性猛交一区二区三区精品 | 嫩草视频在线 | 成人a在线| 99re在线免费视频 | 欧美性乱| 毛片一区| 欧美三区在线观看 | 欧美在线视频a | 91激情视频| 久久99精品久久久久久青青日本 | 色爱综合网 | 日韩一区二区成人 | 久久综合伊人一区二区三 | 久久视频精品 | 欧美一区视频在线 | 91啪亚洲精品 | 伊人电影院av | www.久久.com | 色婷婷一区二区三区四区 | 欧美精品网 | 成人一区av偷拍 | 天堂视频中文在线 | 国产视频第一页 | 国产你懂的在线观看 | 亚洲精品国产成人 | 成人3d动漫一区二区三区91 | 国产精品毛片久久久久久久 | 国产欧美精品一区二区 | 国产免费看 | 国产精品福利在线观看 | 欧美成人精品一区二区男人看 | 一级毛片中国 |