📄 ht1380.c
字号:
/*******************************************************************************
* 版权所有(C)2005 深圳豪恩科技有线公司
*
* 文件名称: HT1380.C
* 文件标识:
* 内容摘要: 对外围器件HT1380操作的各种子程序
* 其他说明:
* 当前版本:
* 作 者: 涂常亮
* 完成日期:
*
* 修改记录1
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
*修改记录2
*******************************************************************************/
#include <reg54.h>
#include <intrins.h>
#define RegSec 0
#define RegMint 1
#define RegHr 2
#define RegDate 3
#define RegM 4
#define RegDay 5
#define RegYear 6
#define RegWP 7
#define REG_SEC 0
#define REG_MIN 1
#define REG_HR 2
#define REG_DATE 3
#define REG_MONTH 4
#define REG_DAY 5
#define REG_YR 6
#define REG_WP 7
#define YR_INIT 0x00
#define MONTH_INIT 0x01
#define DATE_INIT 0x01
#define HR_INIT 0x00
#define MIN_INIT 0x00
#define CMD_WRT 0x80
#define CMD_READ 0x81
#define CMD_WRT_SEC 0x80
#define CMD_READ_SEC 0x81
#define CMD_WRT_MINUT 0x82
#define CMD_READ_MINUT 0x83
#define CMD_WRT_HR 0x84
#define CMD_READ_HR 0x85
#define CMD_WRT_DATE 0x86
#define CMD_READ_DATA 0x87
#define CMD_WRT_MON 0x88
#define CMD_READ_MON 0x89
#define CMD_WRT_DAY 0x8A
#define CMD_READ_DAY 0x8B
#define CMD_WRT_YR 0x8C
#define CMD_READ_YR 0x8D
#define CMD_WRT_WP 0x8E
#define CMD_READ_WP 0x8F
#define CMD_READ_H 0x85
#define CMD_WRT_HR 0x84
sbit pin_SCLK = P1^0;
sbit pin_SIO = P1^1;
sbit pin_RESET = P1^2;
void InitHT1380(void);
void ComuStart(void);
void ComuStop(void);
void SendByte(unsigned char ucData);
unsigned char ReceiByte(void);
//unsigned char ReadReg(unsigned char ucRegAdd);
unsigned char ReadTime(unsigned char ucRegAdd);
//void WriteReg(unsigned char ucRegAdd, unsigned char ucData);
void WriteTime(unsigned char ucRegAdd, unsigned char ucData);
bit ResetHT1380(void);
//下面两个函数LHD6000的主程序中有实现部分,后面本文件中的实现部分被转成注释
unsigned char BCD_Hex(unsigned char ucNumBCD);
bit IsBCD(unsigned char ucNum_IsBCD);
/*******************************************************************************
* 函数名称: void InitHT1380(void);
* 功能描述: 初始化HT1380,使其起振。
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void InitHT1380(void)
{
unsigned char ucTmp_Init;
//bit FlagReadOk = 1;
//去除写保护
/*ComuStart(); //原来的读写操作没有去除写保护的部分,现不需这段程序
SendByte(0x8E);
SendByte(0x00);
pin_RESET = 0;*/
//写允许晶振启动,秒钟寄存器最高位清零
ucTmp_Init = ReadTime(REG_SEC);
if (0 != (ucTmp_Init & 0x80)) //已经允许,不再重写
{
WriteTime(REG_SEC, ucTmp_Init & 0x7F);
}
//WriteTime(REG_SEC, ReadTime(REG_SEC) & 0x7F);
ucTmp_Init = ReadTime(REG_HR);
if (0 != (ucTmp_Init & 0x80)) //0 表示使用24小时制
{
WriteTime(REG_HR, ucTmp_Init & 0x7F);
}
//IsBCD()和BCD_Hex()在LHD6000的主程序中有实现部分,后面本文件中的实现部分被转成注释
/*FlagReadOk &= IsBCD(ReadTime(REG_YR)); //暂不用
ucTmp_Init = BCD_Hex(ReadTime(REG_MONTH));
FlagReadOk &= ((0 != ucTmp_Init) && (12 >= ucTmp_Init));
ucTmp_Init = BCD_Hex(ReadTime(REG_DATE));
FlagReadOk &= ((0 != ucTmp_Init) && (31 >= ucTmp_Init));
ucTmp_Init = ReadTime(REG_HR);
FlagReadOk &= ((0x23 >= ucTmp_Init) && (IsBCD(ucTmp_Init)));
ucTmp_Init = ReadTime(REG_MIN);
FlagReadOk &= ((0x59 >= ucTmp_Init) && (IsBCD(ucTmp_Init)));
if (FlagReadOk)
{
return;
}
else
{
ResetHT1380();
}*/
}
/*******************************************************************************
* 函数名称: void ComuStart(void);
* 功能描述: 通讯开始
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
/*bit ResetHT1380(void)
{
unsigned char ucTimesTry = 3;
bit FlagResetOK = 0;
while (!FlagResetOK && (0 != ucTimesTry))
{
WriteTime(REG_YR, YR_INIT);
WriteTime(REG_MONTH, MONTH_INIT);
WriteTime(REG_DATE, DATE_INIT);
WriteTime(REG_HR, HR_INIT);
WriteTime(REG_MIN, MIN_INIT);
FlagResetOK = ( (YR_INIT == ReadTime(REG_YR))
&& (MONTH_INIT == ReadTime(REG_MONTH))
&& (DATE_INIT == ReadTime(REG_DATE))
&& (HR_INIT == ReadTime(REG_HR))
&& (MIN_INIT == ReadTime(REG_MIN))
);
ucTimesTry--;
}
if (0 == ucTimesTry)
{
return 0;
}
else
{
return 1;
}
}*/
/*******************************************************************************
* 函数名称: void ComuStart(void);
* 功能描述: 通讯开始
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void ComuStart(void)
{
pin_RESET = 0;
_nop_();
pin_SCLK = 0;
_nop_();
pin_SIO = 0;
_nop_();
_nop_();
_nop_();
pin_RESET =1;
}
/*******************************************************************************
* 函数名称: void ComuStart(void);
* 功能描述: 通讯停止
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
/*void ComuStop(void)
{
pin_SCLK = 1;
pin_RESET =0;;
}*/
/*******************************************************************************
* 函数名称: void SendByte(unsigned char ucData);
* 功能描述: 发送一个字节到HT1380
* 输入参数: 需要发送的字节
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void SendByte(unsigned char ucData)
{
volatile unsigned char idata i;
for (i = 8; i != 0; i--)
{
pin_SCLK = 0;
pin_SIO = ucData & 0x01;
ucData >>= 1;
pin_SCLK = 1;
}
pin_SCLK = 0;
}
/*******************************************************************************
* 函数名称: unsigned char ReceiByte(void);
* 功能描述: 接收HT1380的一个字节
* 输入参数: 无
* 输出参数: 无
* 返 回 值: HT1380发送出来的一个字节数据
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
unsigned char ReceiByte(void)
{
unsigned char i;
unsigned char ucDataRecv = 0;
for(i = 8; i > 0; i--)
{
ucDataRecv >>= 1;
if (pin_SIO)
{
ucDataRecv |= 0x80;
}
pin_SCLK = 1;
pin_SCLK = 0;
}
return(ucDataRecv);
}
/*******************************************************************************
* 函数名称: unsigned char ReadReg(unsigned char ucRegAdd);
* 功能描述: 读取HT1380寄存器的命令函数
* 输入参数: 要读取HT1380的寄存器地址
* 输出参数: 无
* 返 回 值: 读取出HT1380的寄存器数据
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
//unsigned char ReadReg(unsigned char ucRegAdd)
unsigned char ReadTime(unsigned char ucRegAdd)
{
unsigned char idata ucData; //存放接收数据
ucRegAdd <<= 1;
ucRegAdd &= 0x0E;
ucRegAdd += 0x81;
ComuStart();
SendByte(ucRegAdd); //需要读取地址
ucData = ReceiByte();
pin_RESET = 0;
return ucData;
}
/*******************************************************************************
* 函数名称: unsigned char ReadTime(unsigned char ucRegAdd);
* 功能描述: 与ReadTime(ucRegAdd)功能完全相同,通过调用ReadTime(ucRegAdd)实现
* 输入参数: 要读取HT1380的寄存器地址
* 输出参数: 无
* 返 回 值: 读取出HT1380的寄存器数据
* 其他说明: 只是方便调用是理解,reg太普遍了,使用reg方便在本文件中理解
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
/*unsigned char ReadTime(unsigned char ucRegAdd)
{
return ReadTime(ucRegAdd);
}*/
/*******************************************************************************
* 函数名称: void WriteReg(unsigned char ucRegAdd, unsigned char ucData);
* 功能描述: 写HT1380寄存器的函数
* 输入参数: 要写入HT1380的寄存器地址ucRegAdd,要写入的数据ucData
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void WriteReg(unsigned char ucRegAdd, unsigned char ucData)
{
ComuStart();
SendByte(ucRegAdd);
SendByte(ucData);
pin_RESET = 0;
}
/*******************************************************************************
* 函数名称: void WriteReg(unsigned char ucRegAdd, unsigned char ucData);
* 功能描述: 写HT1380寄存器的函数
* 输入参数: 要写入HT1380的寄存器地址ucRegAdd,要写入的数据ucData
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void WriteTime(unsigned char ucRegAdd, unsigned char ucData)
{
//去除写保护
WriteReg(CMD_WRT_WP, 0x00);
//写数据
ucRegAdd <<= 1;
ucRegAdd &= 0x0E;
ucRegAdd |= 0x80;
WriteReg(ucRegAdd, ucData);
//开写保护
WriteReg(CMD_WRT_WP, 0x80);
}
/*******************************************************************************
* 函数名称: void WriteTime(unsigned char ucRegAdd, unsigned char ucData);
* 功能描述: 与WriteTime()功能完全相同,通过调用与WriteTime()实现
* 输入参数: 要写入HT1380的寄存器地址ucRegAdd,要写入的数据ucData
* 输出参数: 无
* 返 回 值: 无
* 其他说明:
* 修改日期 版 本 号 修 改 人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
/*void WriteTime(unsigned char ucRegAdd, unsigned char ucData)
{
WriteTime(ucRegAdd, ucData);
}*/
/*******************************************************************************
* 函 数 名: bit IsBCD(unsigned char ucNum_IsBCD)
* 功 能: 判断一个无符号字符型数据是否为BCD码
* 输入参数: 要判断的数据
* 输出参数: 无
* 返 回 值: 位(bool)变量,是就返回1,不是就返回0
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
//LHD6000的主程序中有实现部分,后面本文件中的实现部分被转成注释
/*bit IsBCD(unsigned char ucNum_IsBCD)
{
if (((ucNum_IsBCD >> 4) <= 0x09) && ((ucNum_IsBCD & 0x0F) <= 0x09))
{
return 1;
}
else
{
return 0;
}
}*/
/*******************************************************************************
* 函 数 名: unsigned char BCD_Hex(unsigned char ucNumBCD)
* 功 能:
* 输入参数:
* 输出参数: 无
* 返 回 值:
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
//LHD6000的主程序中有实现部分,后面本文件中的实现部分被转成注释
/*unsigned char BCD_Hex(unsigned char ucNumBCD)
{
if (IsBCD(ucNumBCD))
{
return (ucNumBCD >> 4) * 10 + (ucNumBCD & 0x0F);
}
else
{
return 0;
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -