⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ht1380.c

📁 一款低价位时钟芯片的C驱动程序
💻 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 + -