📄 x5045.c
字号:
/* x5045的读写程序 用c51写的 */
#include <at89x51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sbit CS=P1^0; /*片选 */
sbit SO=P1^4; /*数据输出 */
sbit SK=P1^2; /* 时钟 */
sbit SI=P1^3; /* 数据输入*/
//uchar code WREN=0x06;
//uchar code WRDI=0x04;
//uchar code RDSR=0x05;
//uchar code WRSR=0x01;
//uchar code READ0=0x03;
//uchar code READ1=0x0b;
//uchar code WRITE0=0x02;
//uchar code WRITE1=0x0a;
//uchar code MAX_POLL=0x99;
/* Maximum number of polls*/
/*最大写过程时间,确定5045的最大的写入过程的时间*/
extern void clrdog(void);
extern void Write_e(uchar *p1,uint ADDR,uchar N);
extern void Read_e(uint ADDR,uchar *p1,uchar N);
extern uchar WriteSR(uchar cData);
void WRITE1B(uchar cData,uint cAddress);
uchar READ1B(uint cAddress);
uchar ReadSR();
void Write8(uchar cData);
uchar Read8(void);
void Wait_wstop(void);
void Write_e(uchar *p1,uint ADDR,uchar N)
{
uchar datat;
while(N)
{
datat=*p1;
WRITE1B(datat,ADDR);
p1++;
ADDR++;
N--;
}
}
void Read_e(uint ADDR,uchar *p1,uchar N)
{
while(N)
{
*p1=READ1B(ADDR);
p1++;
ADDR++;
N--;
}
}
void WRITE1B(uchar cData,uint cAddress)
/* 写入一个字节,cData为写入的数,cAddress为写入地址*/
{
CS=0;
Write8(0x06);
CS=1;
CS=0;
if(cAddress>=2048)
Write8(0x0a);
else
Write8(0x02);
Write8((uchar)(cAddress));
Write8(cData);
SK=0;
CS=1;
Wait_wstop();
}
uchar READ1B(uint cAddress)
/* 读入一个字节,cAddress为读入地址,bRegion为页 */
{
uchar cData;
CS=0;
if(cAddress>=2048)
Write8(0x0b);
else
Write8(0x03);
Write8((uchar)(cAddress));
cData=Read8();
CS=1;
return cData;
}
unsigned char Read8()
{
bit bData;
uchar cLoop;
uchar cData;
for(cLoop=0;cLoop<8;cLoop++)
{
SK=1;
SK=0;
bData=SO;
cData<<=1;
if(bData)
{
cData|=0x01;
}
}
return cData;
}
void Write8(uchar cData)
{
uchar cLoop;
for(cLoop=0;cLoop<8;cLoop++)
{
if((cData&0x80)==0)
{
SI=0;
}
else
{
SI=1;
}
SK=0;
SK=1;
cData<<=1;
}
}
uchar ReadSR()
{
uchar cData;
CS=0;
Write8(0x05);
cData=Read8();
CS=1;
return cData;
}
uchar WriteSR(uchar cData)
{
uchar cTemp;
cTemp=ReadSR();
if((cTemp&0x01)==1)
return 0;
CS=0;
Write8(0x06);
CS=1;
CS=0;
Write8(0x01);
Write8(cData);
CS=1;
return 1;
}
/*检测写入的过程是否结束*/
void Wait_wstop(void)
{
uchar aa,my_flag;
for (aa=1;aa<=0x99;aa++)
{
my_flag=ReadSR();
if ((my_flag&0x01)==0)
aa=0x99;/*判断是否WIP=0,即判断是否写入过程已经结束,若结束就跳出,否则继续等待直到达到最大记数值*/
}
}
void clrdog(void)
{
CS=0;
CS=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -