📄 pcf8563.h
字号:
unsigned char PCF_register[16]={0x00,//复位功能有效
0x00,//报警,定时功能禁止.
0x00,//秒
0x00,//分
0x00,//小时
0x01,//日
0x00,//星期
0x01,//月\世纪
0x00,//年
0x80,//分钟报警
0x80,//小时报警
0x81,//日报警
0x80,//星期报警
0x00,//禁止CLKOUT
0x00,//功能禁止,降低功耗.
0x00};
const unsigned char PCF_cover[16]={ 0xa8,0x1f,0x7f,0x7f,0x3f,0x3f,0x07,0x1f,
0xff,0xff,0xbf,0xbf,0x87,0x83,0x83,0xff};
unsigned char bcd_hex(unsigned char x)
{ return (x/16*10+x%16);
}
unsigned char hex_bcd(unsigned char x)
{ return (x/10*16+x%10);
}
/*
Name: ***write_pcf8563***read_pcf8563***
Author:zhouxianfa.
Date:2004-7-16.
Model_write:start+SLA_W+address+(data0...dataN)+stop.
Model_read:start+SLA_W+address+repeat_start+SLA_R+(RECEIVE data0...dataN)+stop.
Known:SLA_W=0a2h,address=写入PCF8563数据串的起始地址(读取数据的起始地址).
SLA_W是所选器件的系统地址,SLA_R=SLA_W+1.
ACK在发送数据时不理会,系统自处理.
write_pcf8563时,ACK信号不必理会.
read_pcf8563 时,在收到ST的数据后,前n-1个数据发送ACK(TWEA=1),n数据发送NACK(TWEA=0).
For PCF8563:
00h:控制/状态寄存器1. bit7=test,bit5=stop,bit3=testC.
01h:控制/状态寄存器2. bit4=Ti/Tp,bit3=AF,bit2=TF,bit1=Aie,bit0=Tie.
02h:second. VL+second_value.
03h:minute. (bit6...bit0)=minute_value.
04h:hour. (bit6...bit0)=hour_value.
05h:data. (bit6...bit0)=data_value.
06h:day. (bit2...bit0)=day_value.
07h:month/century. bit7=C,(bit4...bit0)=(01~12)BCD
08h:year. (bit7...bit0)=year_value.
09h:warring_minute. bit7=AE,(bit6...bit0)=warring_value.
0ah:warring_hour. bit7=AE,(bit5...bit0)=warring_value.
0bh:warring_data. bit7=AE,(bit5...bit0)=warring_value.
0ch:warring_day. bit7=AE,bit2...bit0=warring_value.
0dh:CLKOUT输出寄存器. bit7=FE,...,bit1=FD1,bit0=FD0.
0eh:定时器控制寄存器. bit7=TE,...,bit1=TD1,bit0=TD0.
0fh:定时器倒数数值寄存器. 定时器倒计数数值(二进制).
(attention:The values are BCDM.)
*/
void start(void)
{unsigned char temp=0;
temp = (1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
TWCR = temp;
}
void stop(void)
{unsigned char temp=0;
temp = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
TWCR = temp;
}
void write8bit(unsigned char data)
{
TWDR=data;
TWCR = (1<<TWINT)|(1<<TWEN);
}
void testAck(void)
{ while (!(TWCR&(1<<7))) ; }
void NoAck(void)
{
TWCR &= ~(1<<TWEA);
//TWCR |= (1<<7);
}
void Ack(void)
{
TWCR |= (1<<TWEA);
//TWCR |= (1<<7);
}
unsigned char read_pcf(unsigned char address)
{unsigned char temp;
start();
testAck();
write8bit(0xa2);
testAck();
write8bit(address);
testAck();
start();
testAck();
write8bit(0xa3);//Enter the MR. pass!
testAck();
TWCR |= (1<<7);
Ack();
testAck();//recevied a data.
temp=TWDR;
NoAck();
TWCR |= (1<<7);
testAck();
stop();
//delayms(1);
return (temp);
}
void read_pcf16(unsigned char address)
{unsigned char temp;
start();
testAck();
write8bit(0xa2);
testAck();
write8bit(0);
testAck();
start();
testAck();
write8bit(0xa3);//Enter the MR. pass!
testAck();
TWCR |= (1<<7);
Ack();
testAck();//recevied a data.
for (temp=0;temp<15;temp++)
{PCF_register[temp] = TWDR&PCF_cover[temp];
TWCR |= (1<<7);
testAck();}
PCF_register[temp]=TWDR&PCF_cover[temp];
NoAck();
TWCR |= (1<<7);
testAck();
stop();
//delayms(1);
}
void write_pcf(unsigned char address,unsigned char data)//Pass
{ start();
testAck();
write8bit(0xa2);
testAck();
write8bit(address);
testAck();
write8bit(data);
testAck();
stop();
//delayms(1);
}
void write_pcf16(void)//Pass
{unsigned char temp;
start();
testAck();
write8bit(0xa2);
testAck();
write8bit(0);
testAck();
for (temp=0;temp<16;temp++)
{write8bit(PCF_register[temp]);
testAck();}
stop();
//delayms(1);
}
#define Fscl 400
//400其实是400Khz
void twi_init(void)
{
TWCR=0;
TWSR |= 0x00;
TWBR= 8*(1000-Fscl)/Fscl; //set bit rate
TWCR= 0x44; //enable twi
}
void pcf_display(void)
{unsigned char i,j;
read_pcf16(0);
for (i=0;i<8;i++)
{for (j=0;j<2;j++)
{put_shuzi_pcf(j*20,16*i,PCF_register[i*2+j]);}
}
}
unsigned char Time_register[7];//秒,分,小时,日,月,年,星期
void Time_display(unsigned char x,unsigned char y)
{ read_pcf16(0);
Time_register[0]=PCF_register[2]%128;
//if (Time_register[0]==0)
{Time_register[1]=PCF_register[3];
Time_register[2]=PCF_register[4];
Time_register[3]=PCF_register[5];
Time_register[4]=PCF_register[7];
Time_register[5]=PCF_register[8];
Time_register[6]=PCF_register[6];
}
disp16x8(x,y,2);
disp16x8(x+1,y,0);
disp16x8(x+2,y,Time_register[5]/16);
disp16x8(x+3,y,Time_register[5]%16);
disp16x16(x+4,y,13);
disp16x8(x+6,y,Time_register[4]/16);
disp16x8(x+7,y,Time_register[4]%16);
disp16x16(x+8,y,14);
disp16x8(x+10,y,Time_register[3]/16);
disp16x8(x+11,y,Time_register[3]%16);
disp16x16(x+12,y,15);
disp16x16(x+15,y,17);
disp16x16(x+17,y,18);
disp16x16(x+19,y,18+PCF_register[6]);
disp16x8(x+2,y+16,Time_register[2]/16);
disp16x8(x+3,y+16,Time_register[2]%16);
disp16x16(x+4,y+16,16);
disp16x8(x+6,y+16,Time_register[1]/16);
disp16x8(x+7,y+16,Time_register[1]%16);
disp16x16(x+8,y+16,16);
disp16x8(x+10,y+16,Time_register[0]/16);
disp16x8(x+11,y+16,Time_register[0]%16);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -