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

📄 时钟ds1302lcd.lst

📁 单片机的实用程序代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 235          
 236          /********************************************************************
 237          * 名称   :  v_BurstR1302T(uchar *pSecDa)
 238          * 功能   :  读取DS1302时钟数据
 239          * 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
 240          *                                              7Byte (BCD码) 1B 1B 1B 1B 1B 1B   1B
 241          * 返回值 :  ucDa :读取的数据
C51 COMPILER V7.50   时钟DS1302LCD                                                         11/05/2010 16:12:57 PAGE 5   

 242          ***********************************************************************/
 243          void v_BurstR1302T(uchar *pSecDa)
 244          {
 245   1              uchar i;
 246   1              T_RST = 0;
 247   1              T_CLK = 0;
 248   1              T_RST = 1;
 249   1              v_RTInputByte(0xbf);               //0xbf:时钟多字节读命令
 250   1              for(i=8; i>0; i--)
 251   1              {
 252   2                      *pSecDa = uc_RTOutputByte();   //读1Byte数据
 253   2                      pSecDa++;
 254   2              }
 255   1              T_CLK = 1;
 256   1              T_RST = 0;
 257   1      }
 258          
 259          /********************************************************************
 260          * 名称   :  v_BurstW1302R(uchar *pReDa)
 261          * 功能   :  往DS1302寄存器数写入数据(多字节方式)
 262          * 输入   :  pReDa: 寄存器数据地址
 263          * 返回值 :  无
 264          ***********************************************************************/
 265          void v_BurstW1302R(uchar *pReDa)
 266          {
 267   1              uchar i;
 268   1              v_W1302(0x8e,0x00);         //控制命令,WP=0,写操作
 269   1              T_RST = 0;
 270   1              T_CLK = 0;
 271   1              T_RST = 1;
 272   1              v_RTInputByte(0xfe);       //0xbe:时钟多字节写命令
 273   1              for(i=31; i>0; i--)        //31Byte 寄存器数据
 274   1              {
 275   2                      v_RTInputByte(*pReDa); //写1Byte数据
 276   2                      pReDa++;
 277   2              }
 278   1              T_CLK = 1;
 279   1              T_RST = 0;
 280   1      }
 281          
 282          /********************************************************************
 283          * 名称   :  v_BurstR1302R(uchar *pReDa)
 284          * 功能   :  读取DS1302寄存器数据
 285          * 输入   :  pReDa: 寄存器数据地址
 286          * 返回值 :  无
 287          ***********************************************************************/
 288          void v_BurstR1302R(uchar *pReDa)
 289          {
 290   1              uchar i;
 291   1              T_RST = 0;
 292   1              T_CLK = 0;
 293   1              T_RST = 1;
 294   1              v_RTInputByte(0xff);            //0xbf:时钟多字节读命令
 295   1              for(i=31; i>0; i--)             //31Byte 寄存器数据
 296   1              {
 297   2                      *pReDa = uc_RTOutputByte(); //读1Byte数据
 298   2                      pReDa++;
 299   2              }
 300   1              T_CLK = 1;
 301   1              T_RST = 0;
 302   1      }
 303          
C51 COMPILER V7.50   时钟DS1302LCD                                                         11/05/2010 16:12:57 PAGE 6   

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

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

 428   2                      L1602_char(2, 7, hour % 10 + 48);
 429   2                      L1602_char(2, 8, '-');
 430   2                      L1602_char(2, 9, min / 10 % 10 + 48);
 431   2                      L1602_char(2, 10, min % 10 + 48);
 432   2                      L1602_char(2, 11, '-');
 433   2                      L1602_char(2, 12, sec / 10 % 10 + 48);
 434   2                      L1602_char(2, 13, sec % 10 + 48);
 435   2                      L1602_char(1, 8, year / 10 % 10 + 48);
 436   2                      L1602_char(1, 9, year % 10 + 48);
 437   2                      L1602_char(1, 10, '-');
 438   2                      L1602_char(1, 11, month / 10 % 10 + 48);
 439   2                      L1602_char(1, 12, month % 10 + 48);
 440   2                      L1602_char(1, 13, '-');
 441   2                      L1602_char(1, 14, day / 10 % 10 + 48);
 442   2                      L1602_char(1, 15, day % 10 + 48);
 443   2              }
 444   1      
 445   1      } 
 446          
 447          /********************************************************************
 448          * 名称 : Main(void)
 449          * 功能 : 主函数
 450          * 输入 : 无
 451          * 输出 : 无
 452          ***********************************************************************/ 
 453          void Main(void)
 454          {
 455   1              L1602_init();
 456   1              L1602_string(1,1,"DAYS 20");
 457   1              L1602_string(2,1,"TIME");
 458   1              Write_DS1302Init();
 459   1              Run_DS1302();
 460   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    930    ----
   CONSTANT SIZE    =     13    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      10
   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 + -