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

📄 flash.c

📁 PIC18f的flash读写程序
💻 C
字号:
void Flash_Write(unsigned long address,const unsigned char *P)//

{
 unsigned char length;
 unsigned int temp_add=0;
 if(act_wr&en_wr)
 {act_wr=0;
 Flash_Erase(address);
 TBLPTR=address;
 
 for(length=0;length<62;length++)  //写64字节到RAM
 {TBLPTR=address;
  address++;
  TABLAT=*P;
  _asm TBLWT _endasm
  temp_add+=(*P);
  P++;
 }
  
vw_p[63]=(unsigned char)(temp_add)&0xff; 
 TBLPTR=address;
 address++;
 TABLAT=vw_p[63];
 _asm TBLWT _endasm
  
 vw_p[62]=(unsigned char)(temp_add>>8)&0xff;
 TBLPTR=address;
 address++;
 TABLAT=vw_p[62];
 _asm TBLWT _endasm

 
    EECON1=0b10000100;
    STATUSbits.C=0;
    if(INTCONbits.GIE)
    STATUSbits.C=1;
    INTCONbits.GIE=0;            //禁止中断
    EECON2=0x55;    EECON2=0xAA;
    EECON1bits.WR=1;            //启动写周期
    _asm NOP _endasm
    EECON1bits.WREN=0;            //禁止写入
    while(EECON1bits.WR){;}
	if(STATUSbits.C)
    INTCONbits.GIE=1;            //允许中断
}
}

void write_f(void)
{
if(wrs==0x55)
{wrs=0;
// Flash_Erase(0x3000);
 Flash_Write(0x3000,vw_p);
 }
}

void Flash_Erase(unsigned long address)
{
    TBLPTR=address;
    while(EECON1bits.WR){;}             //等待完成
    STATUSbits.C=0;
    if(INTCONbits.GIE)
        STATUSbits.C=1;                 //保存C数据
    INTCONbits.GIE=0;                   //禁止中断
    EECON1bits.WREN=1;               
    EECON1bits.FREE=1;
    EECON2=0x55;
    EECON2=0xAA;
    EECON1bits.WR=1;                    //启动擦除周期
    _asm NOP _endasm    
    while(EECON1bits.WR){;}             //等待完成   
    EECON1bits.WREN=0;
    if(STATUSbits.C)                    //允许中断
        INTCONbits.GIE=1;
}

unsigned char flash_read(unsigned long addr)
{  unsigned char temp_read;
	unsigned char temp_cnt=0;
	 unsigned int temp_add;
	//unsigned char loads[64];
	 if(en_load==1)
	{ temp_add=0;
	for(temp_cnt=0;temp_cnt<64;temp_cnt++)
	{
	TBLPTR=addr;
    _asm TBLRD _endasm   
    vw_p[temp_cnt]=TABLAT;
    addr++; 
    if(temp_cnt<62) temp_add+=TABLAT;    
    }    
    if(temp_add==((((unsigned int)vw_p[63]<<8))+vw_p[62])) en_load=0;
    else en_load=1;
    }
    return ((unsigned char)!en_load);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -