📄 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 + -