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

📄 romsore.c

📁 液晶程序液晶程序液晶程序液晶程序液晶程序液晶程序
💻 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 + -