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

📄 时钟ds1302lcd.lst

📁 一些51单片机基础模块的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 244   1              T_RST = 1;
 245   1              v_RTInputByte(0xbe);          //0xbe:时钟多字节写命令
 246   1              for(i=8; i>0; i--)            //8Byte = 7Byte 时钟数据 + 1Byte 控制
 247   1              {
 248   2                      v_RTInputByte(*pSecDa);   //写1Byte数据
 249   2                      pSecDa++;
 250   2              }
 251   1              T_CLK = 1;
 252   1              T_RST = 0;
 253   1      }
 254          
 255          /********************************************************************
 256          * 名称   :  v_BurstR1302T(uchar *pSecDa)
 257          * 功能   :  读取DS1302时钟数据
 258          * 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
 259          *                                              7Byte (BCD码) 1B 1B 1B 1B 1B 1B   1B
 260          * 返回值 :  ucDa :读取的数据
 261          ***********************************************************************/
 262          void v_BurstR1302T(uchar *pSecDa)
 263          {
 264   1              uchar i;
 265   1              T_RST = 0;
 266   1              T_CLK = 0;
 267   1              T_RST = 1;
 268   1              v_RTInputByte(0xbf);               //0xbf:时钟多字节读命令
 269   1              for(i=8; i>0; i--)
 270   1              {
 271   2                      *pSecDa = uc_RTOutputByte();   //读1Byte数据
 272   2                      pSecDa++;
 273   2              }
 274   1              T_CLK = 1;
 275   1              T_RST = 0;
 276   1      }
 277          
 278          /********************************************************************
 279          * 名称   :  v_BurstW1302R(uchar *pReDa)
 280          * 功能   :  往DS1302寄存器数写入数据(多字节方式)
 281          * 输入   :  pReDa: 寄存器数据地址
 282          * 返回值 :  无
 283          ***********************************************************************/
 284          void v_BurstW1302R(uchar *pReDa)
 285          {
 286   1              uchar i;
 287   1              v_W1302(0x8e,0x00);         //控制命令,WP=0,写操作
 288   1              T_RST = 0;
 289   1              T_CLK = 0;
 290   1              T_RST = 1;
 291   1              v_RTInputByte(0xfe);       //0xbe:时钟多字节写命令
 292   1              for(i=31; i>0; i--)        //31Byte 寄存器数据
 293   1              {
 294   2                      v_RTInputByte(*pReDa); //写1Byte数据
 295   2                      pReDa++;
 296   2              }
 297   1              T_CLK = 1;
 298   1              T_RST = 0;
 299   1      }
 300          
 301          /********************************************************************
 302          * 名称   :  v_BurstR1302R(uchar *pReDa)
 303          * 功能   :  读取DS1302寄存器数据
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/10/2009 19:42:50 PAGE 6   

 304          * 输入   :  pReDa: 寄存器数据地址
 305          * 返回值 :  无
 306          ***********************************************************************/
 307          void v_BurstR1302R(uchar *pReDa)
 308          {
 309   1              uchar i;
 310   1              T_RST = 0;
 311   1              T_CLK = 0;
 312   1              T_RST = 1;
 313   1              v_RTInputByte(0xff);            //0xbf:时钟多字节读命令
 314   1              for(i=31; i>0; i--)             //31Byte 寄存器数据
 315   1              {
 316   2                      *pReDa = uc_RTOutputByte(); //读1Byte数据
 317   2                      pReDa++;
 318   2              }
 319   1              T_CLK = 1;
 320   1              T_RST = 0;
 321   1      }
 322          
 323          /********************************************************************
 324          * 名称  :  v_Set1302(uchar *pSecDa)
 325          * 功能  :  设置初始时间
 326          * 输入  :  pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
 327          *                                                                  7Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B
 328          * 返回值: 无
 329          ***********************************************************************/
 330          void v_Set1302(uchar *pSecDa)
 331          {
 332   1              uchar i;
 333   1              uchar ucAddr = 0x80;
 334   1              v_W1302(0x8e, 0x00);            //控制命令,WP=0,写操作
 335   1              for(i=7; i>0; i--)
 336   1              {
 337   2                      v_W1302(ucAddr, *pSecDa);   // 秒 分 时 日 月 星期 年
 338   2                      pSecDa++;
 339   2                      ucAddr += 2;
 340   2              }
 341   1              v_W1302(0x8e, 0x80);            //控制命令,WP=1,写保护
 342   1      }
 343          
 344          /********************************************************************
 345          * 名称   : v_Get1302(uchar ucCurtime[])
 346          * 功能   : 读取DS1302当前时间
 347          * 输入   : ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
 348          *                                         7Byte (BCD码) 1B 1B 1B 1B 1B  1B  1B
 349          * 返回值 : 无
 350          ***********************************************************************/
 351          void v_Get1302(uchar ucCurtime[])
 352          {
 353   1              uchar i;
 354   1              uchar ucAddr = 0x81;
 355   1              for(i=0; i<7; i++)
 356   1              {
 357   2                      ucCurtime[i] = uc_R1302(ucAddr);    //格式为: 秒 分 时 日 月 星期 年
 358   2                      ucAddr += 2;
 359   2              }
 360   1      }
 361          
 362          /********************************************************************
 363          * 名称 : dectobcd(uchar dec)
 364          * 功能 : DEC码转换为BCD码
 365          * 输入 : dec码
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/10/2009 19:42:50 PAGE 7   

 366          * 输出 : bcd码
 367          ***********************************************************************/
 368          uchar dectobcd(uchar dec)
 369          {
 370   1              uchar bcd;
 371   1              bcd = 0;
 372   1              while(dec >= 10)
 373   1              {              
 374   2                      dec -= 10;                         
 375   2                      bcd++;
 376   2              } 
 377   1              bcd <<= 4;
 378   1              bcd |= dec;
 379   1              return bcd;
 380   1      }
 381          
 382          /********************************************************************
 383          * 名称 : bcdtodec(uchar bcd)
 384          * 功能 : BCD码转换为DEC码
 385          * 输入 : bcd码
 386          * 输出 : dec码
 387          ***********************************************************************/
 388          uchar bcdtodec(uchar bcd)
 389          {
 390   1              uchar data1;
 391   1              data1 = bcd & 0x0f;     //取BCD低4位
 392   1              bcd = bcd & 0x70;       //剔除BCD的最高位和低4位。
 393   1              data1 += bcd >> 1;
 394   1              data1 += bcd >> 3;      //用位移代替乘法运算
 395   1              return data1;
 396   1      }
 397          
 398          /********************************************************************
 399          * 名称 : Write_DS1302Init()
 400          * 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。
 401          * 输入 : 无
 402          * 输出 : 无
 403          ***********************************************************************/
 404          void Write_DS1302Init(void)
 405          {
 406   1              v_W1302(0x8e,0);
 407   1              v_W1302(0x80,0x50);     //写入秒
 408   1              v_W1302(0x8e,0);
 409   1              v_W1302(0x82,0x59);     //写入分
 410   1              v_W1302(0x8e,0);
 411   1              v_W1302(0x84,0x07);     //写入小时
 412   1              v_W1302(0x8e,0);
 413   1              v_W1302(0x86,0x08);     //写入日
 414   1              v_W1302(0x8e,0);
 415   1              v_W1302(0x88,0x08);     //写入月
 416   1              v_W1302(0x8e,0);
 417   1              v_W1302(0x8a,0x05);     //写入星期
 418   1              v_W1302(0x8e,0);
 419   1              v_W1302(0x8c,0x08);     //写入年        
 420   1      }
 421          
 422          /********************************************************************
 423          * 名称 : Run_DS1302(void)
 424          * 功能 : 读出DS1302中的数据,并在液晶1602上进行显示
 425          * 输入 : 无
 426          * 输出 : 无
 427          ***********************************************************************/
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/10/2009 19:42:50 PAGE 8   

 428          void Run_DS1302(void)
 429          {
 430   1              uchar sec, min, hour, day, month, year;
 431   1              while(1)
 432   1              {
 433   2                      v_W1302(0x8f, 0);
 434   2                      sec = bcdtodec(uc_R1302(0x81));    //读出DS1302中的秒
 435   2                      v_W1302(0x8f, 0);
 436   2                      min = bcdtodec(uc_R1302(0x83));    //读出DS1302中的分
 437   2                      v_W1302(0x8f, 0);
 438   2                      hour = bcdtodec(uc_R1302(0x85));   //读出DS1302中的小时
 439   2                      v_W1302(0x8f, 0);
 440   2                      day = bcdtodec(uc_R1302(0x87));    //读出DS1302中的日
 441   2                      v_W1302(0x8f, 0);
 442   2                      month = bcdtodec(uc_R1302(0x89));  //读出DS1302中的月
 443   2                      v_W1302(0x8f, 0);
 444   2                      year = bcdtodec(uc_R1302(0x8d));   //读出DS1302中的年
 445   2      
 446   2                      L1602_char(2, 6, hour / 10 % 10 + 48);
 447   2                      L1602_char(2, 7, hour % 10 + 48);
 448   2                      L1602_char(2, 8, '-');
 449   2                      L1602_char(2, 9, min / 10 % 10 + 48);
 450   2                      L1602_char(2, 10, min % 10 + 48);
 451   2                      L1602_char(2, 11, '-');
 452   2                      L1602_char(2, 12, sec / 10 % 10 + 48);
 453   2                      L1602_char(2, 13, sec % 10 + 48);
 454   2                      L1602_char(1, 8, year / 10 % 10 + 48);
 455   2                      L1602_char(1, 9, year % 10 + 48);
 456   2                      L1602_char(1, 10, '-');
 457   2                      L1602_char(1, 11, month / 10 % 10 + 48);
 458   2                      L1602_char(1, 12, month % 10 + 48);
 459   2                      L1602_char(1, 13, '-');
 460   2                      L1602_char(1, 14, day / 10 % 10 + 48);
 461   2                      L1602_char(1, 15, day % 10 + 48);
 462   2              }
 463   1      
 464   1      } 
 465          
 466          /********************************************************************
 467          * 名称 : Main(void)
 468          * 功能 : 主函数
 469          * 输入 : 无
 470          * 输出 : 无
 471          ***********************************************************************/ 
 472          void Main(void)
 473          {
 474   1              L1602_init();
 475   1              L1602_string(1,1,"DAYS 20");
 476   1              L1602_string(2,1,"TIME");
 477   1              Write_DS1302Init();
 478   1              Run_DS1302();
 479   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    999    ----
   CONSTANT SIZE    =     13    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/10/2009 19:42:50 PAGE 9   

END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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