_segment(s_sector/256);
/*s_sector 是256的整数倍*/
XBYTE[addrbb]=cdat;
P14=0;P13=1;
addraa++;
addrbb++;
}
s_sector++;
delay(1000);
}
P14=0;P13=1;
EA=flaga;
}
/* 选择 29C040 段地址(高位地址),
seg 为段地址*/
void select_segment(unsigned char seg)
{
switch(seg) {
case 0: P1=0x00;_nop_(); break; /* 29c040 a18a17a16= 000 00000-0ffff */
case 1: P1=0x01;_nop_(); break; /* 29c040 a18a17a16= 001 10000-1ffff */
case 2: P1=0x02;_nop_(); break; /* 29c040 a18a17a16= 010 20000-2ffff */
case 3: P1=0x03;_nop_(); break; /* 29c040 a18a17a16= 011 30000-3ffff */
case 4: P1=0x04;_nop_(); break; /* 29c040 a18a17a16= 100 40000-4ffff */
case 5: P1=0x05;_nop_(); break; /* 29c040 a18a17a16= 101 50000-5ffff */
case 6: P1=0x06;_nop_(); break; /* 29c040 a18a17a16= 110 60000-6ffff */
case 7: P1=0x07;_nop_(); break; /* 29c040 a18a17a16= 111 70000-7ffff */
}
}
void protect()
{
select_segment(0);/*必须写到第0段*/
XBYTE[0x5555]=0xaa;
XBYTE[0x2aaa]=0x55;
XBYTE[0x5555]=0xa0;
P14=0;P13=1;
}
void delay(unsigned int l_time)/*写完一个扇区后延时*/
{
unsigned int data lp;/* 4ms */
for(lp=0;lp
_nop_(); }
main()
{
unsigned int data i;
P14=0;P13=1;
for(i=0;i256;i++)
{XBYTE[0x0200+i]=0x45;}
write_data(0x0200,0,1);
delay(1000);
while(1);
}
4 结束语
AT29C040在单片机中的应用不仅能使用户快速地实现所需功能,而且电擦除的方式为程序和数据的存储和更新提供了方便,随着闪速存储器器件朝着容量越来越大、工作电压越来越低、支持共同的接口标准的方向发展,闪速存储器硬件接口和软件设计将越来越容易。
参考文献:
[1] 孙涵芳,徐爱卿.MCS51/96系列单片机原理及应用[M].北京:北京航空航天大学出版社,1988.
[2] 余永权.ATMEL FLASH 单片机原理及应用[M].北京:电子工业出版社,1997.
[3] 窦振中. 单片机外围器件实用手册——存储器分册[M]. 北京:北京航空航天大学出版社,1998.
[4] AT29C040数据手册.www.atmel.com.
|