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

📄 clock.c

📁 时钟芯片PCF8563的底层驱动
💻 C
字号:
#include <P24FJ128GA006.H>
#include "clock.h"

# define SDA_OUT  	LATGbits.LATG3
# define SDA_IN   	PORTGbits.RG3 
# define SCK  		LATGbits.LATG2
# define SDA_DDR 	TRISGbits.TRISG3


#define delay()  Nop();Nop(); Nop(); Nop(); Nop()

TIME							time;
TIME                            timeDelay;
DATE							date;
TIME							old_time;
DATE							old_date;
unsigned    char				old_hour		=	0xff;
unsigned    char				old_min	    	=	0xff;	
unsigned    char				old_sec			=	0xff;	
TIME                            timeDelay;


void i2c_start()
{
	SDA_OUT = 1;
	Nop();
	SCK = 1;
	delay();
	SDA_OUT = 0;
	delay();
	SCK = 0;
	Nop();
}

void i2c_stop()
{
	SDA_OUT = 0;
	Nop();	
	SCK = 1;
	delay();
	SDA_OUT = 1;
	delay();
}	

unsigned char i2c_send(unsigned char data)
{
		unsigned char i;
		unsigned char mybit;
		unsigned char ack;
	
		SDA_DDR = 0; 
		for(i = 0;i < 8;i++)
		{	
			mybit = (((data << i)&0x80)? 1:0);
			SDA_OUT = mybit;
			Nop();
			SCK =1;
			delay();
			SCK =0;
		}
		Nop();
		Nop();
		SDA_DDR = 1; //准备接受ACK
		Nop();
		Nop();
		SCK =1;
		Nop();
		Nop();	

		ack =1;
		if(SDA_IN ==0)
			ack = 1;
			else
			ack = 0;
	 SCK =0;
	 Nop();
	 Nop();	
	 SDA_DDR = 0;

	 return(ack);
}
unsigned char i2c_rec()
{
	unsigned char i,retc =0;
	
	SDA_DDR = 1;
	for(i = 0;i < 8; i++)
	{
		Nop();
		SCK = 0;
		delay();
		SCK = 1;
		Nop();
		Nop();
		retc = retc <<1;
		if(SDA_IN == 1) retc = retc +1;
		Nop();
		Nop();
	}
	SCK = 0;
	Nop();
	Nop();
	return (retc);
}
void i2c_ACK(unsigned char ack)
{
	SDA_DDR = 0;
	if(ack == 0)
		SDA_OUT =1;
	else
		SDA_OUT =0;
	Nop();
	Nop();
	Nop();
	SCK = 1;
	delay();
	SCK = 0;
	Nop();
	Nop();
}
	

void start_PCF8563()
{
	TRISGbits.TRISG2 = 0;

	i2c_start();                
  	i2c_send(0xa2); 
	i2c_send(0x00);
	i2c_send(0x00); 
	i2c_stop();
}
void write_PCF8563(unsigned char slave_address,unsigned int sub_address,unsigned char *data_buf,unsigned char number)
{
	unsigned char i,mchar;

	i2c_start();
	i2c_send(slave_address);
	i2c_send(sub_address);
	for(i = 0;i < number;i++)
	{
		mchar = *data_buf++;
		i2c_send(mchar);
	}
	i2c_stop();
}
void read_PCF8563(unsigned char slave_address,unsigned int sub_address,unsigned char *data_buf,unsigned char number)
{
	unsigned char i;

	i2c_start();
	i2c_send(slave_address);
	i2c_send(sub_address);
	i2c_start();
	i2c_send(0xA3);

	for(i = 0;i < number;i++)
	{
		data_buf[i] = i2c_rec();
		if(i == number -1)
		{
			i2c_ACK(0);
		}
		else
		{
			i2c_ACK(1);
		}
	}

	i2c_stop();
	return;
}
void PCF8563_SetByte(unsigned char tape,unsigned char data)
{
        unsigned char high,low;
          
        high=data/10;
        low=data-high*10;
        
 
 
        high=(high<<4)|low;
        
        
        write_PCF8563(0xA2,tape,&high,1);
}
void getdate(DATE *pdate)
{
	unsigned char mybuf[4];

	read_PCF8563(0xA2,0x05,(void *)mybuf,4);
	
	mybuf[0] &=0x3F; 
	mybuf[2] &=0x1F;
	
	pdate->day    = (mybuf[0]>>4)*10+(mybuf[0]&0x0F);
    pdate->mon    = (mybuf[2]>>4)*10+(mybuf[2]&0x0F);
    pdate->year   = (mybuf[3]>>4)*10+(mybuf[3]&0x0F);
	
	return ;
}

void gettime(TIME *ptime)
{
	unsigned char mybuf[3];
	read_PCF8563(0xA2,0x02,(void *)mybuf,3);
	
	mybuf[0] &=0x7F;
	mybuf[1] &=0x7F;
	mybuf[2] &=0x3F;
	
	ptime->sec    = (mybuf[0]>>4)*10+(mybuf[0]&0x0F);
    ptime->min    = (mybuf[1]>>4)*10+(mybuf[1]&0x0F);
    ptime->hour   = (mybuf[2]>>4)*10+(mybuf[2]&0x0F);
}
void  settime(TIME time)
{
	PCF8563_SetByte(0x02,time.sec);
	PCF8563_SetByte(0x03,time.min);
	PCF8563_SetByte(0x04,time.hour);
	
}
void setdate(DATE date)
{
	PCF8563_SetByte(0x05,date.day);
	PCF8563_SetByte(0x07,date.mon);
	PCF8563_SetByte(0x08,date.year);
}

⌨️ 快捷键说明

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