📄 pcf8563.c
字号:
/*-----------------------------------------------------------------------
* Copyright (c) 2008,广西师范大学 大学生科技创新基地
* 文 件 名:PCF8563.c
* 主要功能:应用IIC总线读写PCF8563
* 硬件环境:基地51单片机实验板第三版
* 时 钟:12MHz
* 作 者:韦坚
* 整 理:韦坚
* 开始日期:2008-1-2
* 完成日期:2008-1-2
* 整理日期:2008-7-24
------------------------------------------------------------------------*/
/*---------------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(uchar dat)
{
uchar 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
*************************************************************************/
uchar
read_byte_8563(void)
{
uchar i;
uchar 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)
{
uchar 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 + -