关于lpc2292外接ds1302时钟芯片的驱动程序
关于lpc2292外接ds1302时钟芯片的驱动程序
关于lpc2292外接ds1302时钟芯片的驱动程序
昨天调试好了LPC2292的外接时钟芯片DS1302,程序如下:
希望能对大家有所帮助,也希望能给予指正
#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
* 说明: 先写


