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

📄 xiyiji.lst

📁 使用KEIL PROTEUS等软件,实现键盘扫描和LED灯的显示
💻 LST
📖 第 1 页 / 共 3 页
字号:
 486          {   P2=P3=0;
 487   1              dingshi();
 488   1              while(~pkey())
 489   1              {
C51 COMPILER V7.07   XIYIJI                                                                09/11/2005 16:35:01 PAGE 9   

 490   2               if(sflagg)P2_7=1;
 491   2               else P2_7=0;
 492   2               pkey();
 493   2           if(flag)TR1=0;
 494   2               }
 495   1               while(1)
 496   1               { getkey();
 497   2                      if((biao==3)||(biao==4)||(biao==5))disp();
 498   2                      if(biao==6)display();
 499   2                }
 500   1      }
 501          //LCD显示***************************************************************************
 502          unsigned char LCD_Wait(void)
 503          {
 504   1              LcdRs=0;
 505   1              LcdRw=1;        //_nop_();
 506   1              LcdEn=1;        //_nop_();
 507   1          LcdEn=0;
 508   1              return DBPort;          
 509   1      }
 510          //向LCD写入命令或数据************************************************************
 511          void LCD_Write(bit style, unsigned char input)
 512          {
 513   1              LcdEn=0;
 514   1              LcdRs=style;
 515   1              LcdRw=0;                //_nop_();
 516   1              DBPort=input;   //_nop_();//注意顺序
 517   1              LcdEn=1;                //_nop_();//注意顺序
 518   1              LcdEn=0;                //_nop_();
 519   1              LCD_Wait();     
 520   1      }
 521          //初始化LCD*****************************************************************
 522          void LCD_Initial()            
 523          {
 524   1              LcdEn=0;
 525   1              LCD_Write(LCD_COMMAND,0x38);    //8位数据端口,2行显示,5*7点阵
 526   1              LCD_Write(LCD_COMMAND,0x38);
 527   1              LCD_Write(LCD_COMMAND,0x0c);   //开启显示, 无光标
 528   1              LCD_Write(LCD_COMMAND,0x01);   //清屏
 529   1              LCD_Write(LCD_COMMAND,0x06);   //AC递增, 画面不动
 530   1      }
 531          void GotoXY(unsigned char x, unsigned char y)
 532          {
 533   1              if(y==0)
 534   1                      LCD_Write(LCD_COMMAND,0x80|x);
 535   1              if(y==1)
 536   1                      LCD_Write(LCD_COMMAND,0x80|(x-0x40));
 537   1      }
 538          void Print(unsigned char *str)
 539          {
 540   1              while(*str!='\0')
 541   1              {
 542   2                      LCD_Write(LCD_DATA,*str);
 543   2                      str++;
 544   2              }
 545   1      }
 546          unsigned char TempBuffer[10];
 547          void IntToStr( unsigned char *str) 
 548          {
 549   1              unsigned char a[5]; char i; 
 550   1          a[0]=minite/10 ;        //取得整数值到数组          
 551   1              a[1]=minite%10  ;                                       
C51 COMPILER V7.07   XIYIJI                                                                09/11/2005 16:35:01 PAGE 10  

 552   1              a[2]=':' ;                                              
 553   1              a[3]=second/10;                                         
 554   1              a[4]=second%10;                                         
 555   1          for(i=0; i<5; i++)         //转成ASCII码                    
 556   1              {if (i!=2)      a[i]=a[i]+'0'; }                                        
 557   1          for(i=0; i<5; i++)                                          
 558   1              { *str=a[i]; str++; }  //加入有效的数字                 
 559   1              *str='\0'; 
 560   1      } 
 561          unsigned char  tep[10];
 562          void charToStr( unsigned char *str) 
 563          {
 564   1              unsigned char a[5]; char i, t; 
 565   1              t= ReadTemperature() ;
 566   1              a[0]=' ';        //取得整数值到数组             
 567   1              a[1]=(t%100)/10;                                        
 568   1              a[2]=(t%100)%10;                                        
 569   1              a[3]=0xdf;                                              
 570   1              a[4]='c';                                               
 571   1              for(i=1; i<3; i++)         //转成ASCII码                
 572   1              a[i]=a[i]+'0';                                          
 573   1              for(i=0; i<5; i++)                                              
 574   1              { *str=a[i]; str++; }  //加入有效的数字                 
 575   1              *str='\0'; 
 576   1      }
 577          unsigned char  wdsz[10];
 578          void wdszStr( unsigned char *str) 
 579          {
 580   1              unsigned char a[5]; char i;
 581   1              a[0]=' ';        //取得整数值到数组             
 582   1              a[1]=(wdz%100)/10;                                      
 583   1              a[2]=(wdz%100)%10;                                              
 584   1              a[3]=0xdf;                                              
 585   1              a[4]='c';                                               
 586   1              for(i=1; i<3; i++)         //转成ASCII码                
 587   1              a[i]=a[i]+'0';                                          
 588   1              for(i=0; i<5; i++)                                              
 589   1              { *str=a[i]; str++; }  //加入有效的数字                 
 590   1              *str='\0';
 591   1      }
 592          //显示当前温度温度和要达到的的温度********************************
 593          void display(void)
 594          {
 595   1          wdszStr(&wdsz[0]);
 596   1              GotoXY(8,1);
 597   1              Print(&wdsz[0]);
 598   1              Delay1ms(100);
 599   1          charToStr(&tep[0]);
 600   1              GotoXY(8,0);
 601   1              Print(&tep[0]);
 602   1              Delay1ms(100);
 603   1      }
 604          //只有时间的显示****************************************************
 605          void disp(void) 
 606          {
 607   1          IntToStr(&TempBuffer[0]);
 608   1              GotoXY(8,1);
 609   1              Print(&TempBuffer[0]);
 610   1              Delay1ms(100);
 611   1      }
 612          //定时器0的使用 实现倒计时 和慢洗衣服时 PWM 比值******************************
 613          void daojishi(void) 
C51 COMPILER V7.07   XIYIJI                                                                09/11/2005 16:35:01 PAGE 11  

 614          { 
 615   1              TMOD=0x02; 
 616   1              TH0=0x06; 
 617   1              TL0=0x06; 
 618   1              TR0=1; 
 619   1              ET0=1; 
 620   1              EA=1; 
 621   1      } 
 622          void t0(void) interrupt 1 using 0 
 623          { 
 624   1              unsigned int tcnt,pwm; 
 625   1              tcnt++; 
 626   1              if(tcnt==4000) 
 627   1              {
 628   2            pwm++;
 629   2                if(pwm==3)sflag=1;
 630   2                if(pwm==9) {sflag=0;pwm=0;}
 631   2                tcnt=0; 
 632   2                second--; 
 633   2                if(second==0) 
 634   2                 { 
 635   3                  second=59; 
 636   3                  minite--; 
 637   3               if(minite<=0) 
 638   3                 { 
 639   4                  minite=0; 
 640   4                 } 
 641   3                } 
 642   2              }
 643   1      }
 644          //DS18B20读取温度的全部函数如下***************************************************
 645          Init_DS18B20(void)//初始化函数
 646          {
 647   1       unsigned char x=0;
 648   1       DQ = 1;    //DQ复位
 649   1       delay(8);  //稍做延时
 650   1       DQ = 0;    //单片机将DQ拉低
 651   1       delay(80); //精确延时 大于 480us
 652   1       DQ = 1;    //拉高总线
 653   1       delay(14);
 654   1       x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 655   1       delay(20);
 656   1      }
 657          //读一个字节**********************************************************
 658          ReadOneChar(void)
 659          {
 660   1      unsigned char i=0,dat = 0;
 661   1      for (i=8;i>0;i--)
 662   1       {
 663   2              DQ = 0; // 给脉冲信号
 664   2              dat>>=1;
 665   2              DQ = 1; // 给脉冲信号
 666   2              if(DQ)
 667   2              dat|=0x80;
 668   2              delay(4);
 669   2       }
 670   1       return(dat);
 671   1      }
 672          //写入一个字节***********************************************************
 673          WriteOneChar(unsigned char dat)
 674          {
 675   1       unsigned char i=0;
C51 COMPILER V7.07   XIYIJI                                                                09/11/2005 16:35:01 PAGE 12  

 676   1       for (i=8; i>0; i--)
 677   1       {
 678   2        DQ = 0;
 679   2        DQ = dat&0x01;
 680   2        delay(5);
 681   2        DQ = 1;
 682   2        dat>>=1;
 683   2       }
 684   1      }
 685          //读温度值*****************************************************************
 686          unsigned int ReadTemperature(void)//读取温度
 687          {
 688   1              unsigned char a=0;
 689   1              unsigned char b=0;
 690   1              unsigned int t=0;
 691   1              Init_DS18B20();//初始化
 692   1              WriteOneChar(0xCC); // 跳过读序号列号的操作
 693   1              WriteOneChar(0x44); // 启动温度转换
 694   1              Init_DS18B20();//初始化
 695   1              WriteOneChar(0xCC); //跳过读序号列号的操作
 696   1              WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 697   1              a=ReadOneChar();//读取低字节
 698   1              b=ReadOneChar();//读取高字节
 699   1           if((b& 0xf8)!=0x00) //如果是负数 则取反加一
 700   1              { 
 701   2                b=~b; 
 702   2                a=~a; 
 703   2                a=a+1; 
 704   2                if(a>255) 
 705   2                b++; 
 706   2               } 
 707   1              b=b<<4;// 高字节的低4位与低字节的高4位 组合为温度值
 708   1              b=b & 0x70; 
 709   1              a=a>>4; 
 710   1              a=a & 0x0f; 
 711   1              t=a | b; 
 712   1              return(t);
 713   1      }
 714          //**************************************************************************
 715          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2483    ----
   CONSTANT SIZE    =    367    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     39      37
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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