PORT_Init();
Timer1_Init(); //定时器1,2,3初始化
Timer2_Init (SYSCLK_OUT/BAUDRATE/32);
UART0_Init ();
EIE2 |= 0x02; //允许ADC中断
IE|=0x10; //允许UART中断
EA = 1; //允许全局中断
TR1=1; //启动定时器1,LED动态显示
TR2=1; //启动定时器2,波特率发生器
flash_init();
flash_erase();
addl_flash=0;
count_page=0;
tempf=0x5A;
do{loopw();
}while(1);
}
延时函数,用的是11.0592M的晶振
void delayms(char ticks)
{
unsigned char count;
for (ticks=ticks; ticks> =0; ticks--)
{
for (count = 0; count <=13; count++)
{
}
}
}
flash初始化函数
void flash_init(void)
{
PRT1CF=0x00;
P1=0xff; //P1口输入总线
PRT2CF=0xff;
P2=0xff; //允许P2口输出
PRT3CF=0xff; //允许P3口输出
P3 &=0x7f; //LE=0
P3 |=0x78; //CE1,CE2,WE,OE=1
}
void select_sec(void)
{
switch(count_sec) //选择flash存储的段
{
case 0: P3 &=0xf8; break; /* 29c040 a18a17a16= 000 00000-0ffff */
case 1: P3 &=0xf9;P3 |=0x01; break; /* 29c040 a18a17a16= 001 10000-1ffff */
case 2: P3 &=0xfa;P3 |=0x02; break; /* 29c040 a18a17a16= 010 20000-2ffff */
case 3: P3 &=0xfb;P3 |=0x03; break; /* 29c040 a18a17a16= 011 30000-3ffff */
case 4: P3 &=0xfc;P3 |=0x04; break; /* 29c040 a18a17a16= 100 40000-4ffff */
case 5: P3 &=0xfd;P3 |=0x05; break; /* 29c040 a18a17a16= 101 50000-5ffff */
case 6: P3 &=0xfe;P3 |=0x06; break; /* 29c040 a18a17a16= 110 60000-6ffff */
case 7: P3 |=0x07; break; /* 29c040 a18a17a16= 111 70000-7ffff */
}
}
flash的察除函数
void flash_erase(void)
{
count_page=0x55;
addl_flash=0x55; //A0-A7低地址
tempf=0xAA;
flash1_w();
count_page=0x2A;
addl_flash=0xAA; //A0-A7低地址
tempf=0x55;
flash1_w();
count_page=0x55;
addl_flash=0x55; //A0-A7低地址
tempf=0x80;
flash1_w();
count_page=0x55;
addl_flash=0x55; //A0-A7低地址
tempf=0xAA;
flash1_w();
count_page=0x2A;
addl_flash=0xAA; //A0-A7低地址
tempf=0x55;
flash1_w();
count_page=0x55;
addl_flash=0x55; //A0-A7低地址
tempf=0x10;
flash1_w();
delayms(50);
}
flash的写读函数
void flash1_r(void)
{
CE1=0;
select_sec();
P2=count_page;//A8-A15高地址
PRT1CF=0x0ff; //允许D为输出
P1=addl_flash;
//A0-A7低地址
LE=1;
_nop_();
LE=0; //锁存地址
PRT1CF=0x00;//允许D为输入
P1=0x0ff;
OE=0; //P3&=0xf7//读选通
_nop_();
tempf=P1;
OE=1;//P3 |=0x08
CE1=1;//P3 |=0x20
}
//flash的写函数
void flash1_w(void)
{
CE1=0;
select_sec();
P2=count_page; //A8-A15高地址
PRT1CF=0xff; //允许D为输出
P1=addl_flash; //A0-A7低地址
LE=1;
_nop_();
LE=0; //锁存地址
P1=tempf;
WE=0; //锁存地址到flash
_nop_();
WE=1; //锁存数据到flash
PRT1CF=0x00;
P1=0xff; //允许D输入
CE1=1;
}
//***************************flash1存储**********************
void loopw(void)
{
bit data flage;
flage=EA;
EA=0;
flash1_w();
//loopr();
addl_flash++;
if (addl_flash==0)
{
delayms(10);
EA=flage;
addl_flash=0;
count_page=0;
loopr();
}
}
//***************************flash1串口发送**********************
void loopr(void)
{
flash1_r();
addl_flash++;
if(addl_flash!=0)
/* TI=0;
SBUF=tempf;
while(!TI);
TI=0;*/
{ tempt[addl_flash]=tempf;
loopr();}
else
{
count_page++;
if(count_page==0)
count_sec++;
}
if(count_sec> 7)
{
count_sec=0;
choose=1;
}
}
这个函数的主要目的是向W29C040中的一页写0x5A,然后再读出来,但我不知道是不是我的写函数有问题,因为读出来都是
FF,应该是没有写进去,那位大侠帮我看下,我不知道写芯片前要作些什么,不知道我的察除函数对不对啊???