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