?? w29c040讀寫程序.txt
字號(hào):
W29C040(512K FLASH)讀寫程序2007-09-10 11:16很是激動(dòng),去年用AT89S52搗弄了半年也沒(méi)搞定,這次換成C8051f040,也不知道是天見我可憐還是狗運(yùn),終于把數(shù)據(jù)寫進(jìn)去了。想當(dāng)時(shí)到處找的程序都沒(méi)用,郁悶非常,這次走運(yùn)成功,拿出來(lái)曬曬太陽(yáng)(雖然也是該的別人的程序,但是好歹能用)。
/*W29C040(512K FLASH)讀寫程序*/
#include <c8051f040.h>
#include <INTRINS.h>
#include <absacc.h>
sbit E=P1^0;
sbit RW=P1^1;
sbit RS=P1^2;
sbit A16=P4^0;//高地址16讀寫,推拉式
sbit A17=P4^1;//高地址17讀寫,推拉式
sbit A18=P4^2;//高地址18讀寫,推拉式
sbit CS=P4^4;//片選,低電平有效,推拉式
//C8051F040有兩套外部存儲(chǔ)器接口,為了方便,這里用第二套,且不用分時(shí)復(fù)用
sbit WR=P4^7
sbit RD=P4^6;
sbit Button=P3^7;
//P7 數(shù)據(jù)寫推拉式,數(shù)據(jù)讀漏極開路
//P6 低地址讀寫,推拉式
//P5 高地址讀寫,推拉式
//256B數(shù)組
unsigned int xdata Data[256]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
void Delay(unsigned int l_time);
void protect();
void erase();
void read();
void select_segment(unsigned char seg);
/***********************************************************************************/
void Reset_Sources_Init()//禁止看門狗
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
void EMI_Init()//設(shè)置EMI,WR=P4^7,RD=P4^6;P7 數(shù)據(jù)讀寫,P6 低地址讀寫,P5 高地址讀寫
{
SFRPAGE = EMI0_PAGE;
EMI0CF = 0x37;
}
void Port_IO_Init()//端口狀態(tài)設(shè)置,推拉——漏極
{
SFRPAGE = CONFIG_PAGE;
P4MDOUT = 0xD0;
P5MDOUT = 0xFF;
P6MDOUT = 0xFF;
P7MDOUT = 0xFF;
XBR2 = 0x40;
}
void Init_Device(void)//初始化
{
Reset_Sources_Init();
EMI_Init();
Port_IO_Init();
}
/***********************************************************************************/
void SendCommandByte(unsigned char ch)//液晶1602寫控制命令
{
RS=0;
RW=0;
P2=ch;
E=1;
Delay(10);
E=0;
Delay(100);
}
void SendDataByte(unsigned char ch)//液晶1602寫數(shù)據(jù)
{ RS=1;
RW=0;
P2=ch;
E=1;
Delay(10);
E=0;
Delay(100);
}
void InitLcd()//液晶1602初始化
{
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x38); //設(shè)置工作方式
SendCommandByte(0x0c); //顯示狀態(tài)設(shè)置
SendCommandByte(0x01); //清屏
SendCommandByte(0x06); //輸入方式設(shè)置
}
void DisplayMsg1(unsigned char *p)//顯示第一行
{
unsigned char count;
SendCommandByte(0x80); //設(shè)置DDRAM地址
Delay(2000);//根據(jù)單片機(jī)頻率設(shè)置延時(shí),以免液晶未準(zhǔn)備好導(dǎo)致字符顯示不完全
for(count=0;count<16;count++)
{
SendDataByte(*p++);
}
}
void DisplayMsg2(unsigned char *p)//顯示第二行
{
unsigned char count;
SendCommandByte(0xc0); //設(shè)置DDRAM地址
Delay(2000);
for(count=0;count<16;count++)
{
SendDataByte(*p++);
}
}
/***********************************************************************************/
void write_data(unsigned int m_addr,unsigned int s_sector,unsigned int acount) //寫數(shù)據(jù)
{
unsigned int data addraa; /* addraa 為內(nèi)存地址,addrbb 為29C040地址 */
unsigned int data i,j;
bit flag;
addraa=m_addr;
for(j=acount;j>0;j--)
{
protect(); //接觸保護(hù) ?
CS=0;
select_segment(s_sector/256); /*s_sector 是256的整數(shù)倍*/
for(i=0;i<256;i++,addraa++)
{
XBYTE[addraa]=Data[i]; //高位
}
/*翻轉(zhuǎn)位判斷寫入完成
--addraa;
ACC=Data[addraa];
flag=ACC^7;
while(1)
{
ACC=XBYTE[addraa];
if(ACC^7==flag) break;
flag=ACC^7;
}
*/
//延時(shí)等待寫入完成
for(i=0;i<2;i++)
{
Delay(65535);
}
CS=1;
s_sector++;
}
}
/* 選擇 29C040 段地址(高位地址),seg 為段地址*/
void select_segment(unsigned char seg)
{
P4&=0xf8;
switch(seg)
{
case 0: P4|=0x00; break; // 29c040 a18a17a16= 000 00000-0ffff
case 1: P4|=0x01; break; // 29c040 a18a17a16= 001 10000-1ffff
case 2: P4|=0x02; break; // 29c040 a18a17a16= 010 20000-2ffff
case 3: P4|=0x03; break; // 29c040 a18a17a16= 011 30000-3ffff
case 4: P4|=0x04; break; // 29c040 a18a17a16= 100 40000-4ffff
case 5: P4|=0x05; break; // 29c040 a18a17a16= 101 50000-5ffff
case 6: P4|=0x06; break; // 29c040 a18a17a16= 110 60000-6ffff
case 7: P4|=0x07; break; // 29c040 a18a17a16= 111 70000-7ffff
}
}
void protect() //解除保護(hù)?
{
select_segment(0);/*必須寫到第0段*/
XBYTE[0x5555]=0xaa;
XBYTE[0x2aaa]=0x55;
XBYTE[0x5555]=0xa0;
}
void erase()//整片擦除
{
unsigned char i;
select_segment(0);/*必須寫到第0段*/
CS=0;
XBYTE[0x5555]=0xaa;
XBYTE[0x2aaa]=0x55;
XBYTE[0x5555]=0x80;
XBYTE[0x5555]=0xAA;
XBYTE[0x2AAA]=0x55;
XBYTE[0x5555]=0x10;
CS=1;
for(i=0;i<6;i++)
{
Delay(65535);
}
_nop_();
}
void Read(unsigned int r_addr)//讀數(shù)據(jù)
{
unsigned char ch1[16]="addr 0x ";
unsigned char ch2[16]="data 0x ";
unsigned char i;
unsigned int Data;
//讀數(shù)據(jù),P7為漏極開路
SFRPAGE = CONFIG_PAGE;
P4MDOUT = 0xD0;
P5MDOUT = 0xFF;
P6MDOUT = 0xFF;
XBR2 = 0x40;
CS=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Data=XBYTE[r_addr];
CS=1;
/***********************************************/
//轉(zhuǎn)化為可顯示ASCII字符
ch2[8]=Data%0x10+0x30;
ch2[7]=Data/0x10%0x10+0x30;
for(i=7;i<9;i++)
{
if(ch2[i]>0x39) ch2[i]+=0x7;
}
ch1[10]=r_addr%0x10+0x30;
ch1[9]=r_addr/0x10%0x10+0x30;
ch1[8]=r_addr/0x100%0x10+0x30;
ch1[7]=r_addr/0x1000%0x10+0x30;
for(i=7;i<11;i++)
{
if(ch1[i]>0x39) ch1[i]+=0x7;
}
/**********************************************/
SendCommandByte(0x01); //清屏
DisplayMsg1(ch1);
DisplayMsg2(ch2);
}
void Delay(unsigned int l_time)/*寫完一個(gè)扇區(qū)后延時(shí)*/
{
unsigned int data lp;
for(lp=0;lp<l_time;lp++)
{;}
}
main()
{
unsigned char xdata msg1[16]="0123456789ABCDEF";
unsigned char xdata msg2[16]="....READY,GO!...";
unsigned int i;
Init_Device();
InitLcd();
DisplayMsg1(msg1);
DisplayMsg2(msg2);
erase();
write_data(0x2000,0,1);
for(i=0x2000;i<0x2100;i++)
{
Read(i);
while(1)//添加一個(gè)按鈕,按一下地址自加一,并顯示地址和讀出的數(shù)據(jù)
{
if(Button==0)
{
while(Button==0){;}
break;
}
}
}
while(1);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -