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

📄 pcf8563().c

📁 lcd 12864+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 + -