📄 x5045.c
字号:
/*-------------------------------------------------------
X5045源程序
--------------------------------------------------------*/
#include "regx52.h"
#include "x5045.h"
sbit SO=P2^5;
sbit SI=P2^4;
sbit SCK=P2^3;
//片选择信号定义
#define RAMCS 0x00
#define LCDCS1 0x01
#define LCDCS2 0x02
#define LCDCS3 0x03
#define EEPCS 0x04//DOGCS
#define ROMCS 0x05
#define KEYCS 0x06
#define NOSET 0x07
//25045可编程看门狗监控EEPROM指令集
#define WREN 0x06 //00000110 //设置写使能锁存器(允许写操作)
#define WRDI 0x04 //00000100 //复位写使能锁存器(禁止写操作)
#define RDSR 0x05 //00000101 //读状态寄存器
#define WRSR 0x01 //00000001 //写状态寄存器(块锁定)
#define READ 0x03 //00000011 //从开始于所选地址的存储器列阵中读出数据
#define WRTE 0x02 //00000010 //把数据写入开始于所选地址的存储器阵列中,1至4字节
extern void p1tune(unsigned char temp);
//#pragma save
//#pragma OT(8,size)
//写使能子程序
void wren_dog(void)
{
SCK=0;//
p1tune(EEPCS);//CS=0
Write8(WREN);//
SCK=0;//for debug
p1tune(RAMCS);//CS=1
}
/*
//写禁止子程序
void wrdi_dog(void)
{
unsigned char data i;
SCK=0;
p1tune(EEPCS);
i++;
Write8(WRDI);
SCK=0;
p1tune(RAMCS);
}
*/
//写状态寄存器
void wrsr_dog(unsigned char status_reg)
{
while(rdsr_dog()&0x01==1) ;
wren_dog();//使能“写”
p1tune(EEPCS);
Write8(WRSR);
Write8(status_reg);
p1tune(RAMCS);
wip_poll();
}
//读状态寄存器
unsigned char rdsr_dog(void)
{
// unsigned char com=0x05;//RDSR;
unsigned char data cTemp;
SCK=0;
p1tune(EEPCS);
Write8(RDSR);
cTemp=Read8();
SCK=0;
p1tune(RAMCS);
return(cTemp);
}
//字节读
unsigned char byte_read(bit HiHalf,unsigned char Addr)
{
unsigned char data EepromData,ReadInstruct=0x00;
//while(rdsr_dog()&0x01==1) {}
wren_dog();
SCK=0;
p1tune(EEPCS);
SO=1;
SI=1;
if(HiHalf)
ReadInstruct=0x08;
//
ReadInstruct|=READ;//READ;
Write8(ReadInstruct);
Write8(Addr);
EepromData=Read8();
SCK=0;
p1tune(RAMCS);
return(EepromData);
}
//字节写
void byte_write(bit HiHalf,unsigned char Addr,unsigned char Data)
{
unsigned char data WriteInstuct=0x00;
//while(rdsr_dog()&0x01==1) {}
wren_dog();
SCK=0;
p1tune(EEPCS);
//SO=1;
//SI=1;
if(HiHalf)
WriteInstuct=0x08;
WriteInstuct|=WRTE;//WRTE;
Write8(WriteInstuct);
Write8(Addr);
Write8(Data);
p1tune(RAMCS);
wip_poll();
}
//检验写操作是否结束。
unsigned char wip_poll(void)
{
unsigned int i;
unsigned char wip;
for(i=0x1ff;i>0;i--)
{
wip=rdsr_dog();
wip&=0x01;
if(wip==0) break;
}
return(wip);
}
//单字节指令或数据写入X25045
//在SI线上输入的数据在SCK的上升沿被锁存。
void Write8(unsigned char byt)
{
unsigned char data i;
for(i=0;i<8;i++)
{ if((byt&0x80)==0)//
SI=0;//
else//
SI=1;// //
SCK=0;
SCK=1;
byt=byt<<1;
}
}
//单字节数据从X25045读到单片机
//数据由SCK的下降沿输出到SO线上。
unsigned char Read8(void)
{
unsigned char i,j;
unsigned char byt;
bit bTemp;
for(i=0;i<8;i++)
{
SCK=1;
j++;
SCK=0;
bTemp=SO;
if(bTemp)
byt|=0x01;
if(i<7)
byt=byt<<1;
}
return (byt);
}
//#pragma restore
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -