關(guān)于lpc2292外接ds1302時鐘芯片的驅(qū)動程序
希望能對大家有所幫助,也希望能給予指正
#defineIN_DS1302
//#ifndefinclude"config.h"
#include"config.h"
//#endif
/**************************************************************/
/*實時時鐘模塊時鐘芯片型號:DS1302*/
/**/
/**********************************************************/
#defineT_RST0x00004000/*P0.14實時時鐘復(fù)位線引腳*/
#defineT_IO0x00008000/*P0.15實時時鐘數(shù)據(jù)線引腳*/
#defineT_CLK0x00010000/*P0.16實時時鐘時鐘線引腳*/
#defineT_INCON0x00014000/*定義寫端口設(shè)置字*/
#defineT_OUTCON0x0001c000/*定義讀端口設(shè)置字*/
voidHold(uint32dly)
{
for(;dly>0;dly--);
}
voidv_InitDS1302(void)
{
IO0DIR=T_OUTCON;
}
/**********************************************************
*
*名稱:v_RTInputByte
*說明:
*功能:往DS1302寫入1Byte數(shù)據(jù)
*調(diào)用:
*輸入:ucDa寫入的數(shù)據(jù)
*返回值:無
***************************************************************/
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;/*相當(dāng)于匯編中的RRC*/
}
}
/**********************************************************
*
*名稱:ucharuc_RTOutputByte
*說明:
*功能:從DS1302讀取1Byte數(shù)據(jù)
*調(diào)用:
*輸入:
*返回值:ucDa
**************************************************************/
uint8uc_RTOutputByte(void)
{
uint8i;
uint8ucDa=0;
IO0DIR=T_INCON;
for(i=8;i>0;i--)
{
Hold(10);
ucDa>>=1;/*相當(dāng)于匯編中的RRC*/
if((IO0PINT_IO)!=0)///////////////
ucDa+=0x80;
IO0SET=T_CLK;
Hold(20);
IO0CLR=T_CLK;
Hold(10);
}
IO0DIR=T_OUTCON;
return(ucDa);
}
/**********************************************************
*
*名稱:v_W1302
*說明:先寫地址,后寫命令/數(shù)據(jù)
*功能:往DS1302寫入數(shù)據(jù)
*調(diào)用:v_RTInputByte()
*輸入:ucAddr:DS1302地址,ucDa:要寫的數(shù)據(jù)
*返回值:無
************************************************************/
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數(shù)據(jù)*/
IO0SET=T_CLK;/*T_CLK=1;*/
IO0CLR=T_RST;/*T_RST=0;*/
Hold(40);
}
/*********************************************************
*
*名稱:uc_R1302
*說明:先寫地址,后讀命令/數(shù)據(jù)
*功能:讀取DS1302某地址的數(shù)據(jù)
*調(diào)用:v_RTInputByte(),uc_RTOutputByte()
*輸入:ucAddr:DS1302地址
*返回值:ucDa:讀取的數(shù)據(jù)
***************************************************************/
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數(shù)據(jù)*/
IO0SET=T_CLK;/*T_CLK=1;*/
IO0CLR=T_RST;/*T_RST=0;*/
Hold(40);
return(ucDa);
}
/*********************************************************
*
*名稱:v_BurstW1302T
*說明:先寫地址,后寫數(shù)據(jù)(時鐘多字節(jié)方式)
*功能:往DS1302寫入時鐘數(shù)據(jù)(多字節(jié)方式)
*調(diào)用:v_RTInputByte()
*輸入:pSecDa:時鐘數(shù)據(jù)地址格式為:秒分時日月星期年控制
*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:時鐘多字節(jié)寫命令*/
for(i=8;i>0;i--)/*8Byte=7Byte時鐘數(shù)據(jù)+1Byte控制*/
{
v_RTInputByte(*pSecDa);/*寫1Byte數(shù)據(jù)*/
pSecDa++;
}
IO0SET=T_CLK;/*T_CLK=1;*/
IO0CLR=T_RST;/*T_RST=0;*/
Hold(40);
}
/*******************************************************
*
*名稱:v_BurstR1302T
*說明:先寫地址,后讀命令/數(shù)據(jù)(時鐘多字節(jié)方式)
*功能:讀取DS1302時鐘數(shù)據(jù)
*調(diào)用:v_RTInputByte(),uc_RTOutputByte()
*輸入:pSecDa:時鐘數(shù)據(jù)地址格式為:秒分時日月星期年
*7Byte(BCD碼)1B1B1B1B1B1B1B
*返回值:ucDa:讀取的數(shù)據(jù)
*************************************************************/
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:時鐘多字節(jié)讀命令*/
for(i=8;i>0;i--)
{
*pSecDa=uc_RTOutputByte();/*讀1Byte數(shù)據(jù)*/
pSecDa++;
}
IO0SET=T_CLK;/*T_CLK=1;*/
IO0CLR=T_RST;/*T_RST=0;*/
Hold(40);
}
/****************************************************
*
*名稱:v_BurstW1302R
*說明:先寫地址,后寫數(shù)據(jù)(寄存器多字節(jié)方式)
*功能:往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式)
*調(diào)用:v_RTInputByte()
*輸入:pReDa:寄存器數(shù)據(jù)地址
*返回值:無
***********************************************************/
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:時鐘多字節(jié)寫命令*/
for(i=31;i>0;i--)/*31Byte寄存器數(shù)據(jù)*/
{
v_RTInputByte(*pReDa);/*寫1Byte數(shù)據(jù)*/
pReDa++;
}
IO0SET=T_CLK;/*T_CLK=1;*/
IO0CLR=T_RST;/*T_RST=0;*/
Hold(40);
}
/**********************************************************
*
*名稱:uc_BurstR1302R
*說明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
*功能:讀取DS1302寄存器數(shù)據(jù)
*調(diào)用:v_RTInputByte(),uc_RTOutputByte()
*輸入:pReDa:寄存器數(shù)據(jù)地址
*返回值:無
***********************************************************/
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:時鐘多字節(jié)讀命令*/
for(i=31;i>0;i--)/*31Byte寄存器數(shù)據(jù)*/
{
*pReDa=uc_RTOutputByte();/*讀1Byte數(shù)據(jù)*/
pReDa++;
}
IO0SET=T_CLK;/*T_CLK=1;*/
IO0CLR=T_RST;/*T_RST=0;*/
Hold(40);
}
/*********************************************************
*
*名稱:v_Set1302
*說明:
*功能:設(shè)置初始時間
*調(diào)用: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,寫保護(hù)?*/
}
/*********************************************************
*
*名稱:v_Get1302
*說明:
*功能:讀取DS1302當(dāng)前時間
*調(diào)用:uc_R1302()
*輸入:ucCurtime:保存當(dāng)前時間地址。當(dāng)前時間格式為:秒分時日月星期年
*7Byte(BCD碼)1B1B1B1B1B1B1B
*返回值:無
*************************************************************/
voidv_Get1302(uint8ucCurtime[])
{
uint8i;
uint8ucAddr=0x81;
for(i=0;i7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr);/*格式為:秒分時日月星期年*/
ucAddr+=2;
}
}
評論