📄 1302.h
字号:
#define uchar unsigned char
#define uint unsigned int
#define CE_1 GPIO_WriteHigh(GPIOB, GPIO_PIN_3) //PB3
#define CE_0 GPIO_WriteLow(GPIOB, GPIO_PIN_3)
#define SCLK_1 GPIO_WriteHigh(GPIOB, GPIO_PIN_5)//PB5
#define SCLK_0 GPIO_WriteLow(GPIOB, GPIO_PIN_5)
#define IO_1 GPIO_WriteHigh(GPIOB, GPIO_PIN_4)//PB4
#define IO_0 GPIO_WriteLow(GPIOB, GPIO_PIN_4)
uchar h=0x00,m=0x00,s=0x00,n=0x12,y=0x11,r=0x17;
uchar TIMESET[7]; //秒,分,小时,日,月,星期,年
uchar READTIME[14]; //读取后,时间数据存放在此。,,十秒 秒 十分 分 十时 时 十日 日 十月 月 空字节 星期 十年 年
/******延时函数******/
void NOP()
{ uchar i;
i=5;
while(i--);
}
/******读IO函数******/
uchar readIO()
{
uchar t;
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);//初始化PB4为上拉输入
t=GPIO_ReadInputData(GPIOB); //读端口值,返回一个八位二进制数。
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB4
if(t&GPIO_PIN_4) return 1;
else return 0;
}
/******SPI主收从发(1Byte)******/
uchar SPIread()
{
uchar DAT,i;
DAT=0; //收的问题
CE_1;
for(i=0;i<8;i++)
{
DAT=DAT>>1;
SCLK_1;
NOP();
SCLK_0;
if(readIO()) DAT=DAT|0x80; //或完以后还要把值送到DAT上
}
return DAT;
}
/******SPI主发从收(1Byte)******/
void SPIwrite(uchar DAT)
{
uchar i;
CE_1;
for(i=0;i<8;i++)
{
if((DAT&0x01)==0x01)
IO_1;
else IO_0;
SCLK_0;
SCLK_1;
DAT=DAT>>1;
}
}
/******1302写入******/
void write1302(uchar ADD,uchar DAT)
{
CE_0; //总线清零
SCLK_0;
SPIwrite(ADD); //写地址 ,具体的地址看RAM表和RTC,写就用储存单元的写地址(最低位为0,看时序图),存就用储存单元的存地址。
NOP();
NOP();
SPIwrite(DAT); //写数据
CE_0; //释放总线
SCLK_0;
}
/******1302读取******/
uchar read1302(uchar ADD)
{
uchar DAT;
CE_0; //总线清零
SCLK_0;
SPIwrite(ADD); //写地址
NOP();
DAT=SPIread(); //读数据
CE_0; //释放总线
SCLK_0;
return DAT;
}
void SETtime()
{
TIMESET[0]=s;
TIMESET[1]=m;
TIMESET[2]=h;
TIMESET[3]=r;
TIMESET[4]=y;
TIMESET[5]=0x06;
TIMESET[6]=n;
}
/******1302时间初始化******/ //默认时间数据储存在TIMESET数组中
void SETtime1302()
{
SETtime();
uchar i,addr;
addr=0x80;
write1302(0x8e,0x00); //WP置零,开1302 RTC内存写使能
NOP();
for(i=0;i<7;i++)
{
write1302(addr,TIMESET[i]); //写入初始时间
addr+=2;
}
}
/******1302时间读取******/
void READtime1302()
{
uchar i,j,addr,temp;
write1302(0x8e,0x00); //??读取的时候也要开RTC写使能,因为要先写入要读的单元的地址。
addr=0x81;
j=0;
for(i=0;i<7;i++) //读取顺序为十秒 秒 十分 分 十时 时
{
temp = read1302(addr);
addr=addr+2;
READTIME[j] = (temp>>4);
j++;
READTIME[j] = (temp&0x0F);
j++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -