📄 at24cxx.c
字号:
/*******************************************/
#include<iom8v.h>
#include<eeprom.h>
#include"TWI.H"
#define rd_device_add 0xa1
#define wr_device_add 0xa0
extern const unsigned char seg_table[16];
extern unsigned char led_buff[4];
extern void delay_ms(unsigned int time);
extern void display(void);
//TWI中断处理(主机模式读和写,以访问AT24C02为例)
#define EE_READ 0xf0
#define EE_READ_OK 0x50
#define EE_WRITE 0x0f
#define EE_WRITE_OK 0x05
//EEPROM的当前工作状态
unsigned char EE_STATE;
//EEPROM的当前ROM数据
unsigned char EE_DATA;
//EEPROM的当前ROM地址
unsigned char EE_ADD;
//TWI传输方向
#define TWI_ROM_ADD 0x5a
#define TWI_ROM_DATA 0xa5
#define TWI_STOP 0
unsigned char TWI_STATE;
#pragma interrupt_handler TWI_ISR:iv_TWI
void TWI_ISR(void)
{
switch (TestAck())
{
case SR_SLA_ACK:{//从地址匹配
TWI_STATE=TWI_ROM_ADD;//下一步接收ROM地址
Twi_ACK();
break;}
case SR_DATA_ACK:{//接收主机送来的从机ROM地址或ROM数据
switch(TWI_STATE)
{
case TWI_ROM_ADD:{
EE_ADD=TWDR;
TWI_STATE=TWI_ROM_DATA;//下一步接收ROM数据
break;}
case TWI_ROM_DATA:{
EE_DATA=TWDR;
EE_STATE=EE_WRITE;//命令为写EEPROM操作
TWI_STATE=TWI_STOP;
break;}
}
Twi_ACK();
break;}
case SR_STOP_RESTART:{//主机写命令结束或读命令的重起信号
TWI_STATE=TWI_STOP;;
Twi_ACK();
break;}
case ST_SLA_ACK:{//执行读EEPROM操作
EE_DATA=EEPROMread(EE_ADD);
Write8Bit(EE_DATA);
Twi_NoACK();
EE_STATE=EE_READ;
break;}
case ST_DATA_NOACK:{
Twi_ACK();
TWI_STATE=TWI_STOP;
break;}
default:{
TWI_STATE=TWI_STOP;
EE_STATE=EE_READ_OK;
Stop();//从机模式恢复TWI响应能力
}
}
}
void fill_buff(void)
{
led_buff[1]=seg_table[EE_DATA/16];
led_buff[0]=seg_table[EE_DATA%16];
led_buff[3]=seg_table[EE_ADD/16];
led_buff[2]=seg_table[EE_ADD%16];
led_buff[2]&=0x7f;
}
void main(void)
{
unsigned char i;
//上电数码管自检
for(i=0;i<4;i++)
{
led_buff[i]=seg_table[8];
}
for(i=0;i<200;i++)
display();
EE_ADD=0;
EE_DATA=EEPROMread(EE_ADD);
asm("sei");
TWBR=0;
TWSR=00;
TWAR=wr_device_add;
Twi_ACK();
fill_buff();
while(1)
{
switch(EE_STATE)
{
case EE_READ:{//刷新地址和数据的显示
EE_STATE=EE_READ_OK;
fill_buff();
TWI_STATE=TWI_STOP;
break;}
case EE_WRITE:{//执行写操作并刷新地址和数据的显示
EEPROMwrite(EE_ADD,EE_DATA);
EE_STATE=EE_WRITE_OK;
fill_buff();
TWI_STATE=TWI_STOP;
break;}
}
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -