📄 rx8583.c
字号:
/**********************************************************************
* FileName: rx8583.c
* Compiler: MPLAB C30
**********************************************************************/
#if defined(__dsPIC33F__)
#include "p33fxxxx.h"
#endif
#include "i2c.h"
#include "rx8583.h"
unsigned char clock[6];//year,month,day,hour,minute,second
unsigned char clock_error;
/*******************************************************************************
1ms延时 设FOSC = 64MHZ
*******************************************************************************/
void DelayMs(unsigned int ms)
{
int i = 0;
while(ms--)
{
for(i=0x1f38;i>0;i--)
;
}
}
void InitRX8583(void)
{
unsigned char i=0, temp, flag;
temp = 0x20;//24小时制
flag=WriteRX8583(&temp, 0x0e);
while(flag)
{
flag=WriteRX8583(&temp, 0x0e);
i++;
if(i>5) break;
}
if(flag) clock_error = 1;
clock[0] = 9;//year
clock[1] = 1;//month
clock[2] = 1;//day
clock[3] = 0;//hour
clock[4] = 0;//minute
clock[5] = 0;//second
WriteTime();
}
/***************************************************************************
函数功能:写时钟
入口参数:要写入的数据首地址 要写入的时钟地址,地址范围为(0x01-0x0f)<<4
***************************************************************************/
unsigned char WriteRX8583(unsigned char *wrptr, unsigned char addr)
{
unsigned char err, I2Cblock=0x64;
I2C1CONbits.ACKDT=0; // 主器件发送ACK主应答
I2C1CONbits.ACKEN=0; // 主器件应答使能
StartI2C1(); // 启动I2C总线
err=MasterWriteI2C1(I2Cblock); //寻找的指定代码
if(err)
{
StopI2C1();
return 1;
}
err=MasterWriteI2C1(addr<<4);//写入指定I2C的地址
if(err)
{
StopI2C1();
return 1;
}
err=MasterWriteI2C1(*wrptr); //数据写入发送缓冲器
if(err)
{
StopI2C1();
return 1;
}
StopI2C1(); //停止总线
return 0;
}
/***************************************************************************
函数功能:读外部时钟
入口参数:要读入的数据首地址 要读出的数据个数 要读出的时钟地址
***************************************************************************/
unsigned char ReadRX8583(unsigned char *rdptr,unsigned char length, unsigned char addr)
{
unsigned char err, I2Cblock=0x64;
OpenI2C1(35);//使能I2C模块
AckI2C1();//主器件发送ACK
StartI2C1();//启动I2C总线
err=MasterWriteI2C1(I2Cblock);//寻找的指定代码
if(err)
{
StopI2C1();
return 1;
}
err=MasterWriteI2C1(addr<<4);
if(err)
{
StopI2C1();
return 1;
}
RestartI2C1(); //重启I2C总线
I2Cblock=I2Cblock+1;
err=MasterWriteI2C1(I2Cblock); //写入读指令
if(err)
{
StopI2C1();
return 1;
}
err=MastergetsI2C1(rdptr, length);
if(err)
{
StopI2C1();
return 1;
}
StopI2C1();
return 0;
}
void ReadTime(void)
{
unsigned char i, time[7];
ReadRX8583(time,7,0);
for(i=0; i<7; i++)
{
time[i] = ((time[i]>>4)&0x0f)*10+(time[i]&0x0f);
}
clock[0] = time[6];clock[1] = time[5];clock[2] = time[4];
clock[3] = time[2];clock[4] = time[1];clock[5] = time[0];
}
void WriteTime(void)
{
unsigned char flag, num, *p;
unsigned char i, addr, temp;
p = (unsigned char *)clock;
for(i=0,addr=6; i<6; i++,addr--,p++)
{
temp = (((*p/10)<<4)&0xf0) | ((*p % 10)&0x0f);
if(addr==3)addr--;
num=0;
flag = WriteRX8583(&temp, addr);
while(flag)
{
flag = WriteRX8583(&temp, addr);
num++;
if(num>5) break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -