#include "pic18.h"
#include "pic18fxx22.h"
void delay(unsigned int i);
void com_init();
void Write_Cycle();
void Flash_Erase(unsigned long address);
void Flash_Write(unsigned long address,unsigned char *Data);
unsigned char data[64]=
{0x0E,0xEF,0x30,0xF0,0x0F,0x0E,0x00,0x01,0xFD,0x6F,0x51,0xD8,0x00,0x01,0x04,0x0E,0xFE,0x6F,0x29,0x0E,0xFF,0x6F,0x7D,0xD8,0x5A
,0xD8,0xC8,0x0E,0x00,0x01,0xFE,0x6F,0xFF,0x6B,0x77,0xD8,0x00,0x01,0xFD,0x07,0xFD,0x29,0xD8,0xB4,0x0C,0xEF,0x30,0xF0,0x48,0x0E
,0x7C,0xD8,0x49,0x0E,0x7A,0xD8,0x21,0x0E,0x78,0xD8,0x0D,0x0E,0x76,0xD8};
void main()
{
unsigned int i,j;
unsigned long addr=0x006000;
com_init();
delay(100);
Flash_Write(addr,&data[0]);
}
void com_init() //串口初始化
{
TRISC=TRISC|0X47; //RC0,RC1,RC2,RC7置1,设置为输入
TRISC=TRISC&0X47; //RC3,RC4,RC5,RC6置0,设置为输出
SYNC=0;
BRGH=1;
SPBRG1=16;
SPEN=1;
//GIE=1;
PEIE=1;
// PIR1=0x00; //清中断标志
TX1IE=1;
TX9=0;
TXEN=1;
RC1IE=1;
RX9=0;
CREN=1;
}
//void Send_Char(unsigned char data)
//{
//while(!TX1IF);
//TXREG1=data;
//delay(100);
//}
void delay(unsigned int i)
{
while(i--);
}
void Flash_Write(unsigned long address,unsigned char *P)//
{
unsigned char length;
Flash_Erase(address);
for(length=0;length<64;length++) //写64字节到RAM
{
//TABLAT=Data[length];
TABLAT=*P;
P++;
asm("TBLWT*+");
}
TBLPTRU=(address>>8)>>8; //要擦除\写入的首地址
TBLPTRH=address>>8;
TBLPTRL=address;
FREE=0; //只执行写操作
Write_Cycle();
}
void Flash_Erase(unsigned long address)
{
TBLPTRU=(address>>8)>>8;
TBLPTRH=address>>8;
TBLPTRL=address;
FREE=1; //1 在下一次WR写周期时,执行擦除操作;0 只执行写操作
Write_Cycle();
}
void Write_Cycle()
{
EEPGD=1;
CFGS=0;
WREN=1;
CARRY=0;
if(GIE) CARRY=1;
//IPEN=0; //禁止中断优先级
GIE=0; //关全局中断
EECON2=0X55;
EECON2=0XAA;
WR=1; //1启动读/写周期;0写周期完成
NOP();
NOP();
while(WR) ;//等待写周期完成
WREN=0;//0禁止向程序存储器或EEPROM写操作
if(CARRY) GIE=1;//IPEN=1,开中断
}