?? 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 + -