📄 x4045.c
字号:
/*
x5045接口程序
*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// IO口定义
sbit SDI = P3^0; //X5045的数据输入线
sbit SDO = P3^1; //X5045的数据输出线
sbit CSWDT = P3^2; //X5045的片选和看门狗
sbit SCLK = P3^3; //X5045的时钟线
void clrwdt() //清看门狗
{
CSWDT=0;
CSWDT=1;
}
void wr1byte5045(uchar indata) // 向5045写入1字节(MSB在前,即左移)
{ //in:indata-数据
uchar xi;
for(xi = 0; xi < 8; xi++)
{ SCLK = 0;
if(indata & 0x80) SDI = 1;
else SDI = 0;
indata = indata << 1;
SCLK = 1;
}
}
uchar rd1byte5045() //从5045的当前地址读1字节
{
uchar xi,xad = 0;
SDO = 1;
for(xi = 0; xi < 8; xi++)
{ SCLK = 1;
xad = xad * 2;
SCLK = 0;
if(SDO) xad++;
}
return xad;
}
void write_WREN5045() //写使能命令(06h)
{ CSWDT = 0;
wr1byte5045(0x06);
SCLK = 0;
clrwdt();
}
void write_WRDI5045()//关闭写使能命令(04h)
{ CSWDT = 0;
wr1byte5045(0x04);
SCLK = 0;
clrwdt();
}
uchar read_status5045() //读5045状态寄存器(05h)
{ uchar xd;
CSWDT = 0;
wr1byte5045(0x05);
xd = rd1byte5045();
clrwdt();
return xd;
}
void write_status5045(uchar indata)//写5045状态寄存器(01h)
// ;in:indata-写入状态寄存器的数据
{ write_WREN5045();
CSWDT = 0;
wr1byte5045(0x01);
wr1byte5045(indata);
clrwdt();
}
void read5045(uint addr,uchar len,uchar *p) //读取5045的flash数据区的数据
//;in: addr-数据地址,范围为0x00~0x1ff
// len -读取的数据长度
//out: *p - 读出数据的地址指针
{ uchar xi;
CSWDT = 0;
wr1byte5045(((addr >> 5) & 0x08) | 0x03); //地址高1位(bit3)与读命令(0x03)合为一字节
wr1byte5045(addr & 0xff); //地址低8位
for(xi = 0; xi < len; xi++)
{p[xi] = rd1byte5045();}
CSWDT = 1;
}
void write5045(uchar addr,uchar len,uchar *p) //写一组数据到5045的数据区,一次最多写入16字节(1页))
//;in: addr-数据地址,范围为0x00~0x1ff
// len -读取的数据长度
// *p - 数据组
{uchar xi;
if(len > 16) len = 16;
write_WREN5045();
CSWDT = 0;
wr1byte5045(((addr >> 5) & 0x08) | 0x02); //地址高1位(bit3)与写命令(0x02)合为一字节
wr1byte5045(addr & 0xff); //地址低8位
for(xi = 0; xi < len; xi++) wr1byte5045(p[xi]);
SCLK = 0;
clrwdt();
write_WRDI5045();
delay_n(0x4000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -