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

📄 memory.c

📁 智能打铃系统(MCU)端程序
💻 C
字号:
#include <REG52.H>


//void delay_us(unsigned char us);
//============= 93C46端口定义 ==============
sbit	SPI_CS=P2^3;		//片选
sbit	SPI_SCLK=P2^2;	//时钟
sbit	SPI_DI=P2^1;		//93C46数据输入口
sbit	SPI_DO=P2^0;		//93C46数据输出口
//================ END ====================

void	SPI_Start()
{
	SPI_CS = 0;
	SPI_SCLK = 0;
	SPI_CS = 1;
	SPI_DI=1;
	SPI_SCLK = 1;
	SPI_SCLK = 0;
}

void	SPI_SendByte(unsigned char SDATA)
{
	unsigned char i;
	SPI_SCLK = 0;
	for(i=8;i>0;i--)
	{
		SPI_DI = SDATA&0x80;
		SPI_SCLK = 1;
		SDATA <<= 1; 
		SPI_SCLK = 0;
	}
}

void	WeitReady()
{
	SPI_DO=1;
	SPI_CS=1;
	SPI_SCLK=1;
	while(SPI_DO == 0)
	{
		SPI_SCLK=0;
		SPI_SCLK=1;
	}
	SPI_CS=0;
}

void Mem_EnWrite()
{
	unsigned char i,InData;
	SPI_CS=0; 
	SPI_SCLK=0;
	SPI_CS=1;
	InData=0x98; 		// 10011XXXXX
	for(i=10;i>0;i--) // 9
	{ 
		SPI_DI=InData&0x80;
		SPI_SCLK=1; 
		SPI_SCLK=0;
		InData<<=1;
	}
	SPI_CS=0;
}

void Mem_Clrall()
{
	unsigned char i,InData;
	SPI_CS=0; 
	SPI_SCLK=0;
	SPI_CS=1;
	InData=0x88; 		// 10001XXXXX
	for(i=10;i>0;i--) // 9
	{ 
		SPI_DI=InData&0x80;
		SPI_SCLK=1; 
		SPI_SCLK=0;
		InData<<=1;
	}
	SPI_SendByte(0);
	SPI_CS=0;
	WeitReady();
}

void Mem_Write(unsigned char Addr,unsigned char MData)
{
	unsigned char i;
	Mem_EnWrite();
	SPI_Start();
	SPI_DI = 0;
	SPI_SCLK = 1;
	SPI_SCLK = 0;
	SPI_DI = 1;
	SPI_SCLK = 1;
	SPI_SCLK = 0;
	for(i=7;i>0;i--)
	{
		Addr <<= 1;
		SPI_DI=Addr&0x80;
		SPI_SCLK = 1;
		SPI_SCLK = 0;
	}
	SPI_SendByte(MData);
	SPI_CS=0;
	WeitReady();
}

unsigned char Mem_Read(unsigned char Addr)
{
	unsigned char i,temp;
	SPI_Start();
	SPI_DI = 1;
	SPI_SCLK = 1;
	SPI_SCLK = 0;
	SPI_DI = 0;
	SPI_SCLK = 1;
	SPI_SCLK = 0;
	for(i=7;i>0;i--)
	{
		Addr <<= 1;
		SPI_DI=Addr&0x80;
		SPI_SCLK = 1;
		SPI_SCLK = 0;
	}
	SPI_DO=1;
	for(i=8;i>0;i--)
	{
		temp <<= 1;
		SPI_SCLK = 1;
		temp |= SPI_DO;
		SPI_SCLK = 0;
	}
	SPI_CS=0;
	return temp;
}


//内存存储,编号从1开始,每个记录的位置为  编号*3-2,地址0存放记录总数
//时间使用BCD码存放 

unsigned char Read_RingTime(unsigned char RingNum,unsigned char *p)		//读取打铃时间
{
	unsigned char RingCount,Addr;
	RingCount=Mem_Read(0x00);
	if (RingNum>RingCount) return(0);
	Addr=RingNum*3-2;
	*p=Mem_Read(Addr);
	p++;
	Addr++;
	*p=Mem_Read(Addr);
	p++;
	Addr++;
	*p=Mem_Read(Addr);
	return(1);
}

void	Write_RingTime(unsigned char RingNum,unsigned char *p)
{
		Mem_Write(RingNum*3-2,*p++);
		Mem_Write(RingNum*3-1,*p++);
		Mem_Write(RingNum*3,*p);
}

void Ring_Paixu()
{
	unsigned char RingCount,i,j,temp1[3],temp2[3];
	RingCount=Mem_Read(0);
	if (RingCount>1)
	{
		for (i=1;i<RingCount;i++)
		{
			Read_RingTime(i,temp1);
			for(j=i+1;j<=RingCount;j++)
			{
				Read_RingTime(j,temp2);
				if (temp1[0]<temp2[0]) continue;
				else if (temp1[0]==temp2[0])
				{
					if (temp1[1]<temp2[1]) continue;
				}
				else 
				Write_RingTime(i,temp2);
				Write_RingTime(j,temp1);
			}
		}
	}
}

unsigned char DelRing(unsigned char Num)
{
	unsigned char i,temp,rMax;
	rMax=Mem_Read(0)*3-2;
	i=Num*3-2;
	for(;i<=rMax;i++)
	{
		temp=Mem_Read(i+3);
		Mem_Write(i,temp);
	}
	temp=Mem_Read(0);
	temp--;
	Mem_Write(0,temp);
	Ring_Paixu();
	return temp;
}

⌨️ 快捷键说明

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