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

📄 pcf8563.c

📁 8563_LED_Display(时钟芯片)
💻 C
字号:
/*
****************************************************************************
 * College of Physics And electronic engineering,GUANGXI Normal University  .
 *
 * All rights reserved. ucosII's source code is an unpublished work and the
 * use of a copyright notice does not imply otherwise. This source code
 * contains confidential trade secret material of College of Physics And 
 * electronic engineering,GUANGXI Normal University . Any attemp
 * or participation in deciphering, decoding, reverse engineering or in any
 * way altering the source code is stricitly prohibited, unless the prior
 * written consent of College of Physics And electronic engineering,GUANGXI Normal University 
 * is obtained.

* file name:18PCF8563.c
* description: 时钟驱动程序接口
* company:大学生科技创新基地
* data:2008-10-1
* author:黄一平
* modify:
//-*****************************************************************************/
#include <PCF8563.h>


//unsigned char sec,min,hou,day,week,mon,year;
unsigned char  Ini_8563[7] = {0,0,0,1,2,1,8};	  //秒、分、小时、日、星期、月、年
/*---------------IIC总线操作流程-----------------------------------------
*  一、 写操作顺序:
*    启动总线→写器件地址→写单元地址→写数据→. . .→关闭总线
*    器件地址组成:固定地址(厂家)+外部连线地址+1位读写地址(1:读 ,0:写)
*  二、 指定单元读操作:
*    启动总线→写器件地址→写单元地址→启动总线→写入要读出的器件地址→
*    读数据→. . .→关闭总线
*  三、 当前单元读操作
*    启动总线→写入要读出的器件地址→读数据→. . .→关闭总线
------------------------------------------------------------------------*/


/*---------------IIC总线器件地址-----------------------------------------
*  IIC总线地址格式:1010XXXX
*  地址说明:
*        BIT7-BIT4:IIC总线地址高4位固定为1010,即10进制A
*        BIT3-BIT1:地址为生产厂家规定地址,如PCF8563为001,24C系列为000
*        BIT0     :读写控制位,0:写操作;1:读操作          
------------------------------------------------------------------------*/


/************************************************************************
* 名        称 :void start_8563(void)
* 功        能 :启动I2C总线
* 描        述 :时钟线为高电平,数据线为下降沿时启动总线
* 输        入 :NULL
* 全 局 变  量 :NULL  
* 返   回   值 :NULL
* 调        用 :NULL
* 编 写 日  期 :2008-7-23 
* 最后修改日期 :2008-7-23
************************************************************************/
void start_8563(void)
{
  scl_8563 = 1;
  sda_8563 = 1;
  sda_8563 = 0;
  somenop;
  scl_8563 = 0;   //钳住总线,并为数据变化做准备  
}

/************************************************************************
* 名        称 :void stop_8563(void)
* 功        能 :停止I2C总线
* 描        述 :时钟线为高电平,数据线为上升沿时停止总线
* 输        入 :NULL
* 全 局 变  量 :NULL  
* 返   回   值 :NULL
* 调        用 :NULL
* 编 写 日  期 :2008-7-23 
* 最后修改日期 :2008-7-23
************************************************************************/
void stop_8563(void)
{
  sda_8563 = 0;
  scl_8563 = 1;
  sda_8563 = 1;
  somenop;
  scl_8563 = 0;	 //钳住总线,并为数据变化做准备  
}

/************************************************************************
* 名        称 :void write_byte_8563(uchar dat)
* 功        能 :写一个字节数据到PCF8563
* 输        入 :dat:要写入的数据
* 全 局 变  量 :NULL  
* 返   回   值 :NULL
* 调        用 :NULL
* 编 写 日  期 :2008-7-23 
* 最后修改日期 :2008-7-23
************************************************************************/
void write_byte_8563(unsigned char dat) 
{
  unsigned char i;
  scl_8563 = 0;
  for (i=0;i<8;i++) //共8位
  {
	if ( dat & 0x80)
	{
	  sda_8563 = 1;
	}
	else 
	{
	  sda_8563 = 0;
	}
	 
	scl_8563 = 1;
	somenop;
	scl_8563 = 0;
	dat    <<= 1;
  }
  sda_8563 = 1;   //写完一个字节后释放总线
  scl_8563 = 1;   //加上第九个脉冲,接收应答位
  scl_8563 = 0;
}

/*************************************************************************
* 名        称 :uchar read_byte_8563(void)
* 功        能 :从PCF8563读出一个字节数据
* 输        入 :NULL
* 全 局 变  量 :NULL  
* 返   回   值 :a:返回读出是数据
* 调        用 :NULL
* 说        明 :从最高位开始读出
* 编 写 日  期 :2008-7-23 
* 最后修改日期 :2008-7-23
*************************************************************************/
unsigned char read_byte_8563(void)
{
   unsigned char i;
   unsigned char a  = 0;
   sda_8563 = 1;
   for(i=0;i<8;i++)
   {
	 scl_8563 = 1;
	 a <<= 1;		 //先进行移位操作,以免最后一位不能读出
	 a |= sda_8563;
	 scl_8563 = 0;
	 somenop;
    }
	sda_8563 = 1;	   //读完一个字节后释放总线
	scl_8563 = 0;	   //加上第九个脉冲,接收应答位
	return (a);
}

/*************************************************************************
* 名        称 :void  set_8563(void)
* 功        能 :初始化及修改PCF8563中时间数据
* 输        入 :NULL
* 全 局 变  量 :NULL  
* 返   回   值 :NULL
* 调        用 :NULL
* 编 写 日  期 :2008-7-23 
* 最后修改日期 :2008-7-23
*************************************************************************/
/*void  
set_8563(void)
{  
   unsigned char  i,j;

   for(i=0;i<7;i++)
   {
	  if(i==4)
	  {
	  	j=(Ini_8563[i])&0x07;  //星期数据,直接写入就可以了
	  }
	  else
	  {
	  	j=((((Ini_8563[i])/10)<<4)&0xF0)|(((Ini_8563[i])%10)&0x0F);	//10进制转BCD码
	  }
	  start_8563(); 
      write_byte_8563(0xa2);  //选择器件
      write_byte_8563(i+0x02);//选择单元地址
      write_byte_8563(j);     //写入数据
      somenop;
   }
   stop_8563();
}
	*/
/*************************************************************************
* 名        称 :void read_8563(void)
* 功        能 :初始化及修改PCF8563中时间数据
* 输        入 :NULL
* 全 局 变  量 :NULL  
* 返   回   值 :NULL
* 调        用 :NULL
* 编 写 日  期 :2008-7-23 
* 最后修改日期 :2008-7-23
*************************************************************************/
void read_8563(void)
{
  unsigned int s;
  for(s=0;s<7;s++)
  {
     start_8563();
	 write_byte_8563(0xa2);  //写操作器件地址  
	 write_byte_8563(s+0x02);//写入单元地址  
	 start_8563();
	 write_byte_8563(0xa3);  //读操作器件地址  
	 switch ( s )
	 {
		case 0: sec  = (read_byte_8563() ) & 0x7F;break;//获取秒数据   
		case 1: min  = (read_byte_8563() ) & 0x7F;break;//获取分钟  
	    case 2: hou  = (read_byte_8563() ) & 0x3F;break;//获取小时	 
		case 3: day  = (read_byte_8563() ) & 0x3F;break;//获取日  
		case 4: week = (read_byte_8563() ) & 0x07;if(week==0)week=7;break;//获取星期  
		case 5: mon  = (read_byte_8563() ) & 0x9F;break;//获取月  
		case 6: year = (read_byte_8563() ) & 0xFF;break;//获取年  
		default:break;
	  }
  }
  stop_8563(); 
}

⌨️ 快捷键说明

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