|
/***************************************************************************************/
#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;
}
|
|