📄 up51s011.c
字号:
/*******************************************************************************
* *
* File : uP51s011.C *
* Date : 2004-9-5 *
* Version : 1.0 *
* *
* Author : kevin kevin@dz51.com *
* Company : Http://www.dz51.com *
* *
********************************************************************************
* Descriptoon: *
* X5045读写演示程序(J3短路2-3脚) *
* *
* 程序运行首先把字节0x11H到x5045地址55H (字节写入),然后读出地址55H *
* 的数据送给P0口,可以看到P0口8个发光管对应的数据。 *
* (LD8---LD1分别对应0B00010001,0x11H) *
* *
* 然后进行页写入0X22H/0X33H/0X44H到X5045的地址0X1F0/1/2H,然后读出送P0口 *
* *
* 注意:由于读写X5045的I/O口和编程芯片的I/O口是复用的,所以实验本程序的时候不 *
* 要读器件,否则只能下次上电程序读写X5045才能够正常!!! *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
sbit CS = P1^2;
sbit SCK = P1^3;
sbit SI = P1^4;
sbit SO = P1^5;
#define WREN_INST 0x06 // 写入使能指令(WREN)
#define WRDI_INST 0x04 // 写入禁止指令(WRDI)
#define WRSR_INST 0x01 // 写入状态寄存器指令(WRSR)
#define RDSR_INST 0x05 // 读取状态寄存器指令(RDSR)
#define WRITE_INST 0x02 // 写入存储器指令(WRITE)
#define READ_INST 0x03 // 读取存储器指令(READ)
#define BYTE_ADDR 0x55 // 字节模式写入地址
#define BYTE_DATA 0x11 // 字节模式写入数据
#define PAGE_ADDR 0x1F0 // 页写入模式地址
#define PAGE_DATA1 0x22 // 页模式写入第一个数据
#define PAGE_DATA2 0x33 // 页模式写入第二个数据
#define PAGE_DATA3 0x44 // 页模式写入第三个数据
#define STATUS_REG 0x00 // 要写入到状态寄存器的值
#define MAX_POLL 0x99 // 最在查询次数m number of polls
void wren_cmd();
void wrsr_cmd();
void wren_cmd();
void wrdi_cmd();
void byte_write();
unsigned char byte_read();
void page_write();
unsigned char sequ_read();
void rst_wdog();
void outbyt(unsigned char write_data);
unsigned char inbyt();
void wip_poll();
void delay();
//********************************************************************************************
main()
{
unsigned char temp=0;
EA = 0; //
SO = 1;
SI = 1;
SCK = 0;
CS = 1;
//------------
wren_cmd(); // 使能写入
wrsr_cmd(); // 写入00H到状态寄存器
wren_cmd(); // 使能写入
byte_write(); // 写入11H到地址55H (字节写入)
temp=byte_read();// 读取地址55H处的数据(字节读取)
P0=temp;
delay(); //延时
wren_cmd(); // 使能写入
page_write(); // 页写入22H/33H/44H到地址1F0/1/2H
temp=sequ_read(); // 连续读取地址1F0/1/2H
P0=temp;
delay();//延时
rst_wdog(); // 清除看门狗
wrdi_cmd();
temp=0xa5;
P0=temp;
CS = 1;
while(1);
}
//********************************************************************************************
//* 写入使能指令
//* 传入参数: 无
//* 返回值: 无
void wren_cmd()
{
SCK = 0;
CS = 0;
outbyt(WREN_INST); // 传送写入使能指令
SCK = 0;
CS = 1;
}
//********************************************************************************************
//* 写入禁止指令
//* 传入参数: 无
//* 返回值: 无
void wrdi_cmd()
{
SCK = 0;
CS = 0;
outbyt(WRDI_INST); // 传送写入禁止指令
SCK = 0;
CS = 1;
}
//********************************************************************************************
//* 写入数据到状态寄存器
//* 传入参数: 无
//* 返回值: 无
void wrsr_cmd()
{
SCK = 0;
CS = 0;
outbyt(WRSR_INST); // 传送状态寄存器写入指令
outbyt(STATUS_REG); // 传送要写入的数据
SCK = 0;
CS = 1;
wip_poll(); // 检测写入进度
}
//********************************************************************************************
//* 读取状态寄存器
//* 传入参数: 无
//* 返回值: 状态寄存器值
unsigned char rdsr_cmd()
{
unsigned char status;
SCK = 0;
CS = 0;
outbyt(RDSR_INST); // 传送状态寄存器读取指令
status = inbyt(); // 读取状态寄存器
SCK = 0;
CS = 1;
return status;
}
//********************************************************************************************
//* 单一字节写入
//* 传入参数: 无
//* 返回值: 无
void byte_write()
{
unsigned int addr;
addr = BYTE_ADDR; // 设置要写入的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(WRITE_INST | 0x08); //传送写入指令和地址最高位"1"
}
else
{
outbyt(WRITE_INST); // 传送写入指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
outbyt(BYTE_DATA); // 传送数据字节
SCK = 0;
CS = 1;
wip_poll(); // 检测写入进度
}
//********************************************************************************************
//* 单一字节读取
//* 传入参数: 无
//* 返回值: 读取的字节
unsigned char byte_read()
{
unsigned int addr;
unsigned char read_data;
addr = BYTE_ADDR; // 设置要读取的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(READ_INST | 0x08);// 传送读取指令和地址最高位"1"
}
else
{
outbyt(READ_INST); // 传送读取指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
read_data = inbyt(); // 读取字节
SCK = 0;
CS = 1;
return read_data;
}
//********************************************************************************************
//* 页写入
//* 传入参数: 无
//* 返回值: 无
void page_write()
{
unsigned int addr;
addr = PAGE_ADDR; // 设置要写入的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(WRITE_INST | 0x08); //传送写入指令和地址最高位"1"
}
else
{
outbyt(WRITE_INST); // 传送写入指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
outbyt(PAGE_DATA1); // 传送第一个字节数据
outbyt(PAGE_DATA2); // 传送第二个字节数据
outbyt(PAGE_DATA3); // 传送第三个字节数据
SCK = 0;
CS = 1;
wip_poll(); // 检测写入进度
}
//********************************************************************************************
//* 连续读取3个字节
//* 传入参数: 无
//* 返回值: 最后一次读取的字节
unsigned char sequ_read()
{
unsigned int addr;
unsigned char read_data;
addr = PAGE_ADDR; // 设置第一个字节的地址
SCK = 0;
CS = 0;
if(addr & 0x100)
{
outbyt(READ_INST | 0x08); //传送读取指令和地址最高位"1"
}
else
{
outbyt(READ_INST); // 传送读取指令和地址最高位"0"
}
outbyt((unsigned char)addr); // 传送地址低字节
inbyt(); // 读取第一个字节
inbyt(); // 读取第二个字节
read_data = inbyt(); // 读取第三个字节
SCK = 0;
CS = 1;
return read_data;
}
//********************************************************************************************
//* 复位看门狗定时器
//* 传入参数: 无
//* 返回值: 无
void rst_wdog()
{
CS = 0;
_nop_();
_nop_();
CS = 1;
}
//********************************************************************************************
//* 写入进度查询
//* 传入参数: 无
//* 返回值: 无
void wip_poll()
{
unsigned char i; // 设置最大的查询次数
//// 如果WIP位为'1'并且未达到最大查询次数, 则继续查询
//// 如果WIP位为'0', 则写入周期完成, 返回
for(i = 0; i < MAX_POLL; i++)
{
if(rdsr_cmd() & 0x01) // 读取状态寄存器
{
continue;
}
return;
}
}
//********************************************************************************************
//* 传送字节数据到EEPROM, 高位在前
//* 传入参数: write_data --- 要传送的字节
//* 返回值: 无
void outbyt(unsigned char write_data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SCK = 0;
SI = (bit)(write_data & 0x80); //传送一个位到SI
write_data <<= 1;
SCK = 1;
}
SI = 0;
}
//********************************************************************************************
//* 从EEPROM接收数据, 高位在前
//* 传入参数: 无
//* 返回值: A --- 接收到的字节
unsigned char inbyt()
{
unsigned char i;
unsigned char read_data;
for(i = 0; i < 8; i++)
{
SCK = 0;
read_data <<= 1;
SCK = 1;
read_data |= (unsigned char)SO;
}
return read_data;
}//********************************************************************************************
void delay()
{
unsigned int i,j;
for(i=0;i<200;i++)
for(j=0;j<1000;j++)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -