⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24cxx.c

📁 可以高速度写eeprom的程序
💻 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 + -