/*----------------------------------------------------------------------------------------------- *----------------------------------------------------------------------------------------------- * * 深圳市普康电子有限公司 * PROCAN Electronic * http: //www.procan.com.cn * *----------------------------------------------------------------------------------------------- * 文 件 名: C8051F_EEPROM.C * 创 建 人: 艾艳斌(E-mail:ayb_ice@yahoo.com.cn) * 版 本: V1.00 / 2006-3-2 14:41 * 描 述: C8051F片上EEPROM程序(注意: 并非全部C8051Fx MCU兼容) *----------------------------------------------------------------------------------------------- * 修 改 人: 艾艳斌 * 版 本: V1.01 / 2008-2-25 15:01 * 描 述: 修改程序,使之规范,合理,易于阅读 *----------------------------------------------------------------------------------------------- * 修 改 人: 艾艳斌 * 版 本: V1.02 / 2008-3-4 16:24 * 描 述: 将EEPROM写函数的指针由指向U8X改成U8C,c8051f_eeprom_sector_earse改带参数 *----------------------------------------------------------------------------------------------- * 修 改 人: 艾艳斌 * 版 本: V1.03 / 2008-3-14 13:47 * 描 述: 修改c8051f_eeprom_sector_check,c8051f_eeprom_xwrite函数,大大提高程序执行效率,同时 * >>> : 提高代码效率 *----------------------------------------------------------------------------------------------- *----------------------------------------------------------------------------------------------- */
#define C8051F_EEPROM_C // #include "C8051F_EEPROM.H" #include "HEADER.H"
//------------------------------------------------------ // c8051f_eeprom_sector_earse //------------------------------------------------------ // // 扇区擦除 // px = 扇区任意有效地址,推荐使用首地址 // #if C8051F_EEPROM_SECTOR_EARSE_EN > 0 #pragma DISABLE_INTERRUPT void c8051f_eeprom_sector_earse(U8C *px) { PSCTL = 0x03; FLKEY = 0xA5; FLKEY = 0xF1; // ((U8X*)C8051F_EEPROM)[0] = 0; ((U8X*)px)[0] = ACC; PSCTL = 0; } #endif //------------------------------------------------------ // c8051f_eeprom_sector_check //------------------------------------------------------ // // 扇区擦除检查 // pc = 检查地址,必须是EEPROM的首地址 // #if C8051F_EEPROM_SECTOR_CHECK_EN > 0 U8 c8051f_eeprom_sector_check(U8C *pc) { /* U16 x;
// if(((U16)pc) % 512 != 0){ // 检查指针是否合法 // return C8051F_EEPROM_FALSE; // }
for(x=512; x; x--){ if(pc[0] != -1){ return C8051F_EEPROM_FALSE; } pc++; } return C8051F_EEPROM_TRUE; */
U8 x; U8 y;
for(x=512/128; x; x--){ for(y=128; y; y--){ if(pc[0] != -1){ return C8051F_EEPROM_FALSE; } pc++; } } return C8051F_EEPROM_TRUE;
/* U8 x; U8 y;
x = 512/256; do{ y = 0; do{ if(pc[0] != -1){ return C8051F_EEPROM_FALSE; } pc++; }while(--y != 0); }while(--x != 0);
return C8051F_EEPROM_TRUE; */ } #endif //------------------------------------------------------ // c8051f_eeprom_write //------------------------------------------------------ // // 字节写 // px = 目标指针 // x = 数据 // #if C8051F_EEPROM_WRITE_EN > 0 #pragma DISABLE_INTERRUPT void c8051f_eeprom_write(U8C *px, U8 x) { PSCTL = 0x01; FLKEY = 0xA5; FLKEY = 0xF1; ((U8X*)(px))[0] = x; PSCTL = 0; } #endif //------------------------------------------------------ // c8051f_eeprom_xwrite //------------------------------------------------------ // // 连续写 // x = 数量,注意最大255字节 // pi = 源指针 // px = 目标指针 // #if C8051F_EEPROM_XWRITE_EN > 0 #pragma DISABLE_INTERRUPT void c8051f_eeprom_xwrite(U8 x, U8I *pi, U8C *px) { if(!x) return;
PSCTL = 0x01; do{ FLKEY = 0xA5; FLKEY = 0xF1; ((U8X*)(px))[0] = pi[0], px++,pi++; }while(--x != 0);
/* PSCTL = 0x01; for(; x; x--){ FLKEY = 0xA5; FLKEY = 0xF1; ((U8X*)(px))[0] = pi[0]; px++,pi++; } */
PSCTL = 0; } #endif
//---------------------------------------------------- // @End //----------------------------------------------------
|