📄 romsore.c
字号:
#include<reg52.h>
//第一片eeprom的地址为0000~1fff,64kbit,8kbyte,256page,1page=32byte
//在外部RAM中设定两个数据存储区,DATA_STORE[]为发到rom中的数 ,DATA_RECE[]为rom中取出的数
//commend
#define EEROM_READ 0x03//Read data from memory array beginning at selected address
#define EEROM_WRITE 0x02//Write data to memory array beginning at selected address
#define EEROM_WREN 0x06//Set the write enable latch (enable write operations)
#define EEROM_WRDI 0x04//Reset the write enable latch (disable write operations)
#define EEROM_RDSR 0x05//Read status register
#define EEROM_WRSR 0x01//Write status register
#define STATUS_REG 0x00
///////////////////////////////////////////////////////////////////////////////
#define ALARM_START_ADD 0x0008//指向的是存储alarm首地址
#define ALARM_END_ADD 0x2000//终止地址
#define ALAME_NUM_ADD 0x0000
#define ALAME_ADDPT_ADD 0x0002
#define NUM_MAX 1023
typedef unsigned char uchar;
typedef unsigned int uint;
//connection
sbit CS1=P1^6;
sbit SO1=P1^7;
sbit SCK1=P3^4;
sbit SI1=P3^5;
//变量定义
//uchar xdata DATA_RECE[64];//发到rom中的数
//uchar xdata DATA_STORE[64];//rom中取出的数
//uchar xdata test1,test2,test3;
//uint xdata test4;
unsigned int xdata alarm_num;
unsigned int xdata alarm_addpt;
//------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////
//下面的函数是对第一片eeprom1进行操作的函数
////////////////////////////////////////////////////////////////////////////////////////////
//单片机发送一个字节的数据/命令到eeprom1
void sendbyte_chip1(uchar sbytedat)
{
uchar n;
for(n=0;n<8;n++)
{
if((sbytedat&0x80)==0x80)//判断sbytedat的最高位数据(&1000 0000),'1' SI1 = 1;'0' SI1 = 0,
SI1=1;
else
SI1=0;
SCK1=0;//开始为低电平,保证SCK1 = 1时,有个上升沿到来。
sbytedat<<=1;//数据左移一位,连续移动保证8位数据一直在最高位,低电平时间短,高电平时间长
SCK1=1;
}//给了8个上升沿,写入8个位,结束后SCK=1,SI=0
}
//------------------------------------------------------------------------------------
//单片机发送一个字数据到eeprom1,其中高位在前,低位在后
void sendword_chip1(uint sworddat)
{
uchar k;
for(k=0;k<16;k++)
{
if((sworddat&0x8000)==0x8000)
SI1=1;
else
SI1=0;
SCK1=0;
sworddat<<=1;//低电平时间短,高电平时间长
SCK1=1;
}
}
//------------------------------------------------------------------------------------
//单片机接收一个字节数据到eeprom1
uchar receivebyte_chip1()
{
uchar n,rbytedat=0;
SCK1=1;
for(n=0;n<8;n++)
{
SCK1=0;
if(SO1==1)
rbytedat|=0x01;//低电平时间长,高电平时间短
if(n<7)
rbytedat<<=1;
SCK1=1;
}//给了8个下降沿,结束后SCK=1;入口SCK=1,以便更新数据,结束后SCK=1
//rbytedat>>=1; //由于左移8次,应移回1位
return(rbytedat);
}
//------------------------------------------------------------------------------------
/*读状态寄存器,读出的数据放入到status中*/
uchar rdsr_cmd_chip1 (void)
{
uchar status;
//SCK1=0;
CS1=0;
sendbyte_chip1(EEROM_RDSR);
status=receivebyte_chip1();
//SCK1=0;
CS1=1;
return(status);
}
//------------------------------------------------------------------------------------
/*检测写入的过程是否结束*/
void checkend_chip1()
{
uchar checkn,pstatus;//检测次数100次
for(checkn=0;checkn<100;checkn++)
{
pstatus=rdsr_cmd_chip1();
if((pstatus&0x01)==0)//?铁电存储器已经没有就绪位了,不用检查是否就绪/READY位;
break;
}
}
//------------------------------------------------------------------------------------
/*写状态寄存器子程序*/
void wrsr_cmd_chip1(void)
{
CS1=0;
sendbyte_chip1(EEROM_WREN);
CS1=1;
CS1=0;/* Bring /CS low */
//SCK1=0;
sendbyte_chip1(EEROM_WRSR) ;/* Send WRSR instruction */
sendbyte_chip1(STATUS_REG);/* Send status register */
CS1=1;/* Bring /CS high */
//SCK1=0;
checkend_chip1();
}
//------------------------------------------------------------------------------------
//向eeprom1中写入一个字节数据
void bytewrite_chip1(uint wbyteadd,uchar wbytedata)
{
// SCK1=0;
CS1=0;
sendbyte_chip1(EEROM_WREN);
// SCK1=0;
CS1=1;
CS1=0;
sendbyte_chip1(EEROM_WRITE);//发送写命令
sendword_chip1(wbyteadd);//发送16位地址
sendbyte_chip1(wbytedata);//发送数据
// SCK1=0;
CS1=1;
checkend_chip1();
}
//------------------------------------------------------------------------------------
//从eeprom1中读出一个字节的数据
uchar byteread_chip1(uint rbyteadd)
{
uchar rdata;
//SCK1=0;
CS1=0;
sendbyte_chip1(EEROM_READ );//发送读命令
sendword_chip1(rbyteadd);//发送16位地址
rdata=receivebyte_chip1();
//SCK1=0;
CS1=1;
return(rdata);
}
//------------------------------------------------------------------------------------
//向eeprom1中写入一个字数据
void wordwrite_chip1(uint wwordadd,uint wworddata)
{
// SCK1=0;
CS1=0;
sendbyte_chip1(EEROM_WREN);
// SCK1=0;
CS1=1;
CS1=0;
sendbyte_chip1(EEROM_WRITE);//发送写命令
sendword_chip1(wwordadd);//发送16位地址
sendword_chip1(wworddata);//发送数据
// SCK1=0;
CS1=1;
checkend_chip1();
}
//------------------------------------------------------------------------------------
//从eeprom1中读出一个字的数据
uint wordread_chip1(uint rwordadd)
{
uint rwdata;
//SCK1=0;
CS1=0;
sendbyte_chip1(EEROM_READ );//发送读命令
sendword_chip1(rwordadd);//发送16位地址
rwdata=receivebyte_chip1();
rwdata<<=8;
rwdata=rwdata|(receivebyte_chip1());
//SCK1=0;
CS1=1;
return(rwdata);
}
//------------------------------------------------------------------------------------
//向某一地址处连续读一定数目的数据,入口为存数的指针,以及需要写入的数目,写入的eeprom首地址
void read_seq_chip1(uchar * readstore,uint rnum,uint radd)
{
uint i;
SCK1=1;
CS1=0;
sendbyte_chip1(EEROM_READ );//发送读命令
sendword_chip1(radd);//发送16位地址
for(i=0;i<rnum;i++)
{
*readstore=receivebyte_chip1();
readstore++;
}
CS1=1;
}
//------------------------------------------------------------------------------------
//向某一地址处连续写入一定数目的数据,入口为存数的指针,以及需要写入的数目,写入的eeprom首地址
void write_seq_chip1(uchar * writebuf,uchar writenum,uint writeadd)
{
while(writenum!=0)//说明没有写完
{
SCK1=0;
CS1=0;
sendbyte_chip1(EEROM_WREN);
CS1=1;
CS1=0;
sendbyte_chip1(EEROM_WRITE);//发送写命令
sendword_chip1(writeadd);//发送16位地址
do
{
sendbyte_chip1(*writebuf);
writebuf++;
writenum--;
writeadd++;
}
while(((writeadd&0x001F)!=0x0000)&&(writenum!=0));//没有到一页的结尾在该页中接着写
CS1=1;
checkend_chip1();
}
}
//------------------------------------------------------------------------------------
/*
void clear_alarm()
{
unsigned int clearnum,clearadd=0x0008;
alarm_num=wordread_chip2(ALAME_NUM_ADD);
clearnum=alarm_num*8;
while(clearnum!=0)
{
CS2=0;
sendbyte_chip2(EEROM_WREN);
CS2=1;
CS2=0;
sendbyte_chip2(EEROM_WRITE);
sendword_chip2(clearadd);
do
{
sendbyte_chip2(0x0000);
clearnum--;
clearadd++;
}
while(((clearadd&0x001F)!=0x0000)&&(clearnum!=0));
CS2=1;
checkend_chip2();
}
wordwrite_chip2(ALAME_NUM_ADD,0x0000);
wordwrite_chip2(ALAME_ADDPT_ADD,0x0000);//将数目和地址回0
}
*/
//------------------------------------------------------------------------------------
/*
void main()
{
uchar i;
for(i=0;i<64;i++)
{
DATA_STORE[i]=i;
}
wrsr_cmd_chip1();
wordwrite_chip1(0x0005,0x1212);
//bytewrite_chip2(0x0000,10);
//bytewrite_chip2(0x0001,8);
//bytewrite_chip2(0x0002,7);
//i=byteread_chip1(0x0001);
//write_seq_chip1(DATA_STORE,32,0x0002);
//test4=wordread_chip1(0x0005);
//test1=byteread_chip1(0x0000);
//test2=byteread_chip1(0x0005);
//test3=byteread_chip2(0x0002);
read_seq_chip1(DATA_RECE,32,0x0000);
//senddatatorom(0x0000,32);
//getdatafromrom(0x0000,32);
while(1);
}
*/
//------------------------------------------------------------------------------------
/*往起始地址为addr处读出num_read个数据到DATA_RECE[]中
void getdatafromrom(unsigned int addr,uchar num_read)
{
unsigned int addrl,addrh,i;
addrl=addr;//分离地址的高8位和低8位
addr>>=8;
addrh=addr;
CS=0; //发送读命令
sendbyte( EEROM_READ );
sendbyte(addrh);//发送16位地址
sendbyte(addrl);
for(i=0;i<num_read;i++)//读出num_read个数据到DATA_RECE[]
DATA_RECE[i]=receivebyte();
CS=1;
}//读数过程结束CS置1
//------------------------------------------------------------------------------------
//往起始地址为addr处写入数据,一次写入数据最大数不超过32
void senddatatorom(unsigned int addr,uchar num_send) //num_send最大为32,否则该页循环写入,破坏数据
{
uchar addrl,addrh,i;
addrl=addr;//分离地址的高8位和低8位
addr>>=8;
addrh=addr;
CS=0;
sendbyte(EEROM_WREN);//写使能
CS=1;
CS=0;
sendbyte(EEROM_WRITE);//发送写命令
sendbyte(addrh);//发送16位地址
sendbyte(addrl);
for(i=0;i<num_send;i++)//写入num_send个数据
sendbyte(DATA_STORE[i]);
CS=1;
wip_poll();
}
*/
//------------------------------------------------------------------------------------
/*
void writeseq_chip1(uchar * writebuf,uchar writenum,uint writeadd)
{
uchar n;
for(n=0;n<writenum;n++)
{
CS1=0;
sendbyte_chip1(EEROM_WREN);
CS1=1;
CS1=0;
sendbyte_chip1(EEROM_WRITE);//发送写命令
sendword_chip1(writeadd);//发送16位地址
sendbyte_chip1(*writebuf);
writebuf++;
writeadd++;
CS1=1;
checkend_chip1();
}
}
*/
//------------------------------------------------------------------------------------
//从某一地址处连续读出一定数目的数据,入口为存储数据的指针,以及需要读出的数目,读出的首地址
/*
void readseq_chip1(uchar * readbuf,uchar readnum,uint readadd)
{
uchar rsn,rdat;
for(rsn=0;rsn<readnum;rsn++)
{
CS1=0;
sendbyte_chip1(EEROM_READ ); //发送读命令
sendword_chip1(readadd);//发送16位地址
rdat=receivebyte_chip1();
*readbuf=rdat;
readbuf++;
readadd++;
CS1=1;
}
}
*/
//------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -