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

📄 ht1380.c

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 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 + -