两个程序可以合成一个! 选择为编译BOOT就行了。
CODE:
/************************************************************
文 件:main.c
用 途:定时炸弹main.c程序。
Target : M16
Crystal: 7.3728Mhz
说 明:编译时选择boot 1K
创 建:RAOSIBIN
修 改:古欣 2008-11-6
时 间:2008.9.18
************************************************************/
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h> //包含EEPROM头文件
#define PageByte 128 // 页大小,字节
#define NSHIFTPAGE 7 // 页偏移量
#define PAGENUMBER 112
void PageErasure(unsigned char page); // 擦除一页flash
void Erasure(unsigned int page); // 擦除flash
//void erase(void); // 执行擦除flash
const unsigned char a[]={1,2,4,5};
void erase(void)
{
unsigned char i;
PORTA = ~(1 << PA4); //使用次数到,指示
DDRA |= 1 << PA4;
/****************************
开始擦除代玛
*****************************/
for(i = 0 ; i < PAGENUMBER ; i ++)
{
PageErasure(i);
}
}
void PageErasure(unsigned char page)
{
unsigned int tmp; // 转换为完整的z指针
tmp = page;
tmp <<= NSHIFTPAGE;
Erasure(tmp); // 进行flash擦除
}
void Erasure(unsigned int page)
{
// 将页地址存入z指针
asm("movw r30,r16");
// 写入擦除指令
SPMCR = (1 << PGERS) | (1 << SPMEN);
asm("spm"); // 擦除操作
// 等待擦除完成
while(SPMCR & (1 << SPMEN))
{
;
}
}
#pragma abs_address:0x3000
void delay(void)
{
unsigned char x,y;
for(x=1;x!=0;x++)
{
for(y=1;y!=0;y++)
{;}
}
}
void main(void)
{
unsigned char temp;
PORTA = 0xFF;
DDRA = 0xFF; //A口输出,用于指示数值
delay(); //延时等待EEPROM稳定
delay();
temp = EEPROMread(0x02); //读出记录,如果没有写过,将会读得0xFF
PORTA =~temp; //显示记录
temp++;
EEPROMwrite(0x02,temp); //写入记录,写到地址0x01
if(temp>10)
//asm("jmp 0x3800");
erase();
while(1)
{;}
}
#pragma end_abs_address