📄 ds1302.c
字号:
/*
DS1302.c
MSP430F149开发板DS1302时钟芯片主程序
说明:调试中,还需检测写日期函数的日期自检部分的正确性
还没有检测RAM能否断电保护
此函数库功能不包含突发状态下多字节写读的功能
对一个寄存器写时,要先禁止写保护
Copyright(c)2008, 323实验室 罗佳芳
All rights reserved.
*/
#include <msp430x14x.h>
#include "DS1302.h"
//根据硬件电路进行修改
#define DS1302_DIR P2DIR
#define DS1302_IN P2IN
#define DS1302_OUT P2OUT
#define DS1302_RST BIT3
#define DS1302_SCLK BIT2
#define DS1302_SDA BIT4
#define DS1302_RST0 DS1302_OUT &=~DS1302_RST
#define DS1302_RST1 DS1302_OUT |= DS1302_RST
#define DS1302_SCLK0 DS1302_OUT &=~DS1302_SCLK
#define DS1302_SCLK1 DS1302_OUT |= DS1302_SCLK
#define DS1302_SDA0 DS1302_OUT &=~DS1302_SDA
#define DS1302_SDA1 DS1302_OUT |= DS1302_SDA
/****************************************************************************
* 名 称:DS1302_Delay()
* 功 能:延时函数
* 入口参数:无
* 出口参数:无
* 范 例:
* 说 明:
****************************************************************************/
void DS1302_Delay(unsigned int delayTime)
{
unsigned int i;
for(i=0;i<delayTime;i++);
}
/****************************************************************************
* 名 称:DS1302_Init()
* 功 能:DS1302初始化程序
* 入口参数:无
* 出口参数:无
* 范 例:
* 说 明: 初始化为00年00星期00月00日00时00分00秒
****************************************************************************/
void DS1302_Init(void)
{
unsigned char initDay[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //初始化时间
DS1302_DIR |=(DS1302_RST + DS1302_SCLK); //定义RST和SCLK口为输出口
DS1302_SCLK0; //起始时钟信号电平为低
DS1302_RST0;
DS1302_Delay(10);
DS1302_SCLK1;
DS1302_WriteDayData(initDay,HOUR_24,HOUR_AM);
}
/****************************************************************************
* 名 称:DS1302_WriteOneByte()
* 功 能:向DS1302写入一个字节
* 入口参数:wData : 待写入的数据
* 出口参数:无
* 范 例:
* 说 明:
****************************************************************************/
void DS1302_WriteOneByte(unsigned char wData)
{
unsigned char i;
DS1302_DIR |= DS1302_SDA; //数据I0口定义为输出
DS1302_RST1; //the reset signal must be aaserted high during read and write
for(i=0;i<8;i++)
{
DS1302_SDA0;
if(wData & BIT0) DS1302_SDA1; //如果需输出数据的当前的最后一位为1,刚输出高电平
DS1302_SCLK0;
DS1302_Delay(10);
DS1302_SCLK1; //上升沿写入DS1302
DS1302_Delay(10);
wData >>=1;
}
}
/****************************************************************************
* 名 称:DS1302_ReadOneByte()
* 功 能:从DS1302读出一个字节
* 入口参数:无
* 出口参数:rData : 读出的一个字节
* 范 例:
* 说 明:
****************************************************************************/
unsigned char DS1302_ReadOneByte(void)
{
unsigned char i,rData;
rData=0x00;
DS1302_DIR &= ~DS1302_SDA; //IO口为输入
DS1302_RST1; //进行读写时,RST信号必须保持为高电平
for(i=0;i<8;i++)
{
rData >>=1;
DS1302_SCLK1;
DS1302_Delay(10);
DS1302_SCLK0; //下降沿读取数据
DS1302_Delay(10);
if(DS1302_IN & DS1302_SDA) rData |= BIT7;
}
return(rData);
}
/****************************************************************************
* 名 称:DS1302_WriteRegByte()
* 功 能:向DS1302的某一个寄存器写入一个字节
* 入口参数:addr : DS1302寄存器的地址
wData : 待写入的数据
* 出口参数:无
* 范 例:
* 说 明: 给非控制寄存器写入数年据之前,一定要向控制寄存器写入命令0X00,禁用写保护
写完之后要禁用写保护,写入命令字0X80
可调用头文件中的宏定义 DS1302_WriteEnable; //禁用写保护
DS1302_WriteNEnable; //启用写保护
****************************************************************************/
void DS1302_WriteRegByte(unsigned char addr,unsigned char wData)
{
DS1302_RST0; //初始化部分
DS1302_SCLK0;
DS1302_RST1;
DS1302_WriteOneByte(addr); //先写入地址
DS1302_WriteOneByte(wData); //再写入数据
DS1302_SCLK1;
DS1302_RST0;
}
/****************************************************************************
* 名 称:DS1302_ReadRegByte()
* 功 能:从DS1302的某一个寄存器读出一个字节
* 入口参数:addr : DS1302寄存器的地址
* 出口参数:rData : 读出的一个字节
* 范 例:
* 说 明:
****************************************************************************/
unsigned char DS1302_ReadRegByte(unsigned char addr)
{
unsigned char rData = 0x00;
DS1302_RST0; //初始化部分
DS1302_SCLK0;
DS1302_RST1;
DS1302_WriteOneByte(addr); //写入地址
rData = DS1302_ReadOneByte(); //读出数据
DS1302_SCLK0;
DS1302_RST0;
return(rData);
}
/****************************************************************************
* 名 称:DS1302_WriteDayData()
* 功 能:向DS1302写入日期数据
* 入口参数:*dayData : 秒,分,时,日,月,星期,年 从低到高排列-->BCD码存储
此数据中不要写入格式信息,只写入纯日期
注意日期数据不能越界,越界数据将返回错误码0
hourType : HOUR_24/HOUR_12 24小时制/12小时制
AM_PM : HOUR_AM/HOUR_PM 上午/下午
* 出口参数:0 : 错误, 1 正确
* 范 例:
* 说 明: 此函数用来设置DS1302的日期,若要DS1302能够工作,还需要使振荡器允许工作,
振荡器的允许与禁止位在秒寄存器上,本次操作默认就打开了振荡器
此函数内部已经对写保护进行了操作,写保护位不对此函数产生影响,调用些函数后,
DS1302启动写保护
****************************************************************************/
unsigned char DS1302_WriteDayData(unsigned char *dayData,unsigned char hourType,unsigned char AM_PM)
{
unsigned char i,temp0,temp1;
unsigned char addr = DS1302_DataRegW;
//日期越界判断
//秒
temp0 = dayData[0] & 0x0f; //低四位
temp1 = dayData[0] & 0xf0; //高四位
temp1 >>=4; //移位至低四位进行判断
if(temp0>9 || temp1>5) return(0); //秒的范围是:00~59
//分
temp0 = dayData[1] & 0x0f;
temp1 = dayData[1] & 0xf0;
temp1 >>=4;
if(temp0>9 || temp1>5) return(0);
//时
temp0 = dayData[2] & 0x0f;
temp1 = dayData[2] & 0xf0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -