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

📄 hello.lst

📁 uart,mcu,linux,embedded soc
💻 LST
📖 第 1 页 / 共 4 页
字号:
 446          {uchar i;
 447   1         TRcvAddress(0xa0,0,&bufdata[0],7);  
 448   1         for(i=0;i<6;i++)
 449   1          {dispbuf[i]=bufdata[i];
 450   2          }
 451   1      }               /*返回上一层程式*/
 452          /******************************************************/
 453          void write24c02()                       /*写24c02的存储值*/
 454          {
 455   1              TSendAddress(0xa0,0,dispbuf,7);  /* 向有子地址器件写入6字节数据函数 */
 456   1      }
 457          /*******************************************************************/
 458          //   24C02芯片读写        起动总线函数               
 459          //函数原型: void  Start();  
 460          //功能:     启动总线,发送24c02启动条件.  
 461          //==================================================================
 462          void Start()
 463          {SDA=0;
 464   1      nop;
 465   1      nop;
 466   1         SCL=0;
 467   1         SDA=1;       /*发送起始条件的数据信号*/
 468   1         nop;
 469   1         SCL=1;
 470   1         nop;         /*起始条件建立时间大于4.7us,延时*/
 471   1         nop;
 472   1         nop;
 473   1         nop;
 474   1         nop;    
 475   1         SDA=0;       /*发送起始信号*/
 476   1         nop;         /* 起始条件锁定时间大于4us*/
 477   1         nop;
 478   1         nop;
 479   1         nop;
 480   1         nop;       
 481   1         SCL=0;       /*钳住总线,准备发送或接收数据 */
 482   1         nop;
 483   1         nop;
 484   1         SDA=1;
 485   1      }
 486          //==================================================================
 487          //                      结束总线函数               
C51 COMPILER V7.07   HELLO                                                                 11/07/2006 19:17:04 PAGE 9   

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

 550          //                 89X52从24c02读数据字节数据接收函数               
 551          //函数原型: uchar  RcvByte();
 552          //功能:           用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 553          //          发完后请用应答函数应答从机。  
 554          //==================================================================
 555          uchar  RcvByte()
 556          {uchar retc=0;
 557   1       uchar count;
 558   1      SDA=1;                          /*置数据线为输入方式*/
 559   1      for(count=0;count<8;count++)
 560   1         {    nop;           
 561   2              SCL=0;                  /*置时钟线为低,准备接收数据位*/
 562   2              nop;
 563   2              nop;                 /*时钟低电平周期大于4.7us*/
 564   2              nop;
 565   2              nop;
 566   2              nop;
 567   2              SCL=1;                  /*置时钟线为高使数据线上数据有效*/
 568   2              nop;
 569   2              nop;
 570   2              retc=retc<<1;
 571   2              if(SDA==1)
 572   2              retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
 573   2              nop;
 574   2              nop; 
 575   2        }
 576   1        SCL=0;    
 577   1        nop;
 578   1        nop;
 579   1        return(retc);
 580   1      }
 581          //==================================================================
 582          //                     主机89X52应答子函数
 583          //函数原型:  void Ack(bit a);
 584          //功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
 585          //==================================================================
 586          void Ack(bit a)
 587          {if(a==0)                   
 588   1           SDA=0;                  /*在此发出应答或非应答信号 */
 589   1        else                       /* 应答 a=0  非应答 a=1 */ 
 590   1           SDA=1;
 591   1        nop;
 592   1        nop;
 593   1        nop;      
 594   1        SCL=1;
 595   1        nop;
 596   1        nop;                    /*时钟低电平周期大于4us*/
 597   1        nop;
 598   1        nop;
 599   1        nop;  
 600   1        SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
 601   1        nop;
 602   1        nop;    
 603   1      }
 604          //==================================================================
 605          //                 用户接口函数                                   
 606          // 有无子地址表示是否向芯片的特定地址写数据  
 607          //          向有子地址器件写入6字节数据函数  对应数据资料中的写模式             
 608          //函数原型: bit  TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);  
 609          //功能:     从启动总线到发送从地址,子地址,数据,结束总线的全过程,从器件
 610          //          地址slaaddress,子地址subaddress,发送内容是s指向的内容,no=字节数
 611          //          如果返回1表示操作成功,否则操作有误。
C51 COMPILER V7.07   HELLO                                                                 11/07/2006 19:17:04 PAGE 11  

 612          //注意:    使用前必须已结束总线。
 613          //==================================================================
 614          bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no) /* 向有子地址器件写入6字节数据函数 
             -*/
 615          {
 616   1      uchar i;
 617   1         Start();                     /*启动总线*/
 618   1         SendByte(slaaddress);        /*发送器件地址*/
 619   1         if(acknow==0)
 620   1         return(0);
 621   1         SendByte(subaddress);        /*发送器件子地址*/
 622   1         if(acknow==0)
 623   1         return(0);
 624   1         for(i=0;i<no;i++)
 625   1         {
 626   2           SendByte(s[i]);            /*发送数据*/
 627   2           if(acknow==0)
 628   2           return(0);
 629   2         }   
 630   1         Stop();                              /*结束总线*/ 
 631   1         return(0);
 632   1      }
 633          //==================================================================
 634          //                    向有子地址器件读取4字节数据函数               
 635          //函数原型: bit  TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);  
 636          //功能:     从启动总线到发送从地址,子地址,读数据,结束总线的全过程,从器件
 637          //          地址slaaddress,子地址subaddress,读出的内容放入s, no=字节数
 638          //           如果返回1表示操作成功,否则操作有误。
 639          //注意:    使用前必须已结束总线。
 640          //==================================================================
 641          bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no)
 642          { 
 643   1              uchar i; 
 644   1         Start();                             /*启动总线*/
 645   1         SendByte(slaaddress);                /*发送器件从地址*/
 646   1         if(acknow==0)
 647   1         return(0);
 648   1         SendByte(subaddress);               /*发送器件子地址*/
 649   1         if(acknow==0)
 650   1         return(0);
 651   1         Stop();                   /*结束总线*/ 
 652   1         Start();                      /*重新启动总线*/
 653   1         SendByte(slaaddress+1);
 654   1         if(acknow==0)
 655   1         return(0);
 656   1         for(i=0;i<no;i++)
 657   1          {* s=RcvByte();               /*接收数据*/
 658   2           Ack(0);                     /*发送应答位*/
 659   2           s++;
 660   2          }                   
 661   1           * s=RcvByte();               /*接收数据*/
 662   1           Ack(1);
 663   1           Stop();                   /*结束总线*/ 
 664   1           return(1);
 665   1      }
 666          //******************************************************************
 667          void service_int0 () interrupt 1 using 2        /*设定每隔3000us中断扫描一次数码管*/
 668          {
 669   1              ptr1++;                         /*扫描指标加1*/
 670   1              TH0=(65536-2000)/256;           /*每隔4000US扫描一次*/
 671   1              TL0=(65536-2000)%256;
 672   1              while (ptr1>5) ptr1=0;          /*ptr1>5表示6个数码管都已经扫描过*/
C51 COMPILER V7.07   HELLO                                                                 11/07/2006 19:17:04 PAGE 12  

⌨️ 快捷键说明

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