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

📄 rx8583.c

📁 本程序已经调试通过
💻 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 + -