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

📄 pcf8563.c

📁 基于C8051F020的IIC数据传输C语言程序
💻 C
字号:
#include <c8051f020.h>
#include"I2C.H"
#include "KS0108.H"
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define     PCF8563 0xa2


typedef union 
{
	unsigned char Clock[7];
	struct RealClock
	{
		unsigned char Year,Month,Week,Day,Hour,Minute,Second;
	} RT;
} SZ;

SZ xdata RealTime;

unsigned char code t_initab[16] = { 0x00,0x00,0x50,0x56,0x14,0x09,0x01,0x07,
                                    0x07,0x80,0x80,0x80,0x80,0x00,0x00,0x5a
								  };//定义为2006年1月1日 星期三00:00:59,控制寄存器的命令

unsigned char code Pinbi_tab[7] = { 0xff,0x7f,0x3f,0x3f,0x07,0x9f,0xff };
									//屏蔽所读取的时钟的无效位码表
/*=========================================
实时时钟PCF8563  初始化子函数
==========================================*/
void Pcf8563_Init(void)
{
	unsigned char temp;
	while (SM_BUSY); 			
	SM_BUSY = 1; 					
	SMB0CN  = 0x44;                //SMBus0允许,在应答周期内返回“确认”应答 				
	COMMAND = ( PCF8563 | READ );
	HIGH_ADD= 0x02;
	Attrib  = 0;
	NByte   = 1;
	I2CDataBuff = &temp; 							
	STA = 1; 	                   //当作为主器件时,若总线空闲,则发出一个起始条件					
	while ( SM_BUSY );
	if( temp & 0x80 )
	{ 	  
		COMMAND = ( PCF8563 | WRITE ); 	  
		HIGH_ADD= 0x00;
		Attrib  = 0;
		NByte   = 16;
		I2CDataBuff = t_initab;
		STA = 1;
	}	 		
}

void Read_times(void)
{
	unsigned char i,j;
	while (SM_BUSY); 				
	SM_BUSY = 1; 					
	SMB0CN  = 0x44; 				
	COMMAND = ( PCF8563 | READ ); 	      
	HIGH_ADD= 0x02;
	Attrib  = 0;
	NByte   = 7;
	I2CDataBuff = RealTime.Clock; 							
	STA = 1; 						
	while (SM_BUSY);

	for( i=0;i<7;i++ )
	   RealTime.Clock[i]&=Pinbi_tab[i];
	for( i=0;i<3;i++ )
	{
	   j = RealTime.Clock[i];
	   RealTime.Clock[i] = RealTime.Clock[6-i];
	   RealTime.Clock[6-i] = j;
	}
}





void TestI2C (void)
{
	




	SMBus0_Init();
	SM_BUSY = 0;
	Pcf8563_Init();
	InitLCD();
						  
	Display(0,0,"www.ecoa.com");

	for (;;)
	{
		Read_times();
		
		LCD_DispChar(0,2,((RealTime.RT.Hour>>4)&0x0f)+0x30);//(RealTime.RT.Hour>>4)&0x0f); //128*64  取值x=0-128 y=0-8
		LCD_DispChar(8,2,(RealTime.RT.Hour&0x0f)+0x30);
		LCD_DispChar(16,2,':');
		LCD_DispChar(24,2,((RealTime.RT.Minute>>4)&0x0f)+0x30);
		LCD_DispChar(32,2,(RealTime.RT.Minute&0x0f)+0x30);
		LCD_DispChar(40,2,':');
		LCD_DispChar(48,2,((RealTime.RT.Second>>4)&0x0f)+0x30);
		LCD_DispChar(56,2,(RealTime.RT.Second&0x0f)+0x30);
		//在0,4处显示02/01/01
		LCD_DispChar(0,4,((RealTime.RT.Year>>4)&0x0f)+0x30); 
		LCD_DispChar(8,4,(RealTime.RT.Year&0x0f)+0x30);
		LCD_DispChar(16,4,'/');
		LCD_DispChar(24,4,((RealTime.RT.Month>>4)&0x0f)+0x30);
		LCD_DispChar(32,4,(RealTime.RT.Month&0x0f)+0x30);
		LCD_DispChar(40,4,'/');
		LCD_DispChar(48,4,((RealTime.RT.Day>>4)&0x0f)+0x30);
		LCD_DispChar(56,4,(RealTime.RT.Day&0x0f)+0x30);
		Delay1ms(500);	        
	}
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -