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

📄 i2c.c

📁 51单片机开始的24064点陈显示屏驱动程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include "i2c.h"
 
 
 bit  SCL,SDA ;                    //用于切换两个I2C存储器
 #define HIGH  1
 #define LOW   0
 #define FALSE 0
 #define TRUE  1
 
/*********************************

*  功  能:
*  播入5个NOP指令,用于延时

**********************************/
void delay_5us(void)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/**********************************

*  功  能:
*  提供I2C总线工作时序中的起始位
*  SCL 为高时 SDA 由高变低时为启动信号

**********************************/
void  i_start()     
{
  SCL = HIGH;
  SDA = HIGH;
  delay_5us();
  SDA = LOW ;
  delay_5us();
  SCL = LOW  ;
  delay_5us();
}

/**********************************

*  功  能:
*  提供I2C总线工作时序中的停止位
*  SCL 为高时 SDA 由低变高停止信号

**********************************/
void  i_stop()     
{
  SCL = HIGH;
  SDA = LOW;
  delay_5us();
  SDA = HIGH;
  delay_5us();
  SCL = LOW;
  delay_5us();
}

/*************************************

*  功  能:
*  提供I2C总线初始化

***************************************/
void  i_init()     
{
  SCL = LOW;
  i_stop();
}

/***************************************

*  功  能:
*  提供I2C总线的时钟信号,并返回在时钟
*  电平为高期间SDA信号线上状态。
*  本函数可用于数据发送,也可用于数据接收

*****************************************/
bit  i_clock()     
  {
    SCL = HIGH;
    delay_5us();
    if(SDA)
     {
      SCL = LOW;
      delay_5us();
      return(1);
     }
    SCL = LOW;
    delay_5us();
    return (0);
  }
/**********************************

*  功  能:
*  向I2C总线发送8位数据,并请求一个应答信号ACK,
*  如果接到ACK应答则返回TURE,否则返回FALSE

**********************************/
bit  i_send( uchar i_data )     
  {
    uchar i;
    for( i = 0; i<8; i++ )
     {
      SDA = (bit)(i_data&0x80);
      i_data <<= 1 ;
      i_clock();
     }
    SDA = HIGH;
    return ( ~i_clock() );
  }

/**********************************

*  功  能:
*  从I2C总线接收8位数据,并将接收到的数据做为1B返回
*  不回送应答信号ACK。主函数在调用本函数前应保证SDA
*  信号线处于浮置状态,高电平

**********************************/
  uchar i_receive(void)
   {
     uchar i,i_data = 0;
     for( i = 0; i<8; i++ )
       {
         i_data <<=1;
         if( i_clock() )
           {
             i_data++;
           }
       }
    return ( i_data );
}

/**********************************

*  功  能:
*  向I2C总线发送一个应答信号ACK,
*  一般用于连续读取时

**********************************/
void i_ack()
{
  SDA = LOW;
  i_clock();
  SDA = HIGH;
}

/*****************************************

*功能:向24C04写入器件地址和一个指定的字节

******************************************/

⌨️ 快捷键说明

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