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

📄 pcf8563.h

📁 用SL811做USB主机的源码
💻 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 + -