|
/***************************************************************************************/
#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
2021-11-9 23:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
44.95 KB, 下載次數: 22, 下載積分: 黑幣 -5
|