⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x5045.c

📁 X5045的读写应用程序
💻 C
字号:
#include <AT89x051.H>
#include <intrins.H>
#include <stdio.h>

//引脚定义,可以自行定义使用
#define CS	P3_7
#define SO	P1_3
#define SI	P1_5
#define	SCK	P3_0

void RESWDI(void);
void WIPCHK(void);
unsigned char INPUTByte(void);
void OUTByte(unsigned char Byte);
unsigned char ReadReg(void);
void WriteReg(unsigned char Byte);
void WriteByte(unsigned char Byte, unsigned char ADD);
unsigned char ReadByte(unsigned  char ADD);

char code dx516[3] _at_ 0x003b;
void main(void)
{
	unsigned char Temp;

	CS = 0;
	SCK = 1;
	SI = 1;
	SO = 1;

	WriteByte(0x00,0x00); 	 
	Temp = ReadByte(0x00);
	WriteByte(0x00,0x01); 	 
	Temp = ReadByte(0x01);
	WriteByte(0x20,0x02); 	 
	Temp = ReadByte(0x02);
	WriteByte(0x00,0x03); 	 
	Temp = ReadByte(0x03);
	WriteByte(0x00,0x04); 	 
	Temp = ReadByte(0x04);
	WriteByte(0x00,0x05); 	 
	Temp = ReadByte(0x05);
	WriteByte(0x0F,0x06); 	 
	Temp = ReadByte(0x06);
	WriteByte(0xA0,0x07); 	 
	Temp = ReadByte(0x07);
	WriteByte(0x01,0x08); 	 
	Temp = ReadByte(0x08);
	WriteByte(0x01,0x09); 	 
	Temp = ReadByte(0x09);

	EA = 1;					//允许CPU中断
	ET0 = 1; 				//定时器0中断打开
	TMOD = 0x1;			//设定时器0为模式1,16位模式
	TH0 = 0xB1;
	TL0 = 0xE1;			//设定时值为20000us(20ms)调整
	TR0 = 1;				//开始定时

	while(1);
}

//定时中断
void KeyAndDis_Time0(void) interrupt 1
{
//	unsigned char data Temp, TempV, TempN;

	TR0 = 0;
	TH0 = 0xB2;
	TL0 = 0x06; //设定时值(己调整)

	RESWDI(); //喂狗

	TR0 = 1;
}

//---------------------------------
//x5045子程序
//---------------------------------
void RESWDI(void) //复位看门狗(喂狗)
{
 CS = 0;
 CS = 1;
}
void WIPCHK(void) //检查WIP位,判断是否写入完成
{
	unsigned char Temp;
	unsigned int TempCyc;
	
	for(TempCyc=0;TempCyc<0xFFFF;TempCyc++)
		{
			Temp = ReadReg(); //读状态寄存器
			Temp = Temp&0x01;
			if (!Temp)
				TempCyc = 0xFFFE;
		}
} 
void OUTByte(unsigned char Byte) //输出一个定节
{
	unsigned char TempCyc;

	for(TempCyc=0;TempCyc<8;TempCyc++)
		{
			SCK = 0;
			SI = Byte & 0x80;
			Byte = Byte<<1; //右移				 -+
			SCK = 1;
		}
//	SI=0; //使SI处于确定的状态
} 
unsigned char INPUTByte(void) //输入一个字节
{
	unsigned char Temp=0, TempCyc;
	
	SCK=1;
	for(TempCyc=0;TempCyc<8;TempCyc++)
		{
			SO=1;
			SCK = 0;
			if (SO) 
				Temp = Temp|0x01; //SO为1,则最低位为1
			if(TempCyc<7)
				Temp = Temp<<1; //右移
			SCK = 1;
		}
	return Temp;
}

unsigned char ReadReg(void) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
{
	unsigned char Temp;

	SCK=0;
	CS=0;
	OUTByte(0x05); //发送05H读状态寄存器命令字
	Temp = INPUTByte(); //读状态寄存器值
 	CS=1; 
	SCK=1;
	return Temp;
}
void WriteReg(unsigned char Byte) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
{
	SCK=0;
	CS=0;
	OUTByte(0X06);
	CS=1;
	CS=0;
	OUTByte(0x01); //发送01H 
	OUTByte(Byte); //发送
	CS=1;
	SCK=1;
	WIPCHK(); //判断是否写入
}
unsigned char ReadByte(unsigned  char ADD) //读地址中的数据这里不做先导字处理,只能读00-FFH
{
	unsigned char Temp;

	SCK=0;
	CS=0;
	OUTByte(0x3); //发送读指令03H 如要支持000-FFF则要把高位地址左移3位再为03H相或
	OUTByte(ADD); //发送低位地址
	Temp = INPUTByte();
	CS=1;
	SCK=1;
	
	return Temp;
}
void WriteByte(unsigned char Byte, unsigned char ADD) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
{
	SCK=0;
	CS=0;
	OUTByte(0X06);
	CS=1;
	CS=0;
	OUTByte(0x2); //发送写指令02H 如要支持000-FFF则要把高位地址左移2位再为02H相或
	OUTByte(ADD); //发送低位地址
	OUTByte(Byte); //发送数据
	CS=1;
	SCK=1;
	WIPCHK(); //判断是否写入
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -