📄 flash.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: flash.C
* 文件标识: none
* 适用器件: w29c020
*
* 摘 要: 本文件是字库(GB2312)读写子程序;使用外部22.1184MHz晶振.
*
* 当前版本:1.2
* 作 者:张宁强
* 完成日期:2006年1月10日
*
* 历史版本:1.0
* 原作者 : 李林利 卢阳
* 完成日期:2005年6月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051f040.h"
#include "flash.h"
#include "delay.h"
/************************************************************************************/
/***********************************************************************************
* 函数名称:write_protect_enable;
*
* 函数功能描述:Flash写保护函数;1:打开保护进行读写,0:进入保护状态模式;
*
* 输入参数:Flash写保护开关;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void write_protect_enable(bool flag)
{
unsigned char xdata *ad;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
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;
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:chip_erase;
*
* 函数功能描述:Flash芯片擦除程序;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void chip_erase(void)
{
unsigned char xdata *ad;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
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);
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:bootblocklockout_enable;
*
* 函数功能描述:导入块停止使能函数程序;
*
* 输入参数:导入块停止使能标志;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void bootblocklockout_enable(bool flag)
{
unsigned char xdata *ad;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
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);
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:write_byte;
*
* 函数功能描述:Flash写入字节函数程序;
*
* 输入参数:;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void write_byte(unsigned char section,unsigned int addr, unsigned char dat)
{
unsigned char xdata *x;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
P4=section;
x=addr;
*x=dat;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:write_string;
*
* 函数功能描述:Flash写入字符串函数程序;
*
* 输入参数:;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void write_string(unsigned char section,unsigned int addr, unsigned char *dat_sta, unsigned char *dat_end)
{
while(dat_sta<=dat_end)
{
write_byte(section,addr++,*dat_sta++);
if(addr==0x0000)
{
section++;
addr=0xc000;
if(section>15)
return;
}
}
}
/***********************************************************************************
* 函数名称:write_page;
*
* 函数功能描述:Flash按页写入函数;
*
* 输入参数:;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void write_page(unsigned char section,unsigned int addr, unsigned char *dat)
{
unsigned char i;
i=0;
while(i<128)
{
write_byte(section,addr++,*dat++);
if(addr==0x0000)
{
section++;
addr=0xc000;
if(section>15)
return;
}
i++;
}
}
/***********************************************************************************
* 函数名称:read_byte;
*
* 函数功能描述:Flash读取字节函数程序;
*
* 输入参数:;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
unsigned char read_byte(unsigned char section,unsigned int addr)
{
unsigned char xdata *x;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
if(section>16)
return 0xff;
P4=section;
x=addr;
return *x;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -