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

📄 lcd1602.lst

📁 基于51单片机的万年历
💻 LST
📖 第 1 页 / 共 3 页
字号:
 406   5                              write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据
 407   5                              temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
 408   5                              write_1302(0x8e,0x00);//允许写,禁止写保护
 409   5                              write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
 410   5                              write_1302(0x8e,0x80);//打开写保护
 411   5                              write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 412   5                              break;
 413   5              case 7:nian++;
 414   5                       if(nian==100)
 415   5                              nian=0;
 416   5                              write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据
 417   5                  temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
 418   5                              write_1302(0x8e,0x00);//允许写,禁止写保护
 419   5                              write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
 420   5                              write_1302(0x8e,0x80);//打开写保护
 421   5                              write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 422   5                              break;
 423   5                              
 424   5      
 425   5              }
 426   4      
 427   4              }
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 8   

 428   3      
 429   3              }
 430   2              //------------------减键key3,各句功能参照'加键'注释---------------
 431   2              if(key3==0)
 432   2              {
 433   3              delay(10);//调延时,消抖动
 434   3              if(key3==0)
 435   3              {
 436   4          buzzer=0;//蜂鸣器短响一次
 437   4          delay(20);
 438   4          buzzer=1;
 439   4              while(!key3);
 440   4              switch(key1n)
 441   4              {
 442   5                      case 1:miao--;
 443   5                                      if(miao==-1)
 444   5                                              miao=59;//秒数据减到-1时自动变成59
 445   5                              write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数
 446   5                  temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
 447   5                              write_1302(0x8e,0x00); //允许写,禁止写保护 
 448   5                              write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
 449   5                              write_1302(0x8e,0x80); //打开写保护
 450   5                              write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
 451   5                              //write_1602com(0x0b);
 452   5                              break;
 453   5                      case 2:fen--;
 454   5                                      if(fen==-1)
 455   5                                              fen=59;
 456   5                              write_sfm(5,fen);
 457   5                              temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
 458   5                              write_1302(0x8e,0x00);//允许写,禁止写保护 
 459   5                              write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
 460   5                              write_1302(0x8e,0x80);//打开写保护
 461   5                              write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
 462   5                              break;
 463   5      
 464   5                      case 3:shi--;
 465   5                                 if(shi==-1)
 466   5                                              shi=23;
 467   5                              write_sfm(2,shi);
 468   5                              temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
 469   5                              write_1302(0x8e,0x00);//允许写,禁止写保护 
 470   5                              write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
 471   5                              write_1302(0x8e,0x80);//打开写保护
 472   5                              write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 473   5                              break;
 474   5                      case 4:week--;
 475   5                                      if(week==0)
 476   5                                              week=7;
 477   5                               
 478   5                  write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
 479   5                                      write_week(week);//指定周数据显示内容
 480   5                                 temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
 481   5                              write_1302(0x8e,0x00);//允许写,禁止写保护 
 482   5                              write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
 483   5                              write_1302(0x8e,0x80);//打开写保护
 484   5                                 write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 485   5                              break;
 486   5                      case 5:ri--;
 487   5                                      if(ri==0)
 488   5                                              ri=31;
 489   5                              write_nyr(9,ri);
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 9   

 490   5                              temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
 491   5                              write_1302(0x8e,0x00);//允许写,禁止写保护
 492   5                              write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
 493   5                              write_1302(0x8e,0x80);//打开写保护
 494   5                              write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 495   5                              break;
 496   5                      case 6:yue--;
 497   5                                      if(yue==0)
 498   5                                              yue=12;
 499   5                              write_nyr(6,yue);
 500   5                              temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
 501   5                              write_1302(0x8e,0x00);//允许写,禁止写保护
 502   5                              write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
 503   5                              write_1302(0x8e,0x80);//打开写保护
 504   5                              write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 505   5                              break;  
 506   5                      case 7:nian--;
 507   5                       if(nian==-1)
 508   5                              nian=99;
 509   5                              write_nyr(3,nian);
 510   5               temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
 511   5                              write_1302(0x8e,0x00);//允许写,禁止写保护
 512   5                              write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
 513   5                              write_1302(0x8e,0x80);//打开写保护
 514   5                              write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 515   5                              break;
 516   5                              
 517   5                                      
 518   5              }
 519   4      
 520   4              }
 521   3      
 522   3              }
 523   2      
 524   2              }
 525   1      
 526   1      
 527   1      }
 528          
 529          //-------------------------------
 530          void init() //定时器、计数器设置函数
 531          {
 532   1              TMOD=0x11; //指定定时/计数器的工作方式为3
 533   1              TH0=0;  //定时器T0的高四位=0
 534   1              TL0=0;  //定时器T0的低四位=0
 535   1              EA=1;  //系统允许有开放的中断
 536   1              ET0=1; //允许T0中断
 537   1              TR0=1; //开启中断,启动定时器
 538   1      
 539   1      }
 540          
 541          
 542          
 543          //*******************主函数**************************
 544          //***************************************************
 545          void main()
 546          {
 547   1              lcd_init();      //调用液晶屏初始化子函数
 548   1              ds1302_init();   //调用DS1302时钟的初始化子函数
 549   1              init();          //调用定时计数器的设置子函数
 550   1              led=0;           //打开LCD的背光电源
 551   1          buzzer=0;//蜂鸣器长响一次
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 10  

 552   1          delay(80);
 553   1          buzzer=1;
 554   1              while(1)  //无限循环下面的语句:
 555   1              {
 556   2                              
 557   2          keyscan();      //调用键盘扫描子函数
 558   2              
 559   2          }
 560   1      }
 561          
 562          
 563          void timer0() interrupt 1  //取得并显示日历和时间
 564          {
 565   1              
 566   1         //Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
 567   1         flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示
 568   1      
 569   1        //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
 570   1      
 571   1      
 572   1         miao = BCD_Decimal(read_1302(0x81));
 573   1              fen = BCD_Decimal(read_1302(0x83));
 574   1              shi  = BCD_Decimal(read_1302(0x85));
 575   1              ri  = BCD_Decimal(read_1302(0x87));
 576   1              yue = BCD_Decimal(read_1302(0x89));
 577   1              nian=BCD_Decimal(read_1302(0x8d));
 578   1              week=BCD_Decimal(read_1302(0x8b));
 579   1      
 580   1              //显示温度、秒、时、分数据:
 581   1         
 582   1         write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
 583   1         write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
 584   1              write_sfm(5,fen);//分,从第二行第5个字符后开始显示
 585   1              write_sfm(2,shi);//小时,从第二行第2个字符后开始显示
 586   1              
 587   1              //显示日、月、年数据:
 588   1              write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
 589   1         write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
 590   1              write_nyr(3,nian);//年,从第二行第3个字符后开始显示
 591   1              write_week(week);
 592   1      
 593   1      }
 594          
 595          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1957    ----
   CONSTANT SIZE    =     21    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11      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 + -