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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1942|回復: 0
打印 上一主題 下一主題
收起左側

一個萬年歷的分享 開源 甚至還可以自己開發

[復制鏈接]
跳轉到指定樓層
樓主
  #include <reg51.h>
  #include <intrins.h>
  #define uchar unsigned char
  #define uchar unsigned char
  #define uint unsigned int
  sbit DS1302_CLK=P3^2;
  sbit DS1302_IO=P3^3;
  sbit DS1302_RST=P3^4;
  sbit ACC0=ACC^0;
  sbit ACC7=ACC^7;
  sbit Tiaoshi=P3^7;  //調試按鍵
  sbit Inck=P3^6;        //升序按鍵
  uchar count=0;        //記錄按鍵次數
  uchar temp;
   sfr Wei=0xa0;
   sfr Duan=0x90;
  bit Inck_flag=0x20;        //升序調試標志
  bit flag=0x21;
  char hide_sec;
  char hide_min;
  char hide_hour;
  char hide_day;
  char hide_month;
  char hide_year;
  typedef struct _SYSTEMTIME_
{
        uchar Second;
        uchar Minute;
        uchar Hour;
        uchar Day;
        uchar Month;
        uchar Year;
        uchar TimeStr[12];
  }SYSTEMTIME;                         //定義的時間類型
  SYSTEMTIME CurrentTime;  //結構體名稱CurrentTime
  #define AM(X) X
  #define PM(X) (X+12)         //轉成24小時制
  #define DS1302_SECOND 0x80  //秒寄存器地址
  #define DS1302_MINUTE 0x82  //分寄存器地址
  #define DS1302_HOUR 0x84         //小時寄存器地址
  #define DS1302_DAY 0x86
  #define DS1302_MONTH 0x88
  #define DS1302_YEAR 0x8c
  void mdelay(unsigned int count)         //延時函數
  {
    uchar i,j;
        for(i=0;i<count;i++)
        {
          for(j=0;j<120;j++)
          ;
        }
  }
  void DS1302InputByte(uchar d)          //向1302中通過ACC輸入數值d
  {
    uchar i;
        ACC=d;
        for(i=8;i>0;i--)
        {
          DS1302_IO=ACC0;
          DS1302_CLK=1;          //一個時鐘的上升沿輸出
          DS1302_CLK=0;
          ACC=ACC>>1;
        }
  }
uchar DS1302OutputByte(void)           //ds1302向單片機發送數據返回值為ACC
{
   uchar i;
   for(i=8;i>0;i--)
   {
     ACC=ACC>>1;
         ACC7=DS1302_IO;
         DS1302_CLK=1;
         DS1302_CLK=0;
        }
        return(ACC);
}
void Write1302(uchar ucAddr,uchar ucDa)   //向ds1302中寫入數據地址為Addar,數據為ucDa
{
   DS1302_RST=0;
   DS1302_CLK=0;
   DS1302_RST=1;
   DS1302InputByte(ucAddr);           //先發送地址,命令
   DS1302InputByte(ucDa);           //然后寫1Byte數據
   DS1302_CLK=1;
   DS1302_RST=0;
  }
  uchar Read1302(uchar ucAddr)        //讀取DS1302某地址的數據
  {
    uchar ucData;
        DS1302_RST=0;
        DS1302_CLK=0;
        DS1302_RST=1;
        DS1302InputByte(ucAddr|0x01);                //輸入地址,命令
        ucData=DS1302OutputByte();                        //讀1Byte數據
        DS1302_CLK=1;
        DS1302_RST=0;
        return(ucData);
  }
  void DS1302_SetProtect(bit flag1)                //           是否寫保護
  {
    if(flag1)
            Write1302(0x8E,0x10);
        else
            Write1302(0x8E,0x00);
  }
  void DS1302_SetTime(uchar Address,uchar Value)     //設置時間函數
  {
      DS1302_SetProtect(0);
          Write1302(Address,((Value/10)<<4|(Value%10)));
  }
  void DS1302_GetTime(SYSTEMTIME *Time)           //將ds1302中讀取的數據存入結構體
  {
    uchar ReadValue;
        ReadValue=Read1302(DS1302_SECOND);        //將秒位的數據賦值給ReadValue變量
        Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //結構體中的數變為十進制數
        ReadValue=Read1302(DS1302_MINUTE); //分位
        Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
        ReadValue=Read1302(DS1302_HOUR);
        Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);


        ReadValue=Read1302(DS1302_DAY);        //將的數據賦值給ReadValue變量
        Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //結構體中的數變為十進制數
        ReadValue=Read1302(DS1302_MONTH); //
        Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
        ReadValue=Read1302(DS1302_YEAR);
        Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
  }
  void TimeToStr(SYSTEMTIME *Time)           //數據緩存區
  {
     Time->TimeStr[0]=Time->Hour/10;   //將小時的十位存入TimeStr[0]
         Time->TimeStr[1]=Time->Hour%10;

         Time->TimeStr[2]=Time->Minute/10;
         Time->TimeStr[3]=Time->Minute%10;

         Time->TimeStr[4]=Time->Second/10;
         Time->TimeStr[5]=Time->Second%10;


         Time->TimeStr[6]=Time->Year/10;   //將小時的十位存入TimeStr[0]
         Time->TimeStr[7]=Time->Year%10;

         Time->TimeStr[8]=Time->Month/10;
         Time->TimeStr[9]=Time->Month%10;

         Time->TimeStr[10]=Time->Day/10;
         Time->TimeStr[11]=Time->Day%10;
  }
  void Delay1ms(uint count1)        //延時函數
  {
    uint i,j;
        for(i=0;i<count1;i++)
        for(j=0;j<120;j++);
  }
  void Dis(SYSTEMTIME *Time)  //顯示函數
  {
    uchar disbit,shitfb;
        DS1302_GetTime(Time);        //從1302中獲取時間并存入結構體Time中
        TimeToStr(Time);          //將結構體中數據緩存至TimeStr[0]
        disbit=1;          //0xfe;        最后一位打開
        for(shitfb=0;shitfb<6;shitfb++)
        {_nop_();     _nop_();          //延時
         Duan=Time->TimeStr[shitfb]; //段選依次輸入         TimeStr[0]到TimeStr[5];
         Wei=_crol_(disbit,shitfb);         //位選依次亮起
          Delay1ms(2);
          Wei=0;
         }
   }

    void Dis2(SYSTEMTIME *Time)  //顯示函數
  {
    uchar disbit,shitfb;
        DS1302_GetTime(Time);        //從1302中獲取時間并存入結構體Time中
        TimeToStr(Time);          //將結構體中數據緩存至TimeStr[0]
        disbit=1;          //0xfe;        最后一位打開
        for(shitfb=6;shitfb<12;shitfb++)
        {_nop_();     _nop_();          //延時
         Duan=Time->TimeStr[shitfb]; //段選依次輸入         TimeStr[6]到TimeStr[11];
         Wei=_crol_(disbit,shitfb-6);         //位選依次亮起
          Delay1ms(2);
          Wei=0;
         }
   }

   void Setkey()        //模式選擇按鍵
   {
       Tiaoshi=1;
           if(Tiaoshi==0)         //調試按鍵按下
           {
              mdelay(8);
                  count=count+1;  //count從0開始計數
                  if(count==7)count=0;
                  while(Tiaoshi==0); //按鍵松開跳出循環
                }
        }
   void Inckey()         //升序按鍵
   {
      Inck=1;
          if(Inck==0)        //升序按鍵按下
          {   mdelay(8);
              switch(count)         //選擇調時模式
                  {case 1:        //調整小時
                   temp=Read1302(DS1302_HOUR);   //讀取小時數 將返回的ACC存入temp
                   temp=((temp&0x70)>>4)*10+(temp&0x0f);   //將ACC化為十進制數
                   temp=temp+1;                                         //小時數加1
                   if(temp>=24)temp=0;
                   Inck_flag=1;
                   break;
                   case 2:
                    temp=Read1302(DS1302_MINUTE); //讀取分數
                        temp=((temp&0x70)>>4)*10+(temp&0x0f);
                        temp=temp+1;                 //分數加1
                        Inck_flag=1;
                        if(temp>=60)temp=0;
                        break;
                        case 3:
                         temp=Read1302(DS1302_SECOND);         //讀取秒數
                         temp=((temp&0x70)>>4)*10+(temp&0x0f);
                         temp=temp+1;                  //秒數加1
                         Inck_flag=1;                   //數據調整后更新標志
                         if(temp>=60)temp=0;
                         break;

                         case 4:        //調整年
                   temp=Read1302(DS1302_YEAR);   //讀取年 將返回的ACC存入temp
                   temp=((temp&0x70)>>4)*10+(temp&0x0f);   //將ACC化為十進制數
                   temp=temp+1;                                         //小時數加1
                   if(temp>=99)temp=0;
                   Inck_flag=1;
                   break;
                   case 5:
                    temp=Read1302(DS1302_MONTH); //讀取
                        temp=((temp&0x70)>>4)*10+(temp&0x0f);
                        temp=temp+1;                 //
                        Inck_flag=1;
                        if(temp>=12)temp=0;
                        break;
                        case 6:
                         temp=Read1302(DS1302_DAY);         //讀取秒數
                         temp=((temp&0x70)>>4)*10+(temp&0x0f);
                         temp=temp+1;                  //秒數加1
                         Inck_flag=1;                   //數據調整后更新標志
                         if(temp>=32)temp=0;
                         break;


                         default: Inck_flag=0;
                                                 break;
                         }
                         while(Inck==0); //檢測松開按鍵
                        }
        }
   void Keydone()               //按鍵功能執行
   {   
                  Setkey();                           //掃描模式切換按鍵
                  switch(count)
                  {case 1:do                                 //count=1,調整時
                       {  Inckey();
                              if(Inck_flag==1)
                                  { temp=(temp/10)<<4|temp%10;
                                    Write1302(0x8e,0x00);   //寫入允許
                                        Write1302(0x84,temp);   //寫入新的小時數temp
                                        Write1302(0x8e,0x80);   //禁止寫入
                                        Inck_flag=0;
                                        }
                                        hide_hour++;
                                        if(hide_hour>3)
                                        hide_hour=0;
                                        Dis(&CurrentTime) ;
                                        }while(count==2);
                                                                                break;
                        case 2:do                                  //count=2,調整分
                          {   hide_hour=0;
                              Inckey();
                                  if(Inck_flag==1)
                                  {   temp=(temp/10)<<4|temp%10;
                                      Write1302(0x8e,0x00); //寫入允許
                                          Write1302(0x82,temp); //寫入新的分數
                                          Write1302(0x8e,0x80); //禁止寫入
                                          Inck_flag=0;
                                          }
                                          hide_min++;
                                          if(hide_min>3)
                                          hide_min=0;
                                          Dis(&CurrentTime);  //程序每循環三次顯示一下
                                          }while(count==3);
                                                                                  break;
                        case 3:do                                         //調整秒
                               {  hide_min=0;
                                      Inckey();                 //掃描加按鈕
                                          if(Inck_flag==1)                 //數據更新,重新寫入新的數據
                                          {   temp=(temp/10)<<4|temp%10;
                                              Write1302(0x8e,0x00);             //寫入允許
                                                  Write1302(0x80,temp&0x7f);  //寫入新的秒數
                                                  Write1302(0x8e,0x80);       //禁止寫入
                                                  Inck_flag=0;
                                                }
                                                hide_sec++;      //位閃計時
                                                if(hide_sec>3)
                                                hide_sec=0;
                                                Dis(&CurrentTime);
                                                }while(count==4);
                                                                                                break;


                    case 4:do                                 //count=1,調整
                       {  Inckey();
                              if(Inck_flag==1)
                                  { temp=(temp/10)<<4|temp%10;
                                    Write1302(0x8e,0x00);   //寫入允許
                                        Write1302(0x8c,temp);   //寫入新的
                                        Write1302(0x8e,0x80);   //禁止寫入
                                        Inck_flag=0;
                                        }
                                        hide_year++;
                                        if(hide_year>3)
                                        hide_year=0;
                                        Dis2(&CurrentTime) ;
                                        }while(count==5);
                                                                                break;
                    case 5:do                                  //count=5
                          {   hide_year=0;
                              Inckey();
                                  if(Inck_flag==1)
                                  {   temp=(temp/10)<<4|temp%10;
                                      Write1302(0x8e,0x00); //寫入允許
                                          Write1302(0x88,temp); //寫入新的
                                          Write1302(0x8e,0x80); //禁止寫入
                                          Inck_flag=0;
                                          }
                                          hide_month++;
                                          if(hide_month>3)
                                          hide_month=0;
                                          Dis2(&CurrentTime);  //程序每循環三次顯示一下
                                          }while(count==6);
                                                                                  break;
                        case 6:do                                         //調整
                               {  hide_month=0;
                                      Inckey();                 //掃描加按鈕
                                          if(Inck_flag==1)                 //數據更新,重新寫入新的數據
                                          {   temp=(temp/10)<<4|temp%10;
                                              Write1302(0x8e,0x00);             //寫入允許
                                                  Write1302(0x86,temp);  //寫入新的
                                                  Write1302(0x8e,0x80);       //禁止寫入
                                                  Inck_flag=0;
                                                }
                                                hide_day++;      //位閃計時
                                                if(hide_day>3)
                                                hide_day=0;
                                                Dis2(&CurrentTime);
                                                }while(count==7);
                                                                                                break;

                        case 7:
                        count=0;hide_sec=0;hide_day=0;
                        break;
                        default:
                                                break;
                        }
                }
                main()
                {   Inck_flag=0;
                    while(1)
                        {
                                if(count<4)
                                {
                                Dis(&CurrentTime);
                           Setkey();
                           if(count!=0)//(F0==1)
                           Keydone();
                           } //進入調整模式

                                   if(count>=4)
                                {
                                Dis2(&CurrentTime);
                           Setkey();
                           if(count!=0)//(F0==1)
                           Keydone();
                           } //進入調整模式

                           }
                        }

IIC6JCAZ(4NW5C$%DBSR]14.png (65.71 KB, 下載次數: 60)

圖紙

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本色综合 | 自拍偷拍第一页 | 久久男女视频 | 99视频久 | 国产欧美精品一区二区 | 亚洲视频在线免费观看 | 国产在线一区观看 | 国产区在线 | www.黄网| 日本一区二区三区免费观看 | 成人a免费| 九九热久久免费视频 | 久久机热| 国产欧美日韩在线一区 | 成人免费网站 | 大学生a级毛片免费视频 | 狠狠综合网 | 亚洲高清在线视频 | 国产高清在线精品 | 鲁视频| 精品国产一级 | 超碰97免费在线 | 亚洲成人高清 | 欧美日韩国产精品一区二区 | 51ⅴ精品国产91久久久久久 | 六月婷婷久久 | 日韩波多野结衣 | 天天插天天射天天干 | 成人在线一区二区 | 欧美v在线| 久久小视频 | 亚洲免费在线观看 | 国产成人精品一区二区三区四区 | 九九国产 | 亚洲成人免费观看 | 国产美女免费视频 | 欧美在线国产精品 | 草草视频在线观看 | wwww.8888久久爱站网 | 久久夜夜| 日韩三级视频 |