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

📄 zlg7290.txt

📁 ZLG7290使用代码 ,使用模拟I2C,其是ZLG7290的IIC驱动C语言程序。
💻 TXT
📖 第 1 页 / 共 2 页
字号:
ZLG7290的IIC驱动C语言程序
      ZLG7290的IIC驱动C语言程序
      作者:未知    AVR单片机来源:网络    点击数: 1336     更新时间:2007-10-1    

      //#####################---文件信息-----############################
      //文   件   名   :   7290.c
      //创   建   人   :   ZXJ
      //建  立 时 间   :   2004-2-17
      //版  本 描 述   :   V1.0
      //功  能 描 述   :   ZLG7290使用代码 ,使用模拟I2C
      //备      注   :   调试环境为AVRGCC 3.3.1,MCU为Mega8 晶振为3.6864MHZ
      //               由于ZLG7290的速度很慢,换晶振时注意延时程序的调整.实际测试中
      //               死机现象比较严重,建议使用控制ZLG7290的复位
      //最后修改时间   :   2004-2-19
      //##################################################################

      #include "7290.h"

      //0到9
      //const u08 LED_Font[10] = 
      {0xCF,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; //正
      const u08 LED_Font[10] = 
      {0xfc,0x0c,0xda,0x9e,0x2e,0xb6,0xf6,0x1c,0xfe,0xbe}; //反

      //----------------------------------------------------------------
      void I2c_Send_Byte(u08 data);
      u08 I2c_Rev_Byte(void);

      //*****************************************************************
      //函   数   名   :   _Nop   
      //建 立 时  间   :   2004-2-17
      //功 能 描  述   :   延时函数,最大值为0xff
      //备      注   :   没有返回值
      //最后修改时间   :   2004-2-18
      //*****************************************************************
      void  _Nop(u08 dly)  
      {
         u08 i;
         for(i=0;i<dly;i++)
         {
            asm("nop");
         }
      }

      //==============================================
      //I2C通讯协议实现部分
      //==============================================

      //*****************************************************************
      //函   数   名   :   Start_I2c   
      //建 立 时  间   :   2004-2-17
      //功 能 描  述   :   启动模拟I2C通讯
      //备      注   :   没有返回值
      //最后修改时间   :   2004-2-17
      //*****************************************************************
      void Start_I2c(void)
      {
        SDA_1;   //发送起始条件的数据信号
        _Nop(1);
        SCL_1;
        _Nop(5);    //起始条件建立时间大于4.7us,延时   
        SDA_0;   //发送起始信号
        _Nop(5);    // 起始条件锁定时间大于4μs
             
        SCL_0;   //钳住I2C总线,准备发送或接收数据
        _Nop(5);
      }

      //*****************************************************************
      //函   数   名   :   Stop_I2c   
      //建 立 时  间   :   2004-2-17
      //功 能 描  述   :   停止模拟I2C通讯
      //备      注   :   没有返回值
      //最后修改时间   :   2004-2-17
      //*****************************************************************
      void Stop_I2c(void)
      {
        SDA_0  //发送结束条件的数据信号
        _Nop(1); 
        SCL_1  //结束条件建立时间大于4μs
        _Nop(5);
        SDA_1  //发送I2C总线结束信号
        _Nop(5);
      }

      //*****************************************************************
      //函   数   名   :   I2c_Send_Byte   
      //建 立 时  间   :   2004-2-17
      //功 能 描  述   :   向I2c总线发送1个字节的数据/命令
      //备      注   :   没有返回值
      //最后修改时间   :   2004-2-18
      //*****************************************************************
      void I2c_Send_Byte(u08 data)
      {
         u08 BitCnt;
       
         for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
          {
           if((data<<BitCnt)&0x80)
              SDA_1        //判断发送位
            else  
             SDA_0                
           _Nop(15);
           SCL_1                  //置时钟线为高,通知被控器开始接收数据位
            _Nop(15);        
           SCL_0 
          }
          
          _Nop(15);
          SDA_1               //8位发送完后释放数据线,准备接收应答位
          _Nop(15); 
          SCL_1
          _Nop(15);
          if(bit_is_set(I2C_PIN,SDA))ack=0;     
             else ack=1;        //判断是否接收到应答信号
          SCL_0
          _Nop(15);
      }

      //*****************************************************************
      //函   数   名   :   Stop_I2c   
      //建 立 时  间   :   2004-2-17
      //功 能 描  述   :   从I2c总线接收1个字节的数据/命令
      //备      注   :   返回接收到的数据/命令
      //最后修改时间   :   2004-2-18
      //*****************************************************************
      u08 I2c_Rev_Byte(void)
      {
        u08 retc;
        u08 BitCnt;
        
        retc=0; 
        SDA_1             //置数据线为输入方式
        for(BitCnt=0;BitCnt<8;BitCnt++)
            {
              _Nop(15);           
              SCL_0       //置时钟线为低,准备接收数据位
              _Nop(20);
              SCL_1       //置时钟线为高使数据线上数据有效
              _Nop(20);
              retc=retc<<1;
              if(bit_is_set(I2C_PIN,SDA))retc=retc+1; //读数据位,接收的数据位放入retc中 
              _Nop(20);
            }
        SCL_0    
        _Nop(20);
        return(retc);
      }

      //*****************************************************************
      //函   数   名   :   Ack_I2c   
      //建 立 时  间   :   2004-2-17
      //功 能 描  述   :   主机的发送应答信号
      //备      注   :   没有返回值
      //最后修改时间   :   2004-2-17
      //*****************************************************************
      void Ack_I2c(u08 a)
      {
        
        if(a==0)SDA_0     //在此发出应答或非应答信号 
              else SDA_1
        _Nop(5);  
        SCL_1
          _Nop(5);
       SCL_0               //清时钟线,钳住I2C总线以便继续接收
          _Nop(5);
      }

      //*****************************************************************
      //函   数   名   :   I2c_Read
      //建 立 时  间   :   2004-2-18
      //功 能 描  述   :   从I2C总线上读取数据/命令,icadder是从器件地址,adder
      //               是从器件的寄存器(如果有的话),count是一次读取的的数量
      //               *buff读取的数据存放地址
      //备      注   :   没有返回值
      //最后修改时间   :   2004-2-18
      //*****************************************************************
      void I2c_Read(u08 icadder, u08 adder, u08 count, u08 *buff)
      {   
         u08 i;
         Start_I2c();
         _Nop(5);
         I2c_Send_Byte(icadder);   //写入IC的地址
         _Nop(10);
          I2c_Send_Byte(adder);   //写入寄存器地址
          _Nop(10);
         
         Stop_I2c();            //可查看I2C标准 
         _Nop(5);

          Start_I2c();
         _Nop(5);
          I2c_Send_Byte(icadder+1);
          _Nop(10);

          for (i=0;i<count;i++)
          {
             *buff=I2c_Rev_Byte();
             if (i!=count-1) Ack_I2c(0);//除最后一个字节外,其他都要从MASTER发应答。
             buff++;
          }
          //SendAck();//除最后一个字节外,其他都要从MASTER发应答。

          Ack_I2c(1);
          Stop_I2c();
         
      }

      //*****************************************************************
      //函   数   名   :   I2c_Send
      //建 立 时  间   :   2004-2-18
      //功 能 描  述   :   从I2C总线上读取数据/命令,icadder是从器件地址,adder
      //               是从器件的寄存器(如果有的话),value要写入的值
      //备      注   :   有返回值

⌨️ 快捷键说明

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