📄 rtc.c
字号:
////////////////////////////////////////////////////////////////
// 无线传感器网络节点程序 //
// 实时时钟部分 //
// 编写:蒋路茸 //
// 日期:2008.6 //
// 版本:0.1 //
////////////////////////////////////////////////////////////////
// P56 SCLK //
// P54 RST //
// P55 SDA //
////////////////////////////////////////////////////////////////
#include <msp430x14x.h>
#include "rtc.h"
/* 时间格式
unsigned char Setting_Time[7]=
{
0x08, //--------十位-------|-------个位--------| 年份(当前08年)
0x00, // |-----个位-----| 星期(当前周日)
0x05, // |十位|-------个位--------| 月份(当前05月)
0x28, // |--十位---|-------个位--------| 日期(当前28号)
0x14, //-12H| |--十位---|-------个位--------| 小时(当前14点)
0x30, // |-----十位-----|-------个位--------| 分钟(当前30分)
0x20 // |-----十位-----|-------个位--------| 秒钟(当前20秒)
};
*/
///////////////////////////////////////////////////
// 名称:Dtc_Delay
// 功能:延时
// 输入:uint
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Rtc_Delay(unsigned int i)
{
unsigned int j;
for(j=0;j<i;j++)
_NOP();
}
///////////////////////////////////////////////////
// 名称:Dtc_Reset
// 功能:重置
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Rtc_Reset(void)
{
RTC_DIR |= (RTC_RST + RTC_SCLK);
RTC_SCLK_LO;
RTC_RST_LO;
Rtc_Delay(10);
RTC_SCLK_HI;
}
///////////////////////////////////////////////////
// 名称:Rtc_Write_Byte
// 功能:向RTC写入一个字节,数据由低位至高位依次发送
// 输入:uchar
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Rtc_Write_Byte(unsigned char byte)
{
unsigned char i;
RTC_RST_HI; //整个数据发送期间置为高电平
RTC_DIR |= RTC_SDA; //置SDA为输出方向
for(i=8;i>0;i--)
{
RTC_SDA_LO;
if(byte & BIT0) //发送位为0,则RTC数据位置高
RTC_SDA_HI;
RTC_SCLK_LO;
Rtc_Delay(20);
RTC_SCLK_HI;
Rtc_Delay(20);
byte >>= 1;
}
}
///////////////////////////////////////////////////
// 名称:Rtc_Read_Byte
// 功能:从RTC中读取一个字节,数据读取从最高位开始
// 输入:null
// 输出:uchar
// 返回:null
///////////////////////////////////////////////////
unsigned char Rtc_Read_Byte(void)
{
unsigned char i;
unsigned char bytetemp;
bytetemp = 0x00; //初始化清零
RTC_RST_HI; //复位引脚为高电平,逻辑控制有效
RTC_DIR &= ~RTC_SDA; //置SDA为输入方向
for(i=0;i<7;i++)
{
RTC_SCLK_HI;
Rtc_Delay(20);
RTC_SCLK_LO;
Rtc_Delay(20);
if((RTC_IN & RTC_SDA) == RTC_SDA)
bytetemp |= BIT7;
bytetemp >>= 1;
}
return bytetemp;
}
///////////////////////////////////////////////////
// 名称:Rtc_Write_Data
// 功能:向RTC中写入地址后写入数据
// 输入:uchar uchar
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Rtc_Write_Data(unsigned char addr,unsigned char byte)
{
RTC_RST_LO;
RTC_SCLK_LO;
RTC_RST_HI;
Rtc_Write_Byte(addr); //写入地址
Rtc_Write_Byte(byte); //写入数据
RTC_SCLK_HI;
RTC_RST_LO; //逻辑操作完毕,清RST
}
///////////////////////////////////////////////////
// 名称:Rtc_Read_Data
// 功能:向RTC写入地址后,从RTC中读取数据
// 输入:uchar
// 输出:uchar
// 返回:null
///////////////////////////////////////////////////
unsigned char Rtc_Read_Data(unsigned char addr)
{
unsigned char byte;
RTC_RST_LO;
RTC_SCLK_LO;
RTC_RST_HI;
Rtc_Write_Byte(addr); //写入地址
byte = Rtc_Read_Byte(); //读出数据
RTC_SCLK_LO;
RTC_RST_LO; //逻辑操作完毕,清RST
return byte;
}
///////////////////////////////////////////////////
// 名称:Rtc_Set_Data
// 功能:按照SettingData的设置设置RTC的时间
// 输入:uchar *
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Rtc_Set_Data(unsigned char *datetimeBuffer)
{
unsigned char addr = 0x8C;
unsigned char temp;
unsigned char *tempBuffer;
tempBuffer = datetimeBuffer;
Rtc_Write_Data(0x8E,0x00); //写入控制命令,禁用写保护
Rtc_Write_Data(addr,*tempBuffer); //只记年月日时分秒,不记周几
tempBuffer++;
addr -= 4;
for(temp=2;temp<7;temp++)
{
Rtc_Write_Data(addr,*tempBuffer);
tempBuffer++;
addr -= 2;
}
Rtc_Write_Data(0x8E,0x80); //写入控制命令,启用写保护
}
///////////////////////////////////////////////////
// 名称:Rtc_Set_Data
// 功能:读取RTC时间到ReadingData中
// 输入:uchar *
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Rtc_Get_Data(unsigned char *str)
{
unsigned char i;
unsigned char addr = 0x8D;
*str = Rtc_Read_Data(addr); //只记年月日时分秒,不记周几
str++;
addr -= 4;
for(i=2;i<7;i++)
{
*str = Rtc_Read_Data(addr);
str++;
addr -= 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -