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

📄 lcd12864.lst

📁 12864液晶显示多功能电子时钟
💻 LST
📖 第 1 页 / 共 3 页
字号:
 298   1              unsigned int value;
 299   1              float t;
 300   1              reset();
 301   1              write_byte(jump_ROM);
 302   1              write_byte(start);
 303   1              reset();
C51 COMPILER V7.09   LCD12864                                                              11/27/2008 20:04:08 PAGE 6   

 304   1              write_byte(jump_ROM);
 305   1              write_byte(read_EEPROM);
 306   1              TMPL=read_byte();
 307   1              TMPH=read_byte();
 308   1              value=TMPH;
 309   1              value<<=8;
 310   1              value|=TMPL;
 311   1              t=value*0.0625;
 312   1              TMPH=t;
 313   1              TMPL=(t-TMPH)*10+0.5;
 314   1      }
 315          
 316          sbit clock_Rst = P3 ^ 3;
 317          sbit clock_dat = P3 ^ 4;
 318          sbit clock_clk = P3 ^ 5;
 319          unsigned char  sec=0xff,min=0xff,hour=0xff,day=0xff,mon=0xff,week=0xff,year=0xff;
 320          
 321          void clock_out(unsigned char dd);
 322          void write_clock(unsigned char ord,unsigned char dd);
 323          void init_1302(void);
 324          unsigned char clock_in(void);
 325          unsigned char read_clock(unsigned char ord);
 326          void update(void);
 327          void LCD_Week(void);
 328          /*===============================================================================/
 329           *函数名称:clock_out
 330           *入口参数:dd
 331           *函数功能:写入指令或数据
 332          /===============================================================================*/
 333          void clock_out(unsigned char dd)
 334          {
 335   1      
 336   1              unsigned char i,temp;
 337   1              temp=dd;
 338   1              for(i=8;i>0;i--)
 339   1              {
 340   2                      
 341   2                       if((temp&0x01)==1)
 342   2                       clock_dat=1;
 343   2                       else clock_dat=0;
 344   2                       _nop_();
 345   2                       clock_clk=1;
 346   2                       _nop_();
 347   2                       clock_clk=0;
 348   2                       temp=temp>>1;
 349   2               }
 350   1              
 351   1          
 352   1      }
 353          /*===============================================================================/
 354           *函数名称:write_clock
 355           *入口参数:命令ord,数据dd
 356           *函数功能:时钟调整
 357          /================================================================================*/
 358          void write_clock(unsigned char ord,unsigned char dd)
 359          {
 360   1              unsigned char temp;
 361   1              clock_Rst=0;
 362   1              do{temp=clock_Rst;}while(temp==1);
 363   1              clock_clk=0;
 364   1              clock_Rst=1;
 365   1              do{temp=clock_Rst;}while(temp==0);
C51 COMPILER V7.09   LCD12864                                                              11/27/2008 20:04:08 PAGE 7   

 366   1              clock_out(ord);
 367   1              clock_out(dd);
 368   1          clock_clk=1;
 369   1              clock_Rst=0;
 370   1              
 371   1      }
 372          
 373          /*==============================================================================/
 374           *函数名称:init_1302
 375           *函数功能:ds1302初始化
 376          /=============================================================================*/
 377          void init_1302(void)
 378          {
 379   1              write_clock(0x8e,0x00);
 380   1      //      write_clock(0x80,0x80);
 381   1              write_clock(0x90,0x00);
 382   1              write_clock(0x8c,0x08);//_nop_();
 383   1              write_clock(0x8a,0x02);//_nop_();
 384   1              write_clock(0x88,0x11);//_nop_();
 385   1              write_clock(0x86,0x01);//_nop_();
 386   1              write_clock(0x84,0x18);//_nop_();
 387   1              write_clock(0x82,0x00);//_nop_();
 388   1              write_clock(0x80,0x00);//_nop_();
 389   1      //      write_clock(0x90,0xa5);//_nop_();
 390   1              write_clock(0x8e,0x80);
 391   1      }
 392          /*=================================================================================/
 393           *函数名称:clock_in
 394           *返回  值:ACC
 395           *函数功能:输出数据
 396          /=================================================================================*/
 397          unsigned char clock_in(void)
 398          {
 399   1      
 400   1              unsigned char i,temp;
 401   1              temp=0x00;
 402   1              for(i=8;i>0;i--)
 403   1              {
 404   2                      temp=temp>>1;
 405   2                      if(clock_dat==1) temp|=0x80;
 406   2                      clock_clk=1;
 407   2                      clock_clk=0;    
 408   2          }
 409   1      //      if(clock_dat==1) temp|=0x80;
 410   1              return(temp);
 411   1      }
 412          /*****************************************************************************/
 413          //DS1302读数据(底层协议)
 414          unsigned char read_clock(unsigned char ord){
 415   1              unsigned char dd,k;
 416   1              k=0x00;
 417   1              clock_Rst=0;
 418   1              do {dd=clock_Rst;} while(dd==1);
 419   1              clock_clk=0;    
 420   1              clock_Rst=1;
 421   1              do {dd=clock_Rst;} while(dd==0);
 422   1              clock_out(ord);
 423   1              dd=clock_in();
 424   1              clock_clk=1;
 425   1              clock_Rst=0;
 426   1              k=dd>>4;
 427   1              dd=dd&0x0f;
C51 COMPILER V7.09   LCD12864                                                              11/27/2008 20:04:08 PAGE 8   

 428   1              dd=dd+k*10;
 429   1              return (dd);
 430   1      }
 431          
 432           void read_clocks(void)
 433          {
 434   1              sec=read_clock(0x81);
 435   1              min=read_clock(0x83);
 436   1              hour=read_clock(0x85);
 437   1              day=read_clock(0x87);
 438   1              mon=read_clock(0x89);
 439   1              week=read_clock(0x8b);
 440   1              year=read_clock(0x8d);  
 441   1      }
 442          
 443           void write_clocks(void)
 444           {
 445   1              write_clock(0x8e,0x00);
 446   1      //      write_clock(0x80,0x80);
 447   1              write_clock(0x90,0x00);
 448   1              write_clock(0x8c,year);//_nop_();
 449   1              write_clock(0x8a,week);//_nop_();
 450   1              write_clock(0x88,mon);//_nop_();
 451   1              write_clock(0x86,day);//_nop_();
 452   1              write_clock(0x84,hour);//_nop_();
 453   1              write_clock(0x82,min);//_nop_();
 454   1              write_clock(0x80,sec);
 455   1      //      write_clock(0x90,0xa5);//_nop_();
 456   1              write_clock(0x8e,0x80);
 457   1      }
 458                  
 459          
 460          
 461          /*按键控制程序段*/
 462          sbit KeyHL =P1^3;  //左上
 463          sbit KeyBL =P1^4;   //左下
 464          sbit KeyBR =P1^5;  //右下
 465          sbit KeyHR =P1^6;   //右上
 466          sbit KeyGas = P1^7; //煤气报警控制
 467          unsigned char adjust=1,add_or_dec, type=0x01 ;
 468          void update(void);
 469          
 470          
 471          unsigned char  BCD_Coverter(unsigned char dd)
 472          {
 473   1              unsigned char temp;
 474   1              temp=dd;
 475   1              temp=temp/10;
 476   1              dd=(dd%10)|(temp<<4);
 477   1              return dd;
 478   1      }
 479          void adjust_year(void)
 480          {
 481   1              if(year>=0&&year<=99&&add_or_dec==1) year++;
 482   1              if(year==100&&add_or_dec==1) year=0;
 483   1              if(year==0x00&&add_or_dec==0) year=100;
 484   1              if(year>0x00&&year<=100&&add_or_dec==0) year--;
 485   1              
 486   1              LCD_WriteData(5,1,year/10+0x30);
 487   1              LCD_data(year%10+0x30);
 488   1      
 489   1      }
C51 COMPILER V7.09   LCD12864                                                              11/27/2008 20:04:08 PAGE 9   

 490          void adjust_mon(void)
 491          {
 492   1              
 493   1              if(mon>=1&&mon<=12&&add_or_dec==1) mon++;
 494   1              if(mon==13&&add_or_dec==1) mon=1;
 495   1              if(mon>=1&&mon<=12&&add_or_dec==0) mon--;
 496   1              if(mon==0&&add_or_dec==0) mon=12;
 497   1              LCD_WriteData(5,2,mon/10+0x30);
 498   1              LCD_data(mon%10+0x30);
 499   1      
 500   1      }
 501          void adjust_day(void)
 502          {
 503   1              unsigned char day_max;
 504   1              
 505   1              if(mon==2)
 506   1              {
 507   2              if(year%4==0)
 508   2              {
 509   3                      if(year%100!=0) day_max=29;
 510   3                      else if(year%400==0)day_max=29;
 511   3                      else day_max=28;
 512   3              }
 513   2              else day_max=28;
 514   2              }
 515   1              else if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12) day_max=31;
 516   1          else day_max=30;
 517   1              if(day>=1&&day<=day_max&&add_or_dec==1) day++;
 518   1              if(day==(day_max+1)&&add_or_dec==1) day=1;
 519   1              if(day>=1&&day<=day_max&&add_or_dec==0) day--;
 520   1              if(day==0&&add_or_dec==0) day=day_max;
 521   1              LCD_WriteData(7,2,day/10+0x30);
 522   1              LCD_data(day%10+0x30);  
 523   1      
 524   1      }
 525          
 526          void adjust_hour(void)
 527          {
 528   1              
 529   1              if(hour>=0&&hour<=23&&add_or_dec==1) hour++;
 530   1              if(hour==24&&add_or_dec==1) hour=0;
 531   1              if(hour==0&&add_or_dec==0) hour=24;
 532   1              if(hour>0&&hour<=24&&add_or_dec==0) hour--;
 533   1              LCD_WriteData(1,3,hour/10+0x30);
 534   1              LCD_data(hour%10+0x30);
 535   1              
 536   1      
 537   1      }
 538          void adjust_min(void)
 539          {       
 540   1              if(min>=0&&min<=59&&add_or_dec==1) min++;
 541   1              if(min==60&&add_or_dec==1) min=0;
 542   1              if(min==0&&add_or_dec==0) min=60;
 543   1              if(min>0&&min<=60&&add_or_dec==0) min--;
 544   1      
 545   1              LCD_WriteData(2,3,0x3a);
 546   1              LCD_data(min/10+0x30);
 547   1              LCD_data(min%10+0x30);
 548   1      
 549   1      }
 550          void adjust_week(void)
 551          {
C51 COMPILER V7.09   LCD12864                                                              11/27/2008 20:04:08 PAGE 10  

 552   1              
 553   1              if(week>=1&&week<=7&&add_or_dec==1) week++;
 554   1              if(week==8&add_or_dec==1) week=1;
 555   1              if(week>=1&&week<=7&&add_or_dec==0) week--;
 556   1              if(week==0&&add_or_dec==0) week=7;
 557   1              LCD_Week();
 558   1      }
 559          void adjust_time(void)
 560          {
 561   1      
 562   1              LCD_WriteStr(1,1,"[Esc]");
 563   1              LCD_WriteStr(6,1,"[NEXT]");
 564   1              LCD_WriteStr(1,4,"[+] 调整年份 [-]");
 565   1              while(KeyHL==0);
 566   1              delay(1000);
 567   1              while(adjust==1)
 568   1              {
 569   2      
 570   2              if(KeyHL==0)
 571   2              {
 572   3                      delay(1000);
 573   3                      if(KeyHL==0)adjust=0;
 574   3              }
 575   2      
 576   2      
 577   2              if(KeyBL==0)
 578   2              {
 579   3                      delay(1000);
 580   3                      add_or_dec=1;  //加操作
 581   3                      switch(type)
 582   3                      {
 583   4                              case 1: adjust_year();break;
 584   4                              case 2: adjust_mon(); break;
 585   4                              case 3: adjust_day(); break;
 586   4                              case 4: adjust_hour(); break;
 587   4                              case 5: adjust_min(); break;
 588   4                              case 6: adjust_week(); break;
 589   4                              default:break;
 590   4                      }
 591   3              //      update();
 592   3                      while(KeyBL==0);        
 593   3                      delay(1000);             
 594   3              }
 595   2              
 596   2      
 597   2              if(KeyBR==0)
 598   2              {
 599   3                      delay(1000);
 600   3                      add_or_dec=0;    //减操 作
 601   3                      switch(type)

⌨️ 快捷键说明

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