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

📄 sta013.lst

📁 用LPC932控制sta013解码芯片
💻 LST
📖 第 1 页 / 共 4 页
字号:
 473   1        _Nop();
 474   1        SDA=0;        /*发送起始信号*/
 475   1        _Nop();       /* 起始条件锁定时间大于4μs*/
 476   1        _Nop();
 477   1        _Nop();
 478   1        _Nop();
 479   1        _Nop();
 480   1        SCL=0;        /*钳住I2C总线,准备发送或接收数据 */
 481   1        _Nop();
 482   1        _Nop();
 483   1      }
 484          
 485          /*******************************************************************
 486                                 结束总线函数               
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 9   

 487          函数原型: void  Stop_I2c();  
 488          功能:     结束I2C总线,即发送I2C结束条件.  
 489          ********************************************************************/
 490          void Stop_I2c()
 491          {
 492   1        SDA=0;        /*发送结束条件的数据信号*/
 493   1        _Nop();       /*发送结束条件的时钟信号*/
 494   1        SCL=1;        /*结束条件建立时间大于4μs*/
 495   1        _Nop();
 496   1        _Nop();
 497   1        _Nop();
 498   1        _Nop();
 499   1        _Nop();
 500   1      
 501   1        SDA=1;        /*发送I2C总线结束信号*/
 502   1        _Nop();
 503   1        _Nop();
 504   1        _Nop();
 505   1        _Nop();
 506   1      }
 507          
 508          /*******************************************************************
 509                           字节数据发送函数               
 510          函数原型: void  SendByte(uchar c);
 511          功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 512                    此状态位进行操作.(不应答或非应答都使ack=0)     
 513                    发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 514          ********************************************************************/
 515          void  SendByte(uchar c)
 516          {
 517   1       uchar BitCnt;
 518   1       
 519   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 520   1          {
 521   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 522   2             else  SDA=0;                
 523   2           _Nop();
 524   2           SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
 525   2            _Nop(); 
 526   2            _Nop();             /*保证时钟高电平周期大于4μs*/
 527   2            _Nop();
 528   2            _Nop();
 529   2            _Nop();         
 530   2           SCL=0; 
 531   2          }
 532   1          
 533   1          _Nop();
 534   1          _Nop();
 535   1          SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
 536   1          _Nop();
 537   1          _Nop();   
 538   1          SCL=1;
 539   1          _Nop();
 540   1          _Nop();
 541   1          _Nop();
 542   1          if(SDA==1)ack=0;     
 543   1             else ack=1;        /*判断是否接收到应答信号*/
 544   1          SCL=0;
 545   1          _Nop();
 546   1          _Nop();
 547   1      }
 548          
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 10  

 549          /*******************************************************************
 550                           字节数据接收函数               
 551          函数原型: uchar  RcvByte();
 552          功能:     用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 553                    发完后请用应答函数应答从机。  
 554          ********************************************************************/   
 555          uchar  RcvByte()
 556          {
 557   1        uchar retc;
 558   1        uchar BitCnt;
 559   1        
 560   1        retc=0; 
 561   1        SDA=1;                        /*置数据线为输入方式*/
 562   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 563   1            {
 564   2              _Nop();           
 565   2              SCL=0;                  /*置时钟线为低,准备接收数据位*/
 566   2              _Nop();
 567   2              _Nop();                 /*时钟低电平周期大于4.7μs*/
 568   2              _Nop();
 569   2              _Nop();
 570   2              _Nop();
 571   2              SCL=1;                  /*置时钟线为高使数据线上数据有效*/
 572   2              _Nop();
 573   2              _Nop();
 574   2              retc=retc<<1;
 575   2              if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
 576   2              _Nop();
 577   2              _Nop(); 
 578   2            }
 579   1        SCL=0;    
 580   1        _Nop();
 581   1        _Nop();
 582   1        return(retc);
 583   1      }
 584          
 585          /********************************************************************
 586                               应答子函数
 587          函数原型:  void Ack_I2c(bit a);
 588          功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
 589          ********************************************************************/
 590          void Ack_I2c(bit a)
 591          {
 592   1        
 593   1        if(a==0)SDA=0;             /*在此发出应答或非应答信号 */
 594   1              else SDA=1;
 595   1        _Nop();
 596   1        _Nop();
 597   1        _Nop();      
 598   1        SCL=1;
 599   1        _Nop();
 600   1        _Nop();                    /*时钟低电平周期大于4μs*/
 601   1        _Nop();
 602   1        _Nop();
 603   1        _Nop();  
 604   1        SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
 605   1        _Nop();
 606   1        _Nop();    
 607   1      }
 608          
 609          
 610          
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 11  

 611          
 612          /*******************************************************************
 613                              向有子地址器件发送多字节数据函数               
 614          函数原型: bit  ISendStr(uchar sla,uchar suba,uchar *s,uchar no);  
 615          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 616                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 617                    如果返回1表示操作成功,否则操作有误。
 618          注意:    使用前必须已结束总线。
 619          ********************************************************************/
 620          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 621          {
 622   1         uchar i;
 623   1      
 624   1         Start_I2c();               /*启动总线*/
 625   1         SendByte(sla);             /*发送器件地址*/
 626   1         if(ack==0)return(0);
 627   1         SendByte(suba);            /*发送器件子地址*/
 628   1         if(ack==0)return(0);
 629   1      
 630   1         for(i=0;i<no;i++)
 631   1         {   
 632   2           SendByte(*s);            /*发送数据*/
 633   2           if(ack==0)return(0);
 634   2           s++;
 635   2         } 
 636   1         Stop_I2c();                /*结束总线*/ 
 637   1         return(1);
 638   1      }
 639          
 640          /*******************************************************************
 641                              向有子地址器件读取多字节数据函数               
 642          函数原型: bit  ISendStr(uchar sla,uchar suba,uchar *s,uchar no);  
 643          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 644                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 645                     如果返回1表示操作成功,否则操作有误。
 646          注意:    使用前必须已结束总线。
 647          ********************************************************************/
 648          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 649          {
 650   1         uchar i;
 651   1      
 652   1         Start_I2c();                  /*启动总线*/
 653   1         SendByte(sla);                /*发送器件地址*/
 654   1         if(ack==0)return(0);
 655   1         SendByte(suba);               /*发送器件子地址*/
 656   1         if(ack==0)return(0);
 657   1      
 658   1         Start_I2c();                  /*重新启动总线*/
 659   1         SendByte(sla+1);
 660   1         if(ack==0)return(0);
 661   1         for(i=0;i<no-1;i++)
 662   1         {   
 663   2           *s=RcvByte();               /*发送数据*/
 664   2            Ack_I2c(0);                /*发送就答位*/  
 665   2           s++;
 666   2         } 
 667   1         *s=RcvByte();
 668   1         Ack_I2c(1);                   /*发送非应位*/
 669   1         Stop_I2c();                   /*结束总线*/ 
 670   1         return(1);
 671   1      }
 672          
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 12  

 673          
 674          //求最大值
 675          s8 MAX(s8 onedata, s8 twodata)
 676          {   
 677   1          if(onedata>twodata)return onedata;
 678   1          return twodata;
 679   1      }     
 680          
 681          //求最小值
 682          s8 MIN(s8 onedata, s8 twodata)
 683          { 
 684   1          if(onedata>twodata)return twodata;
 685   1          return onedata;
 686   1      }
 687          
 688          //读寄存器
 689          u8 sta_ReadReg(u8 reg)
 690          {
 691   1              u8 mydata;
 692   1          
 693   1              u8 errorcount=10;
 694   1              while(errorcount--)
 695   1              {
 696   2                 if(IRcvStr(STA_I2C_DEV, reg, &mydata, 1)==0) continue; 
 697   2             return mydata;
 698   2                 break;
 699   2              }
 700   1      }
 701          
 702          //写寄存器
 703          void sta_WriteReg(u8 reg, u8 sta_data)
 704          {
 705   1              u8 errorcount=10;
 706   1          while(errorcount--)
 707   1              {
 708   2                 if(ISendStr(STA_I2C_DEV, reg, &sta_data, 1)==0) continue;
 709   2                 break;
 710   2          }
 711   1      }
 712          
 713          //写配置文件

⌨️ 快捷键说明

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