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

📄 1302.lst

📁 1302实现时钟定时报警
💻 LST
📖 第 1 页 / 共 3 页
字号:
 258          ********************************************************/
 259          void  writetab(uchar num,uchar *tab)  
 260          {  
 261   1              unsigned char i;
 262   1              lcd_wcmd(64+(num-1)*8);            //写CGRAM
 263   1              for (i = 0; i< 8; i++)   
 264   1              lcd_wdat(*tab++);        
 265   1      }
 266          /*********************************************************************
 267          函数描述:显示自定义字符
 268          入口参数:row:显示位置(行)
 269                    col:显示位置(列)      
 270                    num:自定义字符代码,范围1~8
 271          出口参数:无
 272          ***********************************************************************/
 273          void xianshitab(uchar row,uchar col,uchar num)
 274          {       write_position(row,col);
 275   1              lcd_wdat(num-1);        
 276   1      }       
 277          
 278          /*********************************************************
 279          函数描述:写入指定n个字符到指定位置(位置向增加方向变化)             
 280          入口参数:num:指定字符数目
 281                    row:行(范围1~2)  
 282                    col:列(范围1~16)
 283                    str:显示字符的起始地址        
 284          出口参数:无                                                         
 285          ********************************************************/
 286          void write_str1(uchar row,uchar col,uchar *str,uchar num)
 287          {
 288   1              uchar i=0; 
 289   1              lcd_wcmd(0x06);      //移动右移光标
 290   1              delay1(5);
 291   1              write_position(row,col);
 292   1              for(i=0;i<num;i++)
 293   1              {       lcd_wdat(*str++);
 294   2              }
 295   1      }
 296          /*****************************************************************
 297          函数描述:指定位置显示指定字符
 298          入口参数:dat:显示的字符
 299                    row:行(范围1~2)  
 300                    col:列(范围1~16)
 301          出口参数:无
 302          *******************************************************************/
 303          void  write_str3(uchar row,uchar col,uchar dat) 
C51 COMPILER V7.06   1302                                                                  12/03/2007 08:44:24 PAGE 6   

 304          {       write_position(row,col);
 305   1              lcd_wdat(dat);
 306   1      }
 307          
 308          void int1(void)  interrupt 3   //采用中断0 控制节拍//10ms
 309          {       TH1=0xd8;
 310   1              TL1=0xef;
 311   1              n--;
 312   1      }
 313          
 314          void delay2 (unsigned char m)   //控制频率延时,基本延时为1ms
 315          {
 316   1              unsigned        i=m;
 317   1              while(--i);
 318   1      }
 319          
 320          void delayms(unsigned char a)  //毫秒延时子程序
 321          {
 322   1              while(--a);      //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
 323   1      }
 324          /*************************************************************************************************
 325          函数描述:播放音乐两只老虎
 326          入口参数:无
 327          出口参数:无
 328          调用模块: time_campare()
 329          ***************************************************************************************************/
 330          void playmusic()
 331          {       unsigned char p,m;   //m为频率常数变量
 332   1              unsigned char i=0;
 333   1        
 334   1              TR1 = 1;
 335   1              while(1)
 336   1          {   if(!K2)
 337   2                              break;
 338   2      a:              p=music_code[i];
 339   2              if(p==0x00)
 340   2              {       i=0;
 341   3                      delayms(1000);
 342   3                      break;
 343   3                      }     //如果碰到结束符,延时1秒,回到开始再来一遍
 344   2             else if(p==0xff) 
 345   2              {       i=i+1;
 346   3                      delayms(100);
 347   3                      TR1=0;
 348   3                      goto a;
 349   3                      }  //若碰到休止符,延时100ms,继续取下一音符
 350   2             else        
 351   2              {
 352   3                      m=music_code[i++];
 353   3                      n=music_code[i++];
 354   3                      }  //取频率常数 和 节拍常数
 355   2              TR1=1;                                             //开定时器1
 356   2              while(n!=0)
 357   2              {
 358   3                      BEEP=!BEEP;
 359   3                      delay2(m);
 360   3                      }                         //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
 361   2              TR1=0;                                             //关定时器1
 362   2          }            //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
 363   1              TR1=0; 
 364   1             //关定时器1
 365   1              BEEP = 1;
C51 COMPILER V7.06   1302                                                                  12/03/2007 08:44:24 PAGE 7   

 366   1                          
 367   1      }
 368          
 369          /**************************************************************************
 370          函数描述:向ds1302写一字节数据
 371          入口参数:dat:所写的数据
 372          出口参数:无
 373          ***************************************************************************/
 374          void write_dat(uchar dat)
 375          {
 376   1              uchar i;
 377   1              for(i=0;i<8;i++)
 378   1              {
 379   2                      CLK = 0;                //写的时候低电平改变数据
 380   2                      if((dat&0x01)==0x01)
 381   2                              DATA = 1;
 382   2                      else 
 383   2                              DATA = 0;        //写的时候高电平,把数据写入ds1302
 384   2                      CLK = 1;
 385   2                      _nop_();
 386   2                      dat=dat>>1;
 387   2              }
 388   1      }
 389          /*********************************************************************************
 390          函数描述:从ds1302读一字节数据
 391          入口参数:无
 392          出口参数:dat:读到的数据
 393          ***************************************************************************/
 394          uchar read_dat()
 395          {       
 396   1              uchar   i,dat;
 397   1              DATA = 1;
 398   1              for(i=0;i<7;i++)
 399   1              {
 400   2                      CLK = 0;
 401   2                      if(DATA == 1)
 402   2                              dat |=0x80;
 403   2                      else 
 404   2                              dat &=0x7F;
 405   2                      CLK = 1;
 406   2                      dat=dat>>1;
 407   2              }
 408   1              return (dat);
 409   1      }
 410          /**************************************************************************
 411          函数描述:往ds1302的某个地址写入数据 
 412          入口参数:addr:要写入的寄存器地址
 413          出口参数:dat:要写入的数据
 414          *****************************************************************************/
 415          void write_1302(uchar addr,uchar dat)
 416          {       
 417   1              CLK = 0;
 418   1              RESET = 1;
 419   1              write_dat(addr);
 420   1              write_dat(dat); 
 421   1              CLK = 0;
 422   1              RESET = 0;
 423   1      }
 424          /****************************************************************************
 425          函数描述:从ds1302的某个地址读出一字节数据
 426          入口参数:addr:所读的寄存器的地址
 427          出口参数:无
C51 COMPILER V7.06   1302                                                                  12/03/2007 08:44:24 PAGE 8   

 428          *****************************************************************************/
 429          uchar read_1302(uchar addr)
 430          {       
 431   1              uchar dat;
 432   1              CLK = 0;
 433   1              RESET = 1;
 434   1              write_dat(addr);
 435   1              dat = read_dat();       
 436   1              CLK = 0;
 437   1              RESET = 0;
 438   1              return (dat);
 439   1      }
 440          /****************************************************************************
 441          函数描述:从ds1302寄存器中读出时间值或数据
 442          入口参数:addr:所读寄存器起始地址
 443                            str:存放数据的起始地址
 444                            num:要读数据的个数
 445          出口参数:无
 446          *****************************************************************************/
 447          void read_time(uchar addr,uchar *str,uchar num)
 448          {       
 449   1              for(;num>0;num--)
 450   1              {
 451   2                      *str++ = read_1302(addr);
 452   2                      addr = addr+2;
 453   2              }
 454   1      } 
 455          /****************************************************************************
 456          函数描述:设置ds1302寄存器的值
 457          入口参数:addr:要设置的寄存器起始地址
 458                            str:存放所设数据的起始地址
 459                            num:要设置寄存器的个数
 460          出口参数:无
 461          *****************************************************************************/
 462          void set_1302(uchar addr,uchar *str,uchar num)
 463          {       
 464   1              write_1302(0x8e,0x00);
 465   1              for(;num>0;num--)
 466   1              {
 467   2                      write_1302(addr,*str++);
 468   2                      addr = addr+2;
 469   2              }
 470   1              write_1302(0x8e,0x80);
 471   1      } 
 472          void init_1302()
 473          {
 474   1              RESET = 0;
 475   1              CLK = 0;
 476   1              write_1302(0x80,0x00);
 477   1              write_1302(0x90,0xa6);                          //一个二极管+4K电阻充电
 478   1              set_1302(0x80,init,7);                          //写入初始值
 479   1              write_1302(0x8e,0x80);                          //写保护控制字,禁止写
 480   1      }
 481          /************************************************************************************
 482          函数描述:把从ds1302读出的数据转换为ascii码
 483          入口参数:instr: 指向要转换数据的指针
 484          出口参数: outstr: 指向转换后的数据的指针
 485          **************************************************************************************/         
 486          void change_time(uchar *instr,uchar *outstr)
 487          {       uchar i;
 488   1              uchar j;
 489   1              j = 0;
C51 COMPILER V7.06   1302                                                                  12/03/2007 08:44:24 PAGE 9   

 490   1              for(i=0;i<8;i++)
 491   1              {       outstr[j] = '0'+((instr[i]&0xf0)>>4);
 492   2                      j++;
 493   2                      outstr[j] = '0'+(instr[i]&0x0f);
 494   2                      j++;
 495   2              }
 496   1      }
 497          /*************************************************************************************
 498          函数描述:在lcd上显示日期,时间值
 499          入口参数:str:指向要显示值的指针
 500          出口参数:无
 501          ***************************************************************************************/
 502          void lcd_time(uchar *str)
 503          {       write_str3(1,1,str[12]) ;//年   
 504   1              write_str3(1,2,str[13]) ;
 505   1              write_str3(1,4,str[8])  ;//月
 506   1              write_str3(1,5,str[9])  ;
 507   1              write_str3(1,7,str[6])  ;//日
 508   1              write_str3(1,8,str[7])  ;
 509   1              write_str3(1,16,str[11]);//星期
 510   1              write_str3(2,7,str[4])  ;//时
 511   1              write_str3(2,8,str[5])  ;
 512   1              write_str3(2,10,str[2]) ;//分
 513   1              write_str3(2,11,str[3]) ;
 514   1              write_str3(2,13,str[0]) ;//秒
 515   1              write_str3(2,14,str[1]) ;
 516   1      }
 517          /*********************************************************************************************
 518          函数描述:在lcd的第2行地9,12列的位置交替显示':'和' ' ,以形成闪动效果
 519          入口参数:无
 520          出口参数:无
 521          ***********************************************************************************************/
 522          void flash()
 523          {       if(flag)

⌨️ 快捷键说明

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