shtxx_self.lst

来自「这是单片机驱动温湿度传感器SHT11温湿度传感器的源代码」· LST 代码 · 共 1,493 行 · 第 1/5 页

LST
1,493
字号
 570   1          lcd_wrd(0x30+a);
 571   1          dat =dat%10;
 572   1          lcd_wrd(0x30+dat);
 573   1              */
 574   1      }
 575          
 576          void lcd_dis_ch(uchar h,uchar l)
 577          {
 578   1          lcd_wrd(h);
 579   1          lcd_wrd(l);
 580   1      }
 581          
 582          void lcd_add(uchar h,uchar l)       //定位地址
 583          {
 584   1        l--;
 585   1        switch(h)
 586   1        {
 587   2          case 1:
 588   2          {
 589   3            lcd_wrc(0x80+l);
 590   3            break;
 591   3          }
 592   2          case 2:
 593   2          {
 594   3            lcd_wrc(0x90+l);
 595   3            break;
 596   3          }
 597   2          case 3:
 598   2          {
 599   3            lcd_wrc(0x88+l);
 600   3            break;
 601   3          }
 602   2          case 4:
 603   2          {
 604   3            lcd_wrc(0x98+l);
 605   3            break;
 606   3          }
 607   2        }
 608   1      }
 609          
 610          
 611          
C51 COMPILER V7.07   SHTXX_SELF                                                            06/14/2007 21:21:35 PAGE 11  

 612          unsigned char key_data()      //判断键值
 613          {
 614   1              uchar a=0,b=0,c=0,d=0,i=0;
 615   1              a = 0xef;
 616   1              for(i = 0;i<4;i++)      //读行
 617   1              {
 618   2                  P1 = a;
 619   2                      delay(10);
 620   2                  b = P1;
 621   2                      b = b&0x0f;
 622   2      //      b = b>>4;
 623   2                  if(b!=0x0F)   //表示有键按下
 624   2              {
 625   3                              delay(50);   //软件延时   确认有键按下
 626   3                              b = P1&0X0F;
 627   3      //              b = b>>4;
 628   3                      if(b != 0x0F)
 629   3                      {  
 630   4      //                      return b;
 631   4      
 632   4                                      c=b;
 633   4                              if(c==0X07)
 634   4                              {
 635   5                                      d=i*4+3;
 636   5                              }
 637   4                              else if(c==0X0B)
 638   4                              {
 639   5                                      d=i*4+2;
 640   5                              }
 641   4                              else if(c==0X0D)
 642   4                              {
 643   5                                      d=i*4+1;
 644   5                              }
 645   4                              else if(c==0X0E)
 646   4                              {
 647   5                                      d=i*4;
 648   5                              }
 649   4                                  break;
 650   4                              }
 651   3                      }
 652   2              else
 653   2                  {
 654   3                      a = a<<1;
 655   3                              a = a+0x01;
 656   3                      if(a==0xFF)
 657   3                      {
 658   4      //                      return 0x0f;
 659   4                                      d = 0x0f+1;
 660   4                                      break;
 661   4                      }
 662   3              }
 663   2              }
 664   1              return d;
 665   1      }
 666          
 667          
 668          
 669          void Start_I2c()                //起动总线函数
 670          {
 671   1              SDA=1;   //发送起始条件的数据信号
 672   1              _Nop();
 673   1              SCL=1;
C51 COMPILER V7.07   SHTXX_SELF                                                            06/14/2007 21:21:35 PAGE 12  

 674   1              _Nop();    //起始条件建立时间大于4.7us,延时
 675   1              _Nop();
 676   1              _Nop();
 677   1              _Nop();
 678   1              _Nop();    
 679   1              SDA=0;   //发送起始信号
 680   1              _Nop();    // 起始条件锁定时间大于4
 681   1              _Nop();
 682   1              _Nop();
 683   1              _Nop();
 684   1              _Nop();       
 685   1              SCL=0;   //钳住I2C总线,准备发送或接收数据 
 686   1              _Nop();
 687   1              _Nop();
 688   1      }
 689          
 690          void Stop_I2c()         //结束总线函数
 691          {
 692   1              SDA=0;  /*发送结束条件的数据信号*/
 693   1              _Nop();   /*发送结束条件的时钟信号*/
 694   1              SCL=1;  /*结束条件建立时间大于4*/
 695   1              _Nop();
 696   1              _Nop();
 697   1              _Nop();
 698   1              _Nop();
 699   1              _Nop();
 700   1              SDA=1;  /*发送I2C总线结束信号*/
 701   1              _Nop();
 702   1              _Nop();
 703   1              _Nop();
 704   1              _Nop();
 705   1      }
 706          
 707          
 708          
 709          void  SendByte(uchar c)         //字节数据传送函数send
 710          {
 711   1              uchar BitCnt;
 712   1              for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 713   1          {
 714   2              if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 715   2              else  SDA=0;                
 716   2              _Nop();
 717   2              SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
 718   2              _Nop(); 
 719   2              _Nop();               /*保证时钟高电平周期大于4*/
 720   2              _Nop();
 721   2              _Nop();
 722   2              _Nop();  
 723   2              SCL=0; 
 724   2          }
 725   1          _Nop();
 726   1          _Nop();
 727   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
 728   1          _Nop();
 729   1          _Nop();   
 730   1          SCL=1;
 731   1          _Nop();
 732   1          _Nop();
 733   1          _Nop();
 734   1          if(SDA==1)ack=0;     
 735   1          else ack=1;        /*判断是否接收到应答信号*/
C51 COMPILER V7.07   SHTXX_SELF                                                            06/14/2007 21:21:35 PAGE 13  

 736   1          SCL=0;
 737   1          _Nop();
 738   1          _Nop();
 739   1      }
 740          
 741          
 742          uchar  RcvByte()                //字节数据传送函数 receive
 743          {
 744   1              uchar retc;
 745   1              uchar BitCnt;
 746   1          retc=0; 
 747   1              SDA=1;             /*置数据线为输入方式*/
 748   1              for(BitCnt=0;BitCnt<8;BitCnt++)
 749   1          {
 750   2              _Nop();           
 751   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
 752   2              _Nop();
 753   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 754   2              _Nop();
 755   2              _Nop();
 756   2              _Nop();
 757   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
 758   2              _Nop();
 759   2              _Nop();
 760   2              retc=retc<<1;
 761   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 762   2              _Nop();
 763   2              _Nop(); 
 764   2              }
 765   1              SCL=0;    
 766   1              _Nop();
 767   1              _Nop();
 768   1              return(retc);
 769   1      }
 770          
 771          
 772          void Ack_I2c(bit a)             //主控器进行应答信号
 773          {
 774   1        
 775   1              if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 776   1          else SDA=1;
 777   1              _Nop();
 778   1              _Nop();
 779   1              _Nop();      
 780   1              SCL=1;
 781   1          _Nop();
 782   1          _Nop();              //时钟低电平周期大于4μ
 783   1          _Nop();
 784   1          _Nop();
 785   1          _Nop();  
 786   1              SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 787   1          _Nop();
 788   1          _Nop();    
 789   1      }
 790          //bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)          //向有子地址器件发送多字节数据函数 
 791          //子地址为8位的数据传送
 792          bit ISendStr_8(uchar add,uchar son_add,uchar dat)               //向子地址为8位的器件发送多字节数据函数 
 793          {
 794   1              Start_I2c();               /*启动总线*/
 795   1              SendByte(add);            /*发送器件地址*/
 796   1          if(ack==0)return(0);
 797   1              SendByte(son_add);            /*发送器件子地址*/
C51 COMPILER V7.07   SHTXX_SELF                                                            06/14/2007 21:21:35 PAGE 14  

 798   1          if(ack==0)return(0);
 799   1          SendByte(dat);               /*发送数据*/
 800   1          if(ack==0)return(0);
 801   1              Stop_I2c();                 /*结束总线*/ 
 802   1              return(1);
 803   1      }
 804          //子地址为16位的数据传送
 805          bit ISendStr_16(uchar add,uint son_add,uchar dat)               //向子地址为16位的器件发送多字节数据函数 
 806          {
 807   1              Start_I2c();               /*启动总线*/
 808   1              SendByte(add);            /*发送器件地址*/
 809   1          if(ack==0)return(0);
 810   1              SendByte(son_add/256);            /*发送器件子地址*/
 811   1          if(ack==0)return(0);
 812   1              SendByte(son_add%256);            /*发送器件子地址*/
 813   1          if(ack==0)return(0);
 814   1          SendByte(dat);               /*发送数据*/
 815   1          if(ack==0)return(0);
 816   1              Stop_I2c();                 /*结束总线*/ 
 817   1              return(1);
 818   1      }
 819          
 820          
 821          
 822          //bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)           //向有子地址器件读取多字节数据函数
 823          //子地址为8位的数据传送
 824          uchar IRcvStr_8(uchar add,uchar son_add)                //向子地址为8位的器件读取多字节数据函数
 825          {
 826   1      
 827   1              uchar i;
 828   1              Start_I2c();               /*启动总线*/
 829   1              SendByte(add);            /*发送器件地址*/
 830   1              SendByte(son_add);            /*发送器件子地址2*/
 831   1              Start_I2c();
 832   1              SendByte(add+0x01);
 833   1              i=RcvByte();
 834   1              Ack_I2c(1);                 /*发送非应位*/
 835   1              Stop_I2c();                    /*结束总线*/ 
 836   1              return (i);
 837   1      }
 838          //子地址为16位的数据传送
 839          uchar IRcvStr_16(uchar add,uint son_add)                //向子地址为16位的器件读取多字节数据函数
 840          {
 841   1      
 842   1              uchar i;
 843   1              Start_I2c();               /*启动总线*/
 844   1              SendByte(add);            /*发送器件地址*/
 845   1              SendByte(son_add/256);            /*发送器件子地址1*/
 846   1              SendByte(son_add%256);            /*发送器件子地址2*/
 847   1              Start_I2c();
 848   1              SendByte(add+0x01);
 849   1              i=RcvByte();
 850   1              Ack_I2c(1);                 /*发送非应位*/
 851   1              Stop_I2c();                    /*结束总线*/ 
 852   1              return (i);
 853   1      }
 854          
 855          //----------------------------------------------------------------------------------
 856          char s_write_byte(unsigned char value)
 857          //----------------------------------------------------------------------------------
 858          // writes a byte on the Sensibus and checks the acknowledge 
 859          { 
C51 COMPILER V7.07   SHTXX_SELF                                                            06/14/2007 21:21:35 PAGE 15  

⌨️ 快捷键说明

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