📄 flash.c
字号:
#include <c8051f020.h>
#include <flash.h>
#include <delay.h>
void write_protect_enable(bool flag)
{
unsigned char xdata *ad;
if(flag==0)
{
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x80;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x20;
Delay_ms(10);
}
else
{
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xa0;
}
}
void chip_erase(void)
{
unsigned char xdata *ad;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x80;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x10;
Delay_ms(50);
}
void bootblocklockout_enable(bool flag)
{
unsigned char xdata *ad;
if(flag==0)
{
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x80;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x40;
P4&=0xf0;
ad=0xc000;//
*ad=0x00;
Delay_ms(10);
}
else
{
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x80;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0xaa;
P4&=0xf2;
P4|=0x02;
ad=0xeaaa;
*ad=0x55;
P4&=0xf5;
P4|=0x05;
ad=0xd555;
*ad=0x40;
P4&=0xf3;
ad=0xffff;//
*ad=0xff;
Delay_ms(10);
}
}
void write_byte(unsigned char section,unsigned int addr, unsigned char dat)
{
unsigned char xdata *x;
/*
if(section>0x0f)
return ;
if(addr<0xc000)
return ;
*/
P4=section;
x=addr;
*x=dat;
}
void write_string(unsigned char section,unsigned int addr, unsigned char *dat_sta, unsigned char *dat_end)
{
// unsigned char i;
// i=0;
// while(i<6)
while(dat_sta<=dat_end)
{
write_byte(section,addr++,*dat_sta++);
if(addr==0x0000)
{
section++;
addr=0xc000;
if(section>15)
return;
}
// i++;
}
}
void write_page(unsigned char section,unsigned int addr, unsigned char *dat)
{
// unsigned char xdata *x;
unsigned char i;
/*
if(section>0x0f)
return ;
if(addr<0xc000)
return ;
// P4=section;
*/
i=0;
while(i<128)
{
/*
x=addr;
*x=*dat;
addr++;
dat++;
*/
write_byte(section,addr++,*dat++);
if(addr==0x0000)
{
section++;
addr=0xc000;
if(section>15)
return;
}
i++;
}
}
unsigned char read_byte(unsigned char section,unsigned int addr)
{
unsigned char xdata *x;
if(section>16)
return 0xff;
P4=section;
x=addr;
return *x;
}
void LCD_Disp_Flash_Word(unsigned char x,y,unsigned char xdata *p,unsigned char line,length)
{
R_BYTE i,j;
y+=(4<<line);
if (y>64)
y=64;
y=64-y;
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCD_Draw_byte(x+j,y+i*8, *p++);
}
void Disp_Flash_Word(unsigned char page,unsigned char local,unsigned char x,unsigned char y)
{
unsigned char i;
unsigned char section;
unsigned int addr;
unsigned long k;
unsigned long addrtemp;
unsigned char xdata diptemp[32];
k=1;
addrtemp=k*((page-16)*94+local-1)*32;
section=addrtemp/16384;
addr=addrtemp;
addr|=0xc000;
for(i=0;i<32;i++)
{
diptemp[i]=read_byte(section,addr++);
}
if(addr==0x0000)
{
section++;
addr=0xc000;
if(section>15)
return;
}
LCD_Disp_Flash_Word(x,y,diptemp,2,16);
}
void Disp_Flash_Word_n(unsigned char x,unsigned char y,unsigned char *pt)
{
unsigned char page;
unsigned char local;
while(*pt)
{
page=*pt-0xa0;
local=*(pt+1)-0xa0;
Disp_Flash_Word(page,local,x,y);
pt+=2;
x+=16;
if(x>127)
{
x=0;
y=y-16;
if(y<0)
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -