📄 flash.c
字号:
#include "all.h"
data unsigned char xdata *pwrite; // 程序存储器空间的指针(FLASH),指向待写地址
data unsigned char code *pread; // 程序存储器空间的指针(FLASH),指向待读地址
unsigned char code Cwf_ptotect[512] _at_ 0x8000;
unsigned char code CanKaoBase[20]="8df3g4g6fjkqw0";
unsigned char idata Cwf_ok[20]="1234567890abc"; //维数不能屐,因为其它地方也要改动
data unsigned char *pgen; // 一般指针
idata char test; // 测试字符
//将一个CODE数组的内容移动到另一个CODE数组
//okkk =1: 会让两数组相同 okkk =0: 会让两数组不相同
void ERASE_Flash(uchar okkk) { //okkk =1: 会让两数组相同 okkk =0: 会让两数组不相同
data uchar CCtt;
EA=0;
if(okkk==1)
strcpy(Cwf_ok,CanKaoBase); //okkk =1: 会让两数组相同
else
strcpy(Cwf_ok,"CanKaoBase"); //okkk =0: 会让两数组不相同
// 禁止看门狗定时器
WDTCN = 0xde;
WDTCN = 0xad;
// 擦除512字节的信息页(位于0x8000)
FLSCL = 0x41; // 置位FLWE(FLSCL.0),以允许由用户软件写/擦除FLASH。
//置位PSEE(PSCTL.1),以允许FLASH 扇区擦除。
//置位PSWE(PSCTL.0),以允许FLASH 写。
PSCTL = 0x03; // 将PSWE和PSEE置‘1’(MOVX指令对应 // 的FLASH页
pwrite = 0x8000; // 将指针指向待擦除页
*pwrite = 0; // 启动擦除过程
// for(ttty=0;ttty<60000;ttty++) ; for(ttty=0;ttty<60000;ttty++) ;
PSCTL = 0x01; // 清除PSEE,PSWE仍然置1
// LKPB加密
#if(Is_JiaMi==1)
pwrite = 0xFDFE; // LKPB加密
*pwrite++=0;
*pwrite=0;
#endif
// LKPB加密
// MOVX指令将写到对应的地址
// 现在我们要拷贝字符串 <test_string> 的内容到FLASH页,从地址0x8000开始。
// CCtt=0;
pwrite = 0x8000; // 将指针指向待擦除页
pgen = Cwf_ok; // pgen 指向源字符串
do {
*pwrite++ = *pgen++; // 拷贝字节
} while (*pgen!=0); // 直到NULL结束符
*pwrite = NULL; // 用NULL结束目的字符串
PSCTL = 0; // 禁止FLASH写
FLSCL = 0x00; // 禁止FLASH写
// 现在我们读写入的字符串
pread = 0x8000; // 初始化CODE读指针为字符串起始地址
test = 0x5a;
CCtt=0;
do {
test = *pread++;
Cwf_ok[CCtt++]=test;
if(CCtt>19) break;
} while (*pread!=0);
Cwf_ok[CCtt]=0;
CLR_WDG ;
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -