?? 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"
/************************************************************************************/
/************************************************************************************
* 函數名稱:flash_write_protect;
*
* 函數功能描述:Flash寫保護函數;1:打開保護進行讀寫,0:進入保護狀態模式;
*
* 輸入參數:Flash寫保護開關;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_write_protect(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
}
/***********************************************************************************
* 函數名稱:flash_chip_erase;
*
* 函數功能描述:Flash芯片擦除程序;
*
* 輸入參數:none;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_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
}
/***********************************************************************************
* 函數名稱:flash_write_byte;
*
* 函數功能描述:Flash寫入字節函數程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_write_byte(unsigned long address, unsigned char dat)
{
unsigned char xdata *x;
unsigned int temp;
unsigned char sec;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
temp=address|0xc000;
sec=address>>14;
P4=sec;
x=temp;
*x=dat;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函數名稱:flash_write_byte_save;
*
* 函數功能描述:Flash寫入字節函數程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_write_byte_save(unsigned long address, unsigned char dat)
{
unsigned char xdata a[128];
unsigned int temp;
unsigned int t;
unsigned char sec;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
temp=address|0xc000;
sec=address>>14;
if(sec>15)
return ;
P4=sec;
t=(temp-0xc000)%128;
temp=temp-t;
flash_read_page(address,a);
a[t]=dat;
flash_write_page(address,a);
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函數名稱:flash_write_string;
*
* 函數功能描述:Flash寫入字符串函數程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據起始指針,unsigned char類型數據長度;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_write_string(unsigned long address, unsigned char *dat_sta, unsigned char count)
{
if(count>127)
return;
while(count--)
{
flash_write_byte(address++,*dat_sta++);
}
}
/***********************************************************************************
* 函數名稱:flash_write_page;
*
* 函數功能描述:Flash按頁寫入函數;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據起始指針;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_write_page(unsigned long address, unsigned char *dat)
{
unsigned char i;
i=0;
while(i<128)
{
flash_write_byte(address++,*dat++);
i++;
}
}
/***********************************************************************************
* 函數名稱:flash_write_block;
*
* 函數功能描述:Flash按塊寫入函數;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據起始指針;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_write_block(unsigned long address, unsigned char *dat)
{
unsigned char count;
unsigned int ct;
count=128;
ct=address%0x3fff;
address=address-ct;
while(count--)
{
flash_write_page(address, dat);
Delay_ms(10);
address+=128;
dat+=128;
}
}
/***********************************************************************************
* 函數名稱:flash_read_byte;
*
* 函數功能描述:Flash讀取字節函數程序;
*
* 輸入參數:unsigned long類型地址;
*
* 返回數據:unsigned char;
*
* 注意: none;
************************************************************************************/
unsigned char flash_read_byte(unsigned long address)
{
unsigned char xdata *x;
unsigned int temp;
unsigned char sec;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
temp=address|0xc000;
sec=address>>14;
if(sec>15)
return 0xff;
P4=sec;
x=temp;
return *x;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函數名稱:flash_read_page;
*
* 函數功能描述:Flash讀取頁函數程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據存儲起始地址指針;
*
* 返回數據:none;
*
* 注意: none;
************************************************************************************/
void flash_read_page(unsigned long address, unsigned char *buf)
{
unsigned char xdata *x;
unsigned char count=128;
unsigned int temp;
unsigned int t;
unsigned char sec;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_F; // set SFR page F
temp=address|0xc000;
sec=address>>14;
if(sec>15)
return ;
t=(temp-0xc000)%128;
temp=temp-t;
P4=sec;
x=temp;
while(count--)
{
*buf++=*x++;
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************/
// 文件結束
/***********************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -