📄 ht1381.c
字号:
//==================================//
//
//===================================//
#include "MSP430x14x.h"
//#include "MSP430x42x.h"
#include <stdlib.h>
#define uchar unsigned char
//P5.1 SCL
//P5.2 SDA
#define SDA_1 P5OUT |= BIT2 //SDA = 1
#define SDA_0 P5OUT &=~ BIT2 //SDA = 0
#define SCL_1 P5OUT |= BIT1 //SCL = 1
#define SCL_0 P5OUT &=~ BIT1 //SCL = 0
#define DIR_IN P5DIR &=~ BIT2; SDA_1 //I/O口为输入
#define DIR_OUT P5DIR |= BIT2 //I/0口为输出
#define SDA_IN ((P5IN >> 2) & 0x01) //Read SDA
#define T_RST_1 P5OUT |= BIT3 //REST = 1
#define T_RST_0 P5OUT &=~ BIT3 //REST = 0
/*
#define SDA_1 P1OUT |= BIT1 //SDA = 1
#define SDA_0 P1OUT &=~ BIT1 //SDA = 0
#define SCL_1 P1OUT |= BIT0 //SCL = 1
#define SCL_0 P1OUT &=~ BIT0 //SCL = 0
#define DIR_IN P1DIR &=~ BIT1; SDA_1 //I/O口为输入
#define DIR_OUT P1DIR |= BIT1 //I/0口为输出
#define SDA_IN ((P1IN >> 1) & 0x01) //Read SDA
#define T_RST_1 P1OUT |= BIT2 //REST = 1
#define T_RST_0 P1OUT &=~ BIT2 //REST = 0
*/
void Delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++);
}
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往HT1381写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
unsigned char i;
for (i=0; i<8; i++)
{
SCL_0;
Delay(5);
if ((ucDa & 0x01) == 0x01)
{
SDA_1;
}
else
{
SDA_0;
}
Delay(5);
SCL_1;
ucDa = ucDa >> 1;
Delay(5);
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从HT1381读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
unsigned char i;
unsigned char TempBit = 0;
unsigned char TempData = 0;
SCL_0;
Delay(5);
SDA_1;
DIR_IN;
for (i=0; i<8; i++)
{
Delay(5);
SCL_1;
Delay(5);
if (SDA_IN == 0x01 /*sda==1*/)
{
TempBit = 1;
}
else
{
TempBit = 0;
}
TempBit = TempBit << 7;
TempData = (TempData >> 1) | TempBit;
SCL_0;
}
Delay(5);
DIR_OUT;
return(TempData);
}
/********************************************************************
*
* 名称: v_W1381
* 说明: 先写地址,后写命令/数据
* 功能: 往HT1381写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: HT1381地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1381(uchar ucAddr, uchar ucDa)
{
T_RST_0;
SCL_0;
T_RST_1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
SCL_1;
T_RST_0;
}
/********************************************************************
*
* 名称: uc_R1381
* 说明: 先写地址,后读命令/数据
* 功能: 读取HT1381某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: HT1381地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1381(uchar ucAddr)
{
uchar ucDa;
T_RST_0;
SCL_0;
T_RST_1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
SCL_1;
T_RST_0;
return(ucDa);
}
/********************************************************************
*
* 名称: v_Set1381
* 说明:
* 功能: 设置初始时间
* 调用: v_W1381()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1381(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1381(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1381(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1381(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1381
* 说明:
* 功能: 读取HT1381当前时间
* 调用: uc_R1381()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1381(uchar *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
*ucCurtime = uc_R1381(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucCurtime ++;
ucAddr += 2;
}
}
//**********************************************************************
//调用时钟IC的时候要先初始化三个IO口,设置成输出状态
//**********************************************************************
uchar time_w[7] = {0x30,0x30,0x08,0x10,0x10,0x01,0x08},time_r[7];
void main(void)
{
unsigned char a,b;
unsigned char *p;
WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer
DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO
while(1)
{
P5DIR = 0xff;
DIR_OUT;
v_W1381(0x8e,0x00);
v_W1381(0x80,0x00);
a = 1;
while(a);
p = time_w;
v_Set1381(p);
p = time_r;
v_Get1381(p);
v_W1381(0x80,0x04);
b = uc_R1381(0x81);
b++;
v_W1381(0x82,0x12);
b = uc_R1381(0x83);
a = 1;
while(a);
b++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -