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

📄 main.c

📁 EEPROM-24C系列上用的接口程式源码
💻 C
字号:
#include <msp430x43x.h>

#define iic_io_init P4OUT &= 0XFC   //定义I/O口接线
#define iic_set_sda P4DIR &= 0XFD   
#define iic_clr_sda P4DIR |= 0X02
#define iic_set_scl P4DIR &= 0XFE
#define iic_clr_scl P4DIR |= 0X01
#define iic_io_data P4IN & 0X02    //判断接受的数据是1还是0

unsigned char ack_flag;

//延时函数

void iic_delay(void)
{
   int i;
   for(i=0;i<50;i++);
}

//启动I2C

void start_iic(void)
{
   iic_io_init;
   iic_set_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   iic_clr_sda;
   iic_delay();
   iic_clr_scl;
   iic_delay();
}      

// 停止IIC

void stop_iic(void)
{
   iic_clr_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   iic_set_sda;
   iic_delay();
   iic_clr_sda;
   iic_delay();
   iic_clr_scl;
}

//发送0

void send_zero(void)
{
   iic_clr_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   iic_clr_scl;
   iic_delay();
}

//发送1

void send_one(void)
{
   iic_set_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   iic_clr_scl;
   iic_delay();
   iic_clr_sda;
   iic_delay();
}

//发送1字节数据

void send_char(unsigned char sendtmp)     //发送1字节程序,sendtemp是要发送的值
{
   unsigned char cnt,tmp=0x80;
   for(cnt=0; cnt<8; cnt++)
   {
      if((sendtmp & tmp)> 0)
      {
         send_one();
      }else
      {
         send_zero();
      }
      tmp /= 2;
   }
}

//读1字节数据

unsigned char read_char(void)    
{
   unsigned char cnt,tmp=0x80,readtmp;
   readtmp = 0x00;
   for (cnt=0; cnt<8; cnt++)
   {
      iic_set_sda;
      iic_delay();
      iic_set_scl;
      iic_delay();
      if((iic_io_data) > 0x00)
      {        
         readtmp |= tmp;
      }
      iic_clr_scl;
      iic_delay();
      tmp = tmp/2;
   }
   return readtmp;    //返回读出来的值
}

//应答信号

void iic_ack(void)
{
   ack_flag = 0x00;
   iic_set_sda;
   iic_delay();
   iic_set_scl;
   iic_delay();
   if((iic_io_data) == 0x80 )
   {
      ack_flag = 0x01;
   }
   iic_clr_scl;
   iic_delay();
}

//iic_nack

void iic_nack(void)
{
   iic_set_sda;
   iic_delay();
   iic_clr_scl;
   iic_delay();
   iic_clr_scl;
   iic_delay();
   iic_clr_sda;
   iic_delay();
}

//写一个数据到EEPROM中               
         
void write_eeprom(unsigned char ctrl_addres,unsigned char addres,unsigned char value) 
                                                                                    //ctrl_addres是控制字段
                                                                                    //addres 是地址
                                                                                    //value 是值
{
   unsigned char step_flag = 0x00;
   while(step_flag < 0x03)
   {
      if(step_flag == 0x00)
      {
         start_iic();
         send_char(ctrl_addres);
         iic_ack();
         if(ack_flag == 0) step_flag += 1;
      }else if (step_flag == 1)
      {
         send_char(addres);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
         }
         else
         {  
            step_flag = 0;
         }
      }else
      {
         send_char(value);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
         }
         else
         {
            step_flag = 0;
         }
      }
   }
   stop_iic();
}                     
            
//从EEPROM中读数据

unsigned char read_eeprom(unsigned char ctrl_addres,unsigned char addres)            
                                                                   //ctrl_addres 是控制字段
                                                                   //addres是地址
{
   unsigned char step_flag=0,value;
   while (step_flag <0x03)
   {
      if(step_flag == 0x00)
      {
         start_iic();
         send_char(ctrl_addres);
         iic_ack();
         if(ack_flag == 0) step_flag += 1;
      }
      else if (step_flag == 1)
      {
         send_char(addres);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
         }
         else
         {
            step_flag = 0;
         }
      }
      else
      {
         start_iic();
         send_char(ctrl_addres+1);
         iic_ack();
         if(ack_flag == 0)
         {
            step_flag += 1;
            value = read_char();
            iic_nack();
         }
         else
         {
            step_flag = 0;
         }
      }
   }
   stop_iic();
   return value;
}                     
              
            
      
      
      
         
void main( void )
{  
   unsigned char iic_value;
   WDTCTL=WDTPW + WDTHOLD;
   write_eeprom(0xa0,0x02,0x20);
   iic_value = read_eeprom(0xa0,0x02);
   iic_value = iic_value;
   while(1);
}


⌨️ 快捷键说明

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