新闻  |   论坛  |   博客  |   在线研讨会
lpc2214外接ds1302时钟芯片的驱动程序
lonyi | 2010-05-25 22:08:49    阅读:1482   发布文章

#define IN_DS1302
//#ifndef  include  "config.h"
#include  "config.h"
//#endif
/*********************************************************************/
/* 实时时钟模块 时钟芯片型号:DS1302 */
/**/
/*********************************************************************/
#define   T_RST      0x00004000        /* P0.14  实时时钟复位线引脚 */
#define   T_IO        0x00008000        /* P0.15  实时时钟数据线引脚 */
#define   T_CLK       0x00010000        /* P0.16  实时时钟时钟线引脚 */
#define   T_INCON   0x00014000      /* 定义写端口设置字   */
#define   T_OUTCON  0x0001c000      /* 定义读端口设置字   */

void Hold(uint32  dly)
{  
   for(; dly>0; dly--);
}


void v_InitDS1302(void)

  IO0DIR = T_OUTCON;
}
/******************************************************************** 
*
* 名称: v_RTInputByte
* 说明: 
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据 
* 返回值: 无
***********************************************************************/

void v_RTInputByte(uint8 ucDa) 

uint8 i;

for(i=8; i>0; i--)
{
if((ucDa&0x01) != 0)
   IO0SET = T_IO;
else
   IO0CLR = T_IO;
Hold(10);
IO0SET = T_CLK;
Hold(20);
IO0CLR = T_CLK;
Hold(10);

ucDa >>= 1;  /*相当于汇编中的 RRC */

}
/******************************************************************** 
*
* 名称: uchar uc_RTOutputByte
* 说明: 
* 功能: 从DS1302读取1Byte数据
* 调用: 
* 输入: 
* 返回值: ucDa
***********************************************************************/
uint8 uc_RTOutputByte(void) 

uint8 i;
uint8 ucDa=0;
IO0DIR = T_INCON;
for(i=8; i>0; i--)
{
Hold(10);

ucDa >>= 1;  /*相当于汇编中的 RRC */
if((IO0PIN&T_IO) !=0 )///////////////
    ucDa += 0x80;

IO0SET = T_CLK;
Hold(20);
IO0CLR = T_CLK;
Hold(10);

IO0DIR = T_OUTCON;
return(ucDa); 
}
/******************************************************************** 
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte() 
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uint8 ucAddr, uint8 ucDa)
{
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);

/******************************************************************** 
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uint8 uc_R1302(uint8 ucAddr)
{
uint8 ucDa;
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);

return(ucDa);
}
/******************************************************************** 
*
* 名称: v_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte() 
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_BurstW1302T(uint8 *pSecDa)
{
uint8 i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
v_RTInputByte(*pSecDa);/* 写1Byte数据*/
pSecDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);

/******************************************************************** 
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uint8 *pSecDa)
{
uint8 i;
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--) 
{
*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
pSecDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/******************************************************************** 
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte() 
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstW1302R(uint8 *pReDa)
{
uint8 i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31;i>0;i--) /*31Byte 寄存器数据 */
{
v_RTInputByte(*pReDa); /* 写1Byte数据*/
pReDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);

/******************************************************************** 
*
* 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstR1302R(uint8 *pReDa)
{
uint8 i;
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
pReDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/******************************************************************** 
*
* 名称: v_Set1302
* 说明: 
* 功能: 设置初始时间
* 调用: v_W1302() 
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uint8 *pSecDa) 
{
uint8 i;
uint8 ucAddr = 0x80; 
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)

v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 
*
* 名称: v_Get1302
* 说明: 
* 功能: 读取DS1302当前时间
* 调用: uc_R1302() 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uint8 ucCurtime[]) 
{
uint8 i;
uint8 ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}  

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客