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