📄 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 + -