📄 ht1380.c
字号:
//-----------------------------------------------------------------
// Timekeeper.c
// Real time access for HT1380
//
// By: zxw 2003.08.20(RTime1.c)
// By: FSX 2003-8-22 10:26
// By: SG 2004/02/23(HT1380)
//-----------------------------------------------------------------
// 说明:
// 外部须定义boTimekeeperRst、boTimekeeperClk、bioTimekeeperSda;
// 外部须定义RealTimeFormat;
// 振荡器起振后一直处于工作状态,不再进入Standby。
//----------------------------------------------------------------
#define Modul_HT1380 1
#include "805xALL.h" // 定义51系列常用定义
//---------------------------------------------------------------
// 变量定义
//---------------------------------------------------------------
//***************************************************************
// void Timekeeper_ReadTime(void)
//
// Func: 从Ht1380顺序读时间值(BCD),多字节的
//***************************************************************
void Timekeeper_ReadTime(void)
{
boTimekeeperClk = FALSE;
HT1380_EnWrite(); // 开写保护
HT1380_EnOsc(); // 振荡器工作
boTimekeeperRst = TRUE; // res脚置高
HT1380_Write(cnReadTimeCmd); // 写多字节读命令
RealTime.Second = DecToHexByte(HT1380_Read()); // 秒
RealTime.Minute = DecToHexByte(HT1380_Read()); // 分
RealTime.Hour = DecToHexByte(HT1380_Read()); // 小时
RealTime.Day = DecToHexByte(HT1380_Read()); // 日
RealTime.Month = DecToHexByte(HT1380_Read()); // 月
RealTime.Week = DecToHexByte(HT1380_Read()); // 星期
RealTime.Year = DecToHexByte(HT1380_Read()); // 年
HT1380_Read();
boTimekeeperRst = FALSE; // 清res,清clk
boTimekeeperClk = FALSE;
if ((RealTime.Second > 59) ||
(RealTime.Minute > 59) ||
(RealTime.Hour > 23) ||
(RealTime.Day > 31 || RealTime.Day == 0) ||
(RealTime.Month > 12 || RealTime.Month == 0) ||
(RealTime.Year > 99))
{
RealTimeReset();
}
}
//***************************************************************
// void Timekeeper_WriteTime(void)
//
// Func: 向Ht1380顺序写时间值(BCD),多字节的
//***************************************************************
void Timekeeper_WriteTime(void)
{
boTimekeeperClk = FALSE;
HT1380_EnWrite(); // 开保护
HT1380_EnOsc(); // 置振荡器工作
boTimekeeperRst = TRUE;
boTimekeeperClk = FALSE;
HT1380_Write(cnWriteTimeCmd); // 写多字节写命令
// RealTime.Second = 0; // 设置时秒归零
HT1380_Write(HexToBcd(RealTime.Second)); // 秒
HT1380_Write(HexToBcd(RealTime.Minute));
HT1380_Write(HexToBcd(RealTime.Hour));
HT1380_Write(HexToBcd(RealTime.Day));
HT1380_Write(HexToBcd(RealTime.Month));
HT1380_Write(HexToBcd(RealTime.Week));
HT1380_Write(HexToBcd(RealTime.Year));
HT1380_Write(0x00); //
boTimekeeperRst = FALSE;
boTimekeeperClk = FALSE;
HT1380_DisWrite();
}
//********************************************
// void HT1380_EnWrite(void)
//
// func: 允许写入
//********************************************
void HT1380_EnWrite(void)
{
boTimekeeperRst = TRUE;
_nop_();
HT1380_Write(cnWriteWPCmd); // 写WP命令
HT1380_Write(cnEnWriteData); // 允许写数据
_nop_();
_nop_();
_nop_();
boTimekeeperClk = FALSE;
boTimekeeperRst = FALSE;
_nop_();
_nop_();
_nop_();
}
//********************************************
// void HT1380_DisWrite(void)
//
// func:禁止写入
//********************************************
void HT1380_DisWrite(void)
{
boTimekeeperRst = TRUE;
_nop_();
HT1380_Write(cnWriteWPCmd); // 写WP命令
HT1380_Write(cnDisWriteData); // 禁止写数据
_nop_();
_nop_();
_nop_();
boTimekeeperClk = FALSE;
boTimekeeperRst = FALSE;
_nop_();
_nop_();
_nop_();
}
//********************************************
//void HT1380_EnOsc(void)
//
//func:让振荡器工作
//********************************************
void HT1380_EnOsc(void)
{
BYTE TempSecond;
boTimekeeperRst = FALSE;
_nop_();
boTimekeeperClk = FALSE;
boTimekeeperRst = TRUE;
HT1380_Write(cnReadSecondCmd);
TempSecond = HT1380_Read();
boTimekeeperRst = FALSE;
_nop_();
_nop_();
boTimekeeperClk = FALSE;
boTimekeeperRst = TRUE;
HT1380_Write(cnWriteCHCmd); // 写振荡器工作命令
HT1380_Write(TempSecond & 0x7f); // 振荡器工作
boTimekeeperClk = FALSE;
boTimekeeperRst = FALSE;
_nop_();
_nop_();
}
//*******************************************
//void Timekeeper_Reset(void)
//
//func:上电重置:启振、写保护有效
//*****************************************
void Timekeeper_Reset(void)
{
boTimekeeperClk = FALSE;
boTimekeeperRst = FALSE;
bioTimekeeperSda = FALSE;
HT1380_EnWrite(); // 允许写入
HT1380_EnOsc(); // 起振
HT1380_DisWrite(); //
}
//**********************************************
//BYTE HT1380_Read(void)
//
//func: 从1380读一个字节
//**********************************************
BYTE HT1380_Read(void)
{
BYTE ReadDataVal;
BYTE i;
ReadDataVal = 0x00;
for(i = 0;i < 8;i++)
{
boTimekeeperClk = TRUE;
_nop_();
_nop_();
_nop_();
ReadDataVal >>= 1;
if(bioTimekeeperSda)
{
ReadDataVal += 0x80;
}
bioTimekeeperSda = TRUE; // 设置为输入
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
boTimekeeperClk = FALSE; // 下降延,读数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
return(ReadDataVal);
}
//**********************************************
//BYTE HT1380_Write(void)
//
//func: 向1380写一个字节
//**********************************************
void HT1380_Write(BYTE CmdOrData)
{
BYTE i;
for(i = 0;i <= 7;i++)
{
boTimekeeperClk = FALSE;
_nop_();
_nop_();
_nop_();
bioTimekeeperSda = (BOOL)(CmdOrData & 0x01);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CmdOrData >>= 1;
boTimekeeperClk = TRUE; // 上升延写数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
boTimekeeperClk = FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -