欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1820|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

通過I2C讀取24c02的EEPOROM實(shí)驗(yàn)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:979479 發(fā)表于 2021-11-9 23:11 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
/***************************************************************************************/
#include "public.h"
#include "24c02.h"
#include "key.h"
#include "smg.h"


#define EEPROM_ADDRESS        0        //定義數(shù)據(jù)存入EEPROM的起始地址

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
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"


/*******************************************************************************
* 函 數(shù) 名         : at24c02_write_one_byte
* 函數(shù)功能                   : 在AT24CXX指定地址寫入一個(gè)數(shù)據(jù)
* 輸    入         : addr:寫入數(shù)據(jù)的目的地址
                                         dat:要寫入的數(shù)據(jù)
* 輸    出         : 無
*******************************************************************************/
void at24c02_write_one_byte(u8 addr,u8 dat)
{                                                                                                                                                                                          
    iic_start();  
        iic_write_byte(0XA0);        //發(fā)送寫命令                     
        iic_wait_ack();           
    iic_write_byte(addr);        //發(fā)送寫地址   
        iic_wait_ack();                                                                                                               
        iic_write_byte(dat);        //發(fā)送字節(jié)                                                               
        iic_wait_ack();                                 
    iic_stop();                                //產(chǎn)生一個(gè)停止條件
        delay_ms(10);         
}

/*******************************************************************************
* 函 數(shù) 名         : at24c02_read_one_byte
* 函數(shù)功能                   : 在AT24CXX指定地址讀出一個(gè)數(shù)據(jù)
* 輸    入         : addr:開始讀數(shù)的地址
* 輸    出         : 讀到的數(shù)據(jù)
*******************************************************************************/
u8 at24c02_read_one_byte(u8 addr)
{                                 
        u8 temp=0;                                                                                                                                                               
    iic_start();  
        iic_write_byte(0XA0);        //發(fā)送寫命令           
        iic_wait_ack();
    iic_write_byte(addr);         //發(fā)送寫地址  
        iic_wait_ack();            
        iic_start();                     
        iic_write_byte(0XA1);         //進(jìn)入接收模式                                    
        iic_wait_ack();         
    temp=iic_read_byte(0);        //讀取字節(jié)                  
    iic_stop();                                //產(chǎn)生一個(gè)停止條件   
        return temp;                        //返回讀取的數(shù)據(jù)
}

#include "iic.h"

/*******************************************************************************
* 函 數(shù) 名       : iic_start
* 函數(shù)功能                 : 產(chǎn)生IIC起始信號
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void iic_start(void)
{
        IIC_SCL=1;
        IIC_SDA=1;
        delay_10us(1);
        IIC_SDA=0;        //當(dāng)SCL為高電平時(shí),SDA由高變?yōu)榈?br />         delay_10us(1);
        IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}

/*******************************************************************************
* 函 數(shù) 名         : iic_stop
* 函數(shù)功能                   : 產(chǎn)生IIC停止信號   
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void iic_stop(void)
{
        IIC_SCL=1;
        IIC_SDA=0;
        delay_10us(1);
        IIC_SDA=1;        //當(dāng)SCL為高電平時(shí),SDA由低變?yōu)楦?br />         delay_10us(1);                        
}

/*******************************************************************************
* 函 數(shù) 名         : iic_ack
* 函數(shù)功能                   : 產(chǎn)生ACK應(yīng)答  
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void iic_ack(void)
{
        IIC_SCL=0;
        IIC_SDA=0;        //SDA為低電平
        delay_10us(1);
           IIC_SCL=1;
        delay_10us(1);
        IIC_SCL=0;
}

/*******************************************************************************
* 函 數(shù) 名         : iic_nack
* 函數(shù)功能                   : 產(chǎn)生NACK非應(yīng)答  
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void iic_nack(void)
{
        IIC_SCL=0;
        IIC_SDA=1;        //SDA為高電平
        delay_10us(1);
           IIC_SCL=1;
        delay_10us(1);
        IIC_SCL=0;        
}

/*******************************************************************************
* 函 數(shù) 名         : iic_wait_ack
* 函數(shù)功能                   : 等待應(yīng)答信號到來   
* 輸    入         : 無
* 輸    出         : 1,接收應(yīng)答失敗
                                 0,接收應(yīng)答成功
*******************************************************************************/
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)//超時(shí)則強(qiáng)制結(jié)束IIC通信
                {        
                        iic_stop();
                        return 1;        
                }                        
        }
        IIC_SCL=0;
        return 0;        
}

/*******************************************************************************
* 函 數(shù) 名         : iic_write_byte
* 函數(shù)功能                   : IIC發(fā)送一個(gè)字節(jié)
* 輸    入         : dat:發(fā)送一個(gè)字節(jié)
* 輸    出         : 無
*******************************************************************************/
void iic_write_byte(u8 dat)
{                        
    u8 i=0;
                       
    IIC_SCL=0;
    for(i=0;i<8;i++)        //循環(huán)8次將一個(gè)字節(jié)傳出,先傳高再傳低位
    {              
        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);
    }         
}

/*******************************************************************************
* 函 數(shù) 名         : iic_read_byte
* 函數(shù)功能                   : IIC讀一個(gè)字節(jié)
* 輸    入         : ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK
* 輸    出         : 應(yīng)答或非應(yīng)答
*******************************************************************************/
u8 iic_read_byte(u8 ack)
{
        u8 i=0,receive=0;

    for(i=0;i<8;i++ )        //循環(huán)8次將一個(gè)字節(jié)讀出,先讀高再傳低位
        {
        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實(shí)驗(yàn).rar

44.95 KB, 下載次數(shù): 22, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:979479 發(fā)表于 2021-11-9 23:12 | 只看該作者
試驗(yàn)過,可以正常使用的
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表