📄 pcf8563().c
字号:
/*
-------------------------------------
file name : pcf8563().c
campeny : inghome
designer : William
velcd16rsion : 1.0
date : 2010-06-08
use in : PCF8563 is i2c status.
OSC is 32.768KHz.
ADD is 1010 00X r/w.
16 X 8bit.
00H control1
01H control2
0eH timer control
0fH timer countdown value
02H seconds nXXX XXXX BCD
03H minutes -XXX XXXX 00~59
04H Hours --XX XXXX 24h
05H days --XX XXXX 31
06H weekdays---- -XXX 0~6
07H mon/Ce C--X XXXX 0~12
08H years XXXX XXXX 00~99
09H min ala AXXX XXXX 00~59
0aH Hr ala A-XX XXXX 00~23
0bH da ala A-XX XXXX 00~31
0cH weekala A--- -XXX 0~6
-------------------------------------
*/
#define uchar unsigned char
#define uint unsigned int
uchar lcd16_1[16];
uchar lcd16_2[16] = {"welcome"};
struct time
{
uchar second;
uchar minute;
uchar hour;
uchar day;
uchar weekday;
uchar month;
uint year;
} time;
sbit tim_sda=P1^7;
sbit tim_scl=P1^6;
bit tim_ack; // i2c slave ack.
bit tim_err;
uchar tim_rd_buffer[16];
uchar tim_wr_buffer[16];
// i2c start.
void PCF8563_start() //start flag is when tim_scl 1, tim_sdafrom 1 to 0.
{
tim_sda = 1;
delay11us(1);
tim_scl = 1;
delay11us(1);
tim_sda = 0;
delay11us(1);
}
// i2c stop.
void PCF8563_stop() //start flag is when tim_scl 1, tim_sdafrom 0 to 1.
{
tim_sda = 0;
delay11us(1);
tim_scl = 1;
delay11us(1);
tim_sda = 0;
}
//i2c slave respons.
void PCF8563_respons()
{
uchar i;
tim_scl = 1;
delay11us(1);
while((tim_sda)&&(i<250)) i++;
if(!tim_sda)
tim_ack = 1;
else
tim_ack = 0;
tim_scl = 0;
delay11us(1);
}
// i2c master respons.
void PCF8563_master_respons(bit master_ack)
{
tim_scl = 0;
delay11us(1);
tim_sda = ~master_ack;
delay11us(1);
tim_scl = 1;
delay11us(1);
tim_scl = 0;
delay11us(1);
}
//i2c init.
void PCF8563_init()
{
tim_sda = 1;
delay11us(1);
tim_scl = 1;
delay11us(1);
}
// i2c write n byte.
void PCF8563_wr_byte(uchar dat)
{
uchar i , temp;
temp = dat;
for(i=0;i<8;i++)
{
// temp = temp<<1; //send high to low,
tim_scl = 0;
delay11us(1);
// tim_sda = CY;
if(temp&0x80)
tim_sda = 1;
else
tim_sda = 0;
temp = temp<<1;
delay11us(1);
tim_scl = 1;
delay11us(1);
// tim_scl = 0;
// delay11us(1);
}
tim_scl = 0;
delay11us(1);
tim_sda = 1; //set tim_sda to 1 to wait respons.
delay11us(1);
}
uchar PCF8563_rd_byte()
{
uchar i,k;
tim_scl = 0;
delay11us(1);
tim_sda = 1;
delay11us(1);
for(i=0;i<8;i++)
{
tim_scl = 1;
delay11us(1);
k = (k<<1)|tim_sda;
tim_scl = 0;
delay11us(1);
}
return k;
}
void PCF8563_write_n_byte(uchar add,uchar com,uchar *dat,uchar n_byte) //
{
uchar i = 0;
uchar temp;
temp = *dat; // send to begin address to 'temp'.
add = add<<1;
add = 0xa0+add+0x00;
PCF8563_start();
PCF8563_wr_byte(add); //send EEPROM address, bit 0 = 0 is write.
PCF8563_respons();
if(!tim_ack) //if i2c respons.
{
tim_err = 1;
return;
}
PCF8563_wr_byte(com); //send EEPROM beginning address.
PCF8563_respons();
if(!tim_ack) //if i2c respons.
{
tim_err = 1;
return;
}
while(n_byte) //write n byte.
{
PCF8563_wr_byte(temp);
PCF8563_respons();
if(!tim_ack)
{
tim_err = 1;
PCF8563_stop();
return;
}
temp++;
n_byte--;
}
PCF8563_stop();
}
void PCF8563_read_n_byte(uchar add,uchar com,uchar n_byte)
{
uchar *temp;
temp = tim_rd_buffer;
add = add<<1;
add = 0xa0+add+0x00;
// com = com - 1;
PCF8563_start();
PCF8563_wr_byte(add); //send address + wr.
PCF8563_respons();
PCF8563_wr_byte(com); // first byte address.
PCF8563_respons();
add = add+0x01;
PCF8563_start();
PCF8563_wr_byte(add); //send address + rd.
PCF8563_respons();
while(n_byte) // rd n byte .
{
*temp = PCF8563_rd_byte();
if(n_byte != 1) //if i2c respons.
{
PCF8563_master_respons(1); //if the number is not the last one, master send a ack bit.
// return;
}
temp++;
n_byte--;
}
PCF8563_stop();
}
void PCF8563_wr_time()
{
tim_wr_buffer[0] = 0x00; //second
tim_wr_buffer[1] = 0x11; //minute
tim_wr_buffer[2] = 0x22; //hour
tim_wr_buffer[3] = 0x15; //day
tim_wr_buffer[4] = 0x03; //weekday
tim_wr_buffer[5] = 0x06; //month
tim_wr_buffer[6] = 0x10; //year
PCF8563_write_n_byte(1,2,tim_wr_buffer,8);
}
void PCF8563_rd_time()
{
uchar temp;
PCF8563_read_n_byte(1,2,9);
time.second = ((tim_rd_buffer[1]&0x70)>>4)*10 + (tim_rd_buffer[1]&0x0f); //second
time.minute = ((tim_rd_buffer[2]&0x70)>>4)*10 + (tim_rd_buffer[2]&0x0f); //minute
time.hour = ((tim_rd_buffer[3]&0x30)>>4)*10 + (tim_rd_buffer[3]&0x0f); //hour
time.day = ((tim_rd_buffer[4]&0x30)>>4)*10 + (tim_rd_buffer[4]&0x0f); //day
time.weekday = tim_rd_buffer[5]&0x07; //weekday
time.month = ((tim_rd_buffer[6]&0x10)>>4)*10 + (tim_rd_buffer[6]&0x0f); //month
temp = (tim_rd_buffer[4]&0x80)>>7;
time.year = (temp+19)*100+((tim_rd_buffer[7]&0x70)>>4)*10 + (tim_rd_buffer[7]&0x0f); //year
lcd16_1[0] = time.hour/10+0x30; //hour
lcd16_1[1] = time.hour%10+0x30;
lcd16_1[2] = '-';
lcd16_1[3] = time.minute/10+0x30; //minute
lcd16_1[4] = time.minute%10+0x30;
lcd16_1[5] = '-';
lcd16_1[6] = time.second/10+0x30; //second
lcd16_1[7] = time.second%10+0x30;
lcd16_2[0] = time.year/1000+0x30; //year
lcd16_2[1] = (time.year%1000)/100+0x30;
lcd16_2[2] = (time.year%100)/10+0x30;
lcd16_2[3] = time.year%10+0x30;
lcd16_2[4] = '-';
lcd16_2[5] = time.month/10+0x30; //mon
lcd16_2[6] = time.month%10+0x30;
lcd16_2[7] = '-';
lcd16_2[8] = time.day/10+0x30; //day
lcd16_2[9] = time.day%10+0x30;
lcd16_2[10] = ' ';
lcd16_2[11] = time.weekday+0x30;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -