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

📄 时钟ds1302lcd.lst

📁 时钟DS1302(LCD)
💻 LST
📖 第 1 页 / 共 2 页
字号:

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

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

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

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


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