找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1201|回复: 1
收起左侧

通过I2C读取24c02的EEPOROM实验程序

[复制链接]
ID:979479 发表于 2021-11-9 23:11 | 显示全部楼层 |阅读模式
/***************************************************************************************/
#include "public.h"
#include "24c02.h"
#include "key.h"
#include "smg.h"


#define EEPROM_ADDRESS        0        //定义数据存入EEPROM的起始地址

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        u8 key_temp=0;
           u8 save_value=0;
        u8 save_buf[3];

        while(1)
        {                        
                key_temp=key_scan(0);
                if(key_temp==KEY1_PRESS)
                {
                        at24c02_write_one_byte(EEPROM_ADDRESS,save_value);
                }
                else if(key_temp==KEY2_PRESS)
                {
                        save_value=at24c02_read_one_byte(EEPROM_ADDRESS);
                }
                else if(key_temp==KEY3_PRESS)
                {
                        save_value++;
                        if(save_value==255)save_value=255;
                }
                else if(key_temp==KEY4_PRESS)
                {
                        save_value=0;        
                }
                save_buf[0]=save_value/100;
                save_buf[1]=save_value%100/10;
                save_buf[2]=save_value%100%10;
                smg_display(save_buf,6);
        }               
}

#include "24c02.h"
#include "iic.h"


/*******************************************************************************
* 函 数 名         : at24c02_write_one_byte
* 函数功能                   : 在AT24CXX指定地址写入一个数据
* 输    入         : addr:写入数据的目的地址
                                         dat:要写入的数据
* 输    出         : 无
*******************************************************************************/
void at24c02_write_one_byte(u8 addr,u8 dat)
{                                                                                                                                                                                          
    iic_start();  
        iic_write_byte(0XA0);        //发送写命令                     
        iic_wait_ack();           
    iic_write_byte(addr);        //发送写地址   
        iic_wait_ack();                                                                                                               
        iic_write_byte(dat);        //发送字节                                                               
        iic_wait_ack();                                 
    iic_stop();                                //产生一个停止条件
        delay_ms(10);         
}

/*******************************************************************************
* 函 数 名         : at24c02_read_one_byte
* 函数功能                   : 在AT24CXX指定地址读出一个数据
* 输    入         : addr:开始读数的地址
* 输    出         : 读到的数据
*******************************************************************************/
u8 at24c02_read_one_byte(u8 addr)
{                                 
        u8 temp=0;                                                                                                                                                               
    iic_start();  
        iic_write_byte(0XA0);        //发送写命令           
        iic_wait_ack();
    iic_write_byte(addr);         //发送写地址  
        iic_wait_ack();            
        iic_start();                     
        iic_write_byte(0XA1);         //进入接收模式                                    
        iic_wait_ack();         
    temp=iic_read_byte(0);        //读取字节                  
    iic_stop();                                //产生一个停止条件   
        return temp;                        //返回读取的数据
}

#include "iic.h"

/*******************************************************************************
* 函 数 名       : iic_start
* 函数功能                 : 产生IIC起始信号
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void iic_start(void)
{
        IIC_SCL=1;
        IIC_SDA=1;
        delay_10us(1);
        IIC_SDA=0;        //当SCL为高电平时,SDA由高变为低
        delay_10us(1);
        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}

/*******************************************************************************
* 函 数 名         : iic_stop
* 函数功能                   : 产生IIC停止信号   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void iic_stop(void)
{
        IIC_SCL=1;
        IIC_SDA=0;
        delay_10us(1);
        IIC_SDA=1;        //当SCL为高电平时,SDA由低变为高
        delay_10us(1);                        
}

/*******************************************************************************
* 函 数 名         : iic_ack
* 函数功能                   : 产生ACK应答  
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void iic_ack(void)
{
        IIC_SCL=0;
        IIC_SDA=0;        //SDA为低电平
        delay_10us(1);
           IIC_SCL=1;
        delay_10us(1);
        IIC_SCL=0;
}

/*******************************************************************************
* 函 数 名         : iic_nack
* 函数功能                   : 产生NACK非应答  
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void iic_nack(void)
{
        IIC_SCL=0;
        IIC_SDA=1;        //SDA为高电平
        delay_10us(1);
           IIC_SCL=1;
        delay_10us(1);
        IIC_SCL=0;        
}

/*******************************************************************************
* 函 数 名         : iic_wait_ack
* 函数功能                   : 等待应答信号到来   
* 输    入         : 无
* 输    出         : 1,接收应答失败
                                 0,接收应答成功
*******************************************************************************/
u8 iic_wait_ack(void)
{
        u8 time_temp=0;
        
        IIC_SCL=1;
        delay_10us(1);
        while(IIC_SDA)        //等待SDA为低电平
        {
                time_temp++;
                if(time_temp>100)//超时则强制结束IIC通信
                {        
                        iic_stop();
                        return 1;        
                }                        
        }
        IIC_SCL=0;
        return 0;        
}

/*******************************************************************************
* 函 数 名         : iic_write_byte
* 函数功能                   : IIC发送一个字节
* 输    入         : dat:发送一个字节
* 输    出         : 无
*******************************************************************************/
void iic_write_byte(u8 dat)
{                        
    u8 i=0;
                       
    IIC_SCL=0;
    for(i=0;i<8;i++)        //循环8次将一个字节传出,先传高再传低位
    {              
        if((dat&0x80)>0)
                        IIC_SDA=1;
                else
                        IIC_SDA=0;
        dat<<=1;           
                delay_10us(1);  
                IIC_SCL=1;
                delay_10us(1);
                IIC_SCL=0;        
                delay_10us(1);
    }         
}

/*******************************************************************************
* 函 数 名         : iic_read_byte
* 函数功能                   : IIC读一个字节
* 输    入         : ack=1时,发送ACK,ack=0,发送nACK
* 输    出         : 应答或非应答
*******************************************************************************/
u8 iic_read_byte(u8 ack)
{
        u8 i=0,receive=0;

    for(i=0;i<8;i++ )        //循环8次将一个字节读出,先读高再传低位
        {
        IIC_SCL=0;
        delay_10us(1);
                IIC_SCL=1;
        receive<<=1;
        if(IIC_SDA)receive++;   
                delay_10us(1);
    }                                         
    if (!ack)
        iic_nack();
    else
        iic_ack();  
                  
    return receive;
}



I2C-EEPROM实验.rar

44.95 KB, 下载次数: 21, 下载积分: 黑币 -5

回复

使用道具 举报

ID:979479 发表于 2021-11-9 23:12 | 显示全部楼层
试验过,可以正常使用的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表