⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.lst

📁 Keil C51完整的128X64LCD显示的电子打铃仪代码,内含DS1302X5045等操作代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
              void DS1302_RAM_Burst_RD(uint8 *pReDa)
              {
                      uint8 i;
              
                      RSTB = 0;
                      SCLK = 0;
                      RSTB = 1;
                      DS1302_InputByte(0xff); // 0xbf:时钟多字节读命令 
                      for (i=31; i>0; i--) //31Byte 寄存器数据 
                      {
                              *pReDa = DS1302_OutputByte(); // 读1Byte数据 
                              pReDa++;
                      }
                      SCLK = 1;
                      RSTB =0;
              }
              #endif
 222          
 223          /*********************************************************************** 
 224          *
 225          * 名称: Write_TimeToDS1302
 226          * 说明: 
 227          * 功能: 设置初始时间
 228          * 调用: v_W1302() 
 229          * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
 230          * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 231          * 返回值: 无
 232          ***********************************************************************/
 233          void Write_TimeToDS1302(uint8 *pSecDa,uint8 change_flag) 
 234          {
 235   1              uint8 i;
 236   1              uint8 ucAddr = 0x80; 
 237   1              
 238   1              W_ByteToDS1302(0x8E,0x00); // 控制命令,WP=0,写操作?
 239   1      
 240   1              for(i =0;i<7;i++)
 241   1              { 
C51 COMPILER V7.50   DS1302                                                                06/10/2006 08:26:02 PAGE 5   

 242   2                  if((change_flag&0x01)==0x01)//只写入已改变的值
 243   2                          W_ByteToDS1302(ucAddr,pSecDa[i]); // 秒 分 时 日 月 星期 年 
 244   2                      change_flag=change_flag>>1;    
 245   2                      ucAddr +=2;
 246   2              }
 247   1              
 248   1              W_ByteToDS1302(0x80,pSecDa[0]&0x7F);    //打开时钟振荡
 249   1              W_ByteToDS1302(0x8E,0x80); // 控制命令,WP=1,写保护?
 250   1      }
 251          
 252          /*********************************************************************** 
 253          *
 254          * 名称: Get_TimeFromDS1302
 255          * 说明: 
 256          * 功能: 读取DS1302当前时间
 257          * 调用: RD_ByteFromDS1302() 
 258          * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
 259          * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 260          * 返回值: 无
 261          ***********************************************************************/
 262          void Get_TimeFromDS1302(uint8 ucCurtime[]) 
 263          {
 264   1              uint8 i;
 265   1              uint8 ucAddr = 0x81;
 266   1              for (i=0;i<7;i++)
 267   1              {
 268   2                      ucCurtime[i] = RD_ByteFromDS1302(ucAddr);//格式为: 秒 分 时 日 月 星期 年 
 269   2                      ucAddr += 2;
 270   2              }
 271   1      } 
 272          
 273          /******************************************************************** 
 274          *
 275          * 名称: W_ByteToDS1302_RAM
 276          * 说明: 先写地址,后写数据
 277          * 功能: 往DS1302的RAM中写入数据
 278          * 调用: W_ByteToDS1302() 
 279          * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
 280          * 返回值: 无
 281          ***********************************************************************/
 282          void W_ByteToDS1302_RAM(uint8 ucAddr, uint8 ucDa)
 283          {
 284   1              W_ByteToDS1302(0x8E,0x00);                      // 控制命令,WP=0,写操作?
 285   1              W_ByteToDS1302(ucAddr,ucDa);            // 秒 分 时 日 月 星期 年     
 286   1              W_ByteToDS1302(0x8E,0x80);                      // 控制命令,WP=1,写保护?
 287   1      } 
 288          
 289          /******************************************************************** 
 290          *
 291          * 名称: RD_ByteFromDS1302_RAM
 292          * 说明: 先写地址,后读数据
 293          * 功能: 读取DS1302某地址的数据
 294          * 调用: RD_ByteFromDS1302()
 295          * 输入: ucAddr: DS1302地址
 296          * 返回值: ucDa :读取的数据
 297          ***********************************************************************/
 298          uint8 RD_ByteFromDS1302_RAM(uint8 ucAddr)
 299          {
 300   1              uint8 ucDa;
 301   1              ucDa = RD_ByteFromDS1302(ucAddr);
 302   1              return(ucDa);
 303   1      }
C51 COMPILER V7.50   DS1302                                                                06/10/2006 08:26:02 PAGE 6   

 304          
 305          /*********************************************************************** 
 306          *
 307          * 名称: Initial_DS1302
 308          * 说明: 
 309          * 功能: 初始化DS1302,
 310          * 调用: W_ByteToDS1302() 
 311          * 输入: 无
 312          * 返回值: 无
 313          ***********************************************************************/
 314          void Initial_DS1302(void) 
 315          {
 316   1              uint8 tempvv0,tempvv1;
 317   1      
 318   1              tempvv0 =       RD_ByteFromDS1302(0x81);//读秒值
 319   1              tempvv1 =       RD_ByteFromDS1302(0x85);//读小时值
 320   1      
 321   1              W_ByteToDS1302(0x8e,0x00);                      // 控制命令,WP=0,写操作?
 322   1      
 323   1              W_ByteToDS1302(0x90,0xAA);                      //设置充电模式
 324   1              W_ByteToDS1302(0x84,tempvv1&0x7F);      //设置为24小时制
 325   1          W_ByteToDS1302(0x80,tempvv0&0x7F);  //打开时钟振荡
 326   1      
 327   1              W_ByteToDS1302(0x8e,0x80);                      // 控制命令,WP=1,写保护?
 328   1      }
 329          
 330          
 331          /***********************************************************************
 332          * 名称: Calc_Week
 333          * 说明: 只计算2000年至2099年的星期
 334          * 功能: 通过日期算星期
 335          * 调用: month_n_day()
 336          * 输入: y,m,d(年,月,日)
 337          * 返回值: 星期几
 338          ***********************************************************************/
 339          uint8 Calc_Week(uint8 y,uint8 m,uint8 d)
 340          {
 341   1          uint32 nday=0;
 342   1          uint16 i;
 343   1          uint16 yy;
 344   1              uint8 zz;
 345   1              
 346   1              y=((y>>4)&0x0F)*10+(y&0x0F);
 347   1              m=((m>>4)&0x0F)*10+(m&0x0F);
 348   1              d=((d>>4)&0x0F)*10+(d&0x0F);
 349   1              
 350   1          yy=y+2000;
 351   1      
 352   1          for (i=2000;i<yy;i++)  
 353   1              {  
 354   2                      if(((i%4 == 0) && (i%100 != 0)) || (i%400 == 0))
 355   2                              zz=1;
 356   2                      else
 357   2                              zz=0;
 358   2              nday =nday+zz+365;
 359   2          }
 360   1          
 361   1          for (i=1;i<m;i++)
 362   1              {
 363   2                      zz=month_n_day(yy,i);
 364   2              nday=nday+zz;
 365   2          }
C51 COMPILER V7.50   DS1302                                                                06/10/2006 08:26:02 PAGE 7   

 366   1          
 367   1          nday=nday+d+5;
 368   1          zz=(uint8)(nday%7);
 369   1          return(zz);
 370   1          
 371   1      }
 372          
 373          /******************************************************************** 
 374          *
 375          * 名称: month_n_day
 376          * 说明: 计算某年的某月有几天
 377          * 功能: 计算某年的某月有几天
 378          * 调用: 无
 379          * 输入: y,m(年,月)
 380          * 返回值: 这个月的天数
 381          ***********************************************************************/
 382          uint8 month_n_day(uint16 y,uint8 m)  //算出某年某月有多少天
 383          {
 384   1             if(m==2)
 385   1                 {
 386   2                    if(((y%4 == 0) && (y%100 != 0)) || (y%400 == 0))
 387   2                                      return 0x29;
 388   2                                else
 389   2                                      return 0x28;
 390   2                 }
 391   1             else
 392   1                    return(monthday[m-1]);
 393   1      }
 394          /*********************************************************************************************************
             -***
 395          ***************************************** END OF FILE ****************************************************
             -***
 396          **********************************************************************************************************
             -**/
 397          
 398          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    668    ----
   CONSTANT SIZE    =     12    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      20
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -