关于lpc2292外接ds1302时钟芯片的驱动程序
希望能对大家有所帮助,也希望能给予指正
#defineIN_DS1302
//#ifndefinclude"config.h"
#include"config.h"
//#endif
/**************************************************************/
/*实时时钟模块时钟芯片型号:DS1302*/
/**/
/**********************************************************/
#defineT_RST0x00004000/*P0.14实时时钟复位线引脚*/
#defineT_IO0x00008000/*P0.15实时时钟数据线引脚*/
#defineT_CLK0x00010000/*P0.16实时时钟时钟线引脚*/
#defineT_INCON0x00014000/*定义写端口设置字*/
#defineT_OUTCON0x0001c000/*定义读端口设置字*/
voidHold(uint32dly)
{
for(;dly>0;dly--);
}
voidv_InitDS1302(void)
{
IO0DIR=T_OUTCON;
}
/**********************************************************
*
*名称:v_RTInputByte
*说明:
*功能:往DS1302写入1Byte数据
*调用:
*输入:ucDa写入的数据
*返回值:无
***************************************************************/
voidv_RTInputByte(uint8ucDa)
{
uint8i;
for(i=8;i>0;i--)
{
if((ucDa0x01)!=0)
IO0SET=T_IO;
else
IO0CLR=T_IO;
Hold(10);
IO0SET=T_CLK;
Hold(20);
IO0CLR=T_CLK;
Hold(10);
ucDa>>=1;/*相当于汇编中的RRC*/
}
}
/**********************************************************
*
*名称:ucharuc_RTOutputByte
*说明:
*功能:从DS1302读取1Byte数据
*调用:
*输入:
*返回值:ucDa
**************************************************************/
uint8uc_RTOutputByte(void)
{
uint8i;
uint8ucDa=0;
IO0DIR=T_INCON;
for(i=8;i>0;i--)
{
Hold(10);
ucDa>>=1;/*相当于汇编中的RRC*/
if((IO0PINT_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:要写的数据
*返回值:无
************************************************************/
voidv_W1302(uint8ucAddr,uint8ucDa)
{
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:读取的数据
***************************************************************/
uint8uc_R1302(uint8ucAddr)
{
uint8ucDa;
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码)1B1B1B1B1B1B1B1B
*返回值:无
*************************************************************/
voidv_BurstW1302T(uint8*pSecDa)
{
uint8i;
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码)1B1B1B1B1B1B1B
*返回值:ucDa:读取的数据
*************************************************************/
voidv_BurstR1302T(uint8*pSecDa)
{
uint8i;
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:寄存器数据地址
*返回值:无
***********************************************************/
voidv_BurstW1302R(uint8*pReDa)
{
uint8i;
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:寄存器数据地址
*返回值:无
***********************************************************/
voidv_BurstR1302R(uint8*pReDa)
{
uint8i;
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码)1B1B1B1B1B1B1B
*返回值:无
***********************************************************/
voidv_Set1302(uint8*pSecDa)
{
uint8i;
uint8ucAddr=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码)1B1B1B1B1B1B1B
*返回值:无
*************************************************************/
voidv_Get1302(uint8ucCurtime[])
{
uint8i;
uint8ucAddr=0x81;
for(i=0;i7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr);/*格式为:秒分时日月星期年*/
ucAddr+=2;
}
}
评论