| 
 | 
 
#include "e:\codefile\rf_card\pic1687x.h" 
/********************************************************************* 
* 模块名:  EEROM读写模块 
*芯片型号: 24LC512  
*********************************************************************/ 
#define uchar unsigned char 
#define uint unsigned int 
static uchar bank1 buffer[20]; 
const unsigned char TAB1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; 
/********************************************************************  
* 
* 名称: wait_ms 
* 说明:  
* 功能: 延时n ms 
* 调用: 无 
* 输入: ms 延时毫秒数,ms=n 延时n ms. 
* 返回值: 无 
***********************************************************************/ 
void wait_ms(uchar ms) 
{   
   uchar i; 
   for(;ms>0;--ms) 
     for(i=248;i>0;--i) 
{ 
   asm("nop"); 
   asm("nop"); 
} 
   return; 
} 
/********************************************************************  
* 
* 名称: mssp_initi 
* 说明:  
* 功能: MSSP模块初始化函数 
* 调用: 无 
* 输入: 无 
* 返回值: 无 
***********************************************************************/ 
void mssp_initi(void) 
{   
INTCON=0; 
TRISB=0; file://OUT 
TRISC3=1; 
TRISC4=1; 
SSPSTAT=0x80; 
      file://传输数率设为100KHZ 
SSPADD=9; 
SSPCON=0x08; 
SSPCON2=0x00; 
SSPIF=0; 
SSPEN=1;  file://起用SSP模块 ,iic  
return; 
} 
/********************************************************************  
* 
* 名称: eep_start 
* 说明:  
* 功能: 产生一个起使位 
* 调用: 无 
* 输入: 无 
* 返回值: 无 
***********************************************************************/ 
void eep_start (void) 
{ 
  uchar i; 
  SSPIF=0; 
  SEN=1;   
  for(i=2;--i;)  continue; 
  do { 
RSEN=1; 
        }while(SSPIF==0); 
SSPIF=0; 
return; 
} 
/********************************************************************  
* 
* 名称: eep_stop 
* 说明:  
* 功能: 产生一个停止位 
* 调用: 无 
* 输入: 无 
* 返回值: 无 
***********************************************************************/ 
void eep_stop(void) 
{ 
   PEN=1; 
   do { 
  ; 
}while(SSPIF==0); 
   SSPIF=0; 
   return; 
} 
/********************************************************************  
* 
* 名称: eep_read_byte 
* 说明:  
* 功能: 读24lc512指定1 byte数 
* 调用: eep_start,eep_stop 
* 输入: uint eep_addr 要读的地址,uchar*p 缓存单元 
* 返回值: data 
***********************************************************************/ 
uchar eep_read_byte(uint eep_addr) 
{ 
  uchar data; 
  union addr_r 
   { 
    uint i; 
    uchar addr_eep[2]; 
     }eeprom_addr; 
   eeprom_addr.i=eep_addr; 
   eep_start(); 
   SSPBUF=0xa0; file://24lc512硬件写地址 
      do { 
   ; 
    }while(SSPIF==0); 
            SSPIF=0; 
    SSPBUF=eeprom_addr.addr_eep[0]; 
       do{ 
  ;}while(SSPIF==0); 
  SSPIF=0; 
    SSPBUF=eeprom_addr.addr_eep[1]; 
     do{ 
          ;}while(SSPIF==0); 
          SSPIF=0; 
    eep_stop(); 
    eep_start(); 
    SSPBUF=0xa1; file://24lc512硬件读地址 
     do{ 
         ;}while(SSPIF==0); 
         SSPIF=0; 
    RCEN=1; 
        do{ 
            ;}while(SSPIF==0); 
            SSPIF=0; 
    data=SSPBUF; 
    eep_stop(); 
    return(data); 
} 
/********************************************************************  
* 
* 名称: eep_write_byte 
* 说明:  
* 功能: 写24lc512指定1 byte数 
* 调用: eep_start,eep_stop 
* 输入: uint eep_addr 要写的地址,uchar 写缓存 
* 返回值:  
***********************************************************************/ 
void eep_write_byte(uint eep_addr,uchar *p) 
{ 
  union addr_w 
  { 
    uint i; 
    uchar addr[2]; 
    }eep_addr_w; 
    eep_addr_w.i=eep_addr; 
    eep_start(); 
    SSPBUF=0xa0; 
       do{ 
           ;}while(SSPIF==0); 
         SSPIF=0; 
    SSPBUF=eep_addr_w.addr[0]; 
       do{ 
          ;}while(SSPIF==0); 
           SSPIF=0; 
    SSPBUF=eep_addr_w.addr[1]; 
     do{ 
      ;}while(SSPIF==0); 
      SSPIF=0; 
    SSPBUF=*p; 
     do{ 
      ;}while(SSPIF==0); 
      SSPIF=0; 
    eep_stop();  
    wait_ms(10); 
    return;            
} 
/********************************************************************  
* 
* 名称: Read_24lc512 
* 说明:  
* 功能: 读24lc512 
* 调用: eep_read_byte 
* 输入: uint read_address 要读的起使地址,uchar read_length 读段长度,uchar*point 指向读缓冲区 
* 返回值: 无 
***********************************************************************/ 
void Read_24lc512(uint read_address,uchar read_length,uchar *point) 
{ 
    do{ 
*point=eep_read_byte(read_address); 
read_address++; 
*point++; 
read_length--; 
        }while(read_length);     
} 
/********************************************************************  
* 
* 名称: Write_24lc512 
* 说明:  
* 功能: 写24lc512 
* 调用: eep_write_byte 
* 输入: uint read_address 要写的起使地址,uchar read_length 写段长度,uchar*point 指向写缓冲区 
* 返回值: 无 
***********************************************************************/ 
void Write_24lc512(uint write_address,uchar write_length,uchar *point) 
{ 
     do{ 
      eep_write_byte(write_address,point); 
      write_address++; 
      *point++; 
      write_length--; 
                }while(write_length); 
}  
/********************************************************************  
* 
* 名称: main 
* 说明: 测试24lc512程序 
* 功能: 将数组array的20个数写入从0000H到0014H地址的20个24L512单元, 
* 再读24lc512的0000H到0014H单元保存到buffer数组。 
* 调用: Write_24lc512,Read_24lc512 
* 输入: 无 
* 返回值: 无 
***********************************************************************/ 
main() 
{ uchar array[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; 
mssp_initi(); 
      Write_24lc512(0x0000,20,array); 
Read_24lc512(0x0000,0x14,buffer); 
      do{ 
       ;}while(1); 
} |   
 
 
 
 |