📄 dls.c
字号:
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include <stdio.h>
void DlsSetTime(struct StruCLOCK *sClock); // 设置时间
void DlsReadTime(struct StruCLOCK *sClock); // 读时钟
_BYTE HexToBcd(_BYTE cHex);
_BYTE BcdToHex(_BYTE cBcd);
/****************************************************************************
* 名称:DlsWriteByte()
* 功能:发送一字节数据
* 入口参数:
* cData: 要发送的数据
* 出口参数:无
* 说明:发送数据时,低位先发送。
****************************************************************************/
void DlsWriteByte(_BYTE cData)
{
_BYTE i;
for(i=0; i<8; i++) { // 发送8位数据
/* 设置PIO的DATA输出值 */
if( (cData&0x01)!=0)
MY_PIO_SODR = HTSDA;
else
MY_PIO_CODR = HTSDA;
cData >>= 1;
MY_PIO_SODR = HTSCL; // SCL = 1
DelayMCK4(SPI_BASE_DELAY_TIME);
MY_PIO_CODR = HTSCL; // SCL = 0
DelayMCK4(SPI_BASE_DELAY_TIME);
}
}
/****************************************************************************
* 名称:DlsReadByte()
* 功能:读一字节数据
* 返回: 函数返回值为读取的数据
* 说明:先接收低位。
****************************************************************************/
_BYTE DlsReadByte()
{
_BYTE i;
_BYTE cData=0;
MY_PIO_ODR = HTSDA; //* set SDA line as an input
for(i=0; i<8; i++) { // 发送8位数据
MY_PIO_SODR = HTSCL; // SCL = 1
DelayMCK4(SPI_BASE_DELAY_TIME);
if((MY_PIO_PDSR & HTSDA) == HTSDA )
cData |= (1<<i);
MY_PIO_CODR = HTSCL; // SCL = 0
DelayMCK4(SPI_BASE_DELAY_TIME);
}
return(cData);
}
/****************************************************************************
* 名称:DlsWriteBuffer()
* 功能:写命令字和wrBuf中的时钟信息到HT1380
* 参数:
* cCommand: HT1380的命令字(写时钟信息的命令字)
* cLength : 时钟信息的长度
* cpTimeBuf:存放时钟信息的缓冲区
* 返回: 无
* 说明:
****************************************************************************/
void DlsWriteBuffer(_BYTE cCommand,_BYTE cLength,_BYTE * cpTimeBuf)
{
_BYTE i;
MY_PIO_PER = (HTSDA | HTSCL | HTRST);
MY_PIO_OER = HTSDA; //* set SDA line as an output
MY_PIO_OER = HTSCL; //* set SCL line as an output
MY_PIO_OER = HTRST; //* set RST line as an output
MY_PIO_CODR = HTRST; // RST = 0
DelayMCK4(100*SPI_BASE_DELAY_TIME);
MY_PIO_CODR = HTSCL; // SCL = 0
DelayMCK4(SPI_BASE_DELAY_TIME);
MY_PIO_SODR = HTRST; // RST = 1
DelayMCK4(100*SPI_BASE_DELAY_TIME);
DlsWriteByte(cCommand);
DelayMCK4(100*SPI_BASE_DELAY_TIME);
for(i=0;i<cLength;i++) {
DlsWriteByte(*(cpTimeBuf+i));
}
DelayMCK4(SPI_BASE_DELAY_TIME);
MY_PIO_CODR = HTRST; // RST = 0
DelayMCK4(SPI_BASE_DELAY_TIME);
}
/****************************************************************************
* 名称:DlsReadBuffer()
* 功能:读取HT1380中的时钟信息
* 参数:
* cCommand: HT1380的命令字(读时钟信息的命令字)
* cLength : 时钟信息的长度
* cpTimeBuf:存放时钟信息的缓冲区
* 返回: 无
* 说明:
****************************************************************************/
void DlsReadBuffer(_BYTE cCommand,_BYTE cLength,_BYTE * cpTimeBuf)
{
_BYTE i;
MY_PIO_PER = (HTSDA | HTSCL | HTRST);
MY_PIO_OER = HTSDA; //* set SDA line as an output
MY_PIO_OER = HTSCL; //* set SCL line as an output
MY_PIO_OER = HTRST; //* set RST line as an output
MY_PIO_CODR = HTRST; // RST = 0
DelayMCK4(100*SPI_BASE_DELAY_TIME);
MY_PIO_CODR = HTSCL; // SCL = 0
DelayMCK4(SPI_BASE_DELAY_TIME);
MY_PIO_SODR = HTRST; // RST = 1
DelayMCK4(100*SPI_BASE_DELAY_TIME);
DlsWriteByte(cCommand);
DelayMCK4(100*SPI_BASE_DELAY_TIME);
for(i=0;i<cLength;i++) {
*(cpTimeBuf+i)=(DlsReadByte());
}
DelayMCK4(SPI_BASE_DELAY_TIME);
MY_PIO_CODR = HTRST; // RST = 0
DelayMCK4(SPI_BASE_DELAY_TIME);
}
//=================================================================
// 函数: DlsSetTime
// 功能: 设置时钟
// 参数:
// sClock: 存放时钟信息的结构类型
//=================================================================
void DlsSetTime(struct StruCLOCK *sClock) //设置时间
{
_BYTE cpTimeData[8];
cpTimeData[0] = HexToBcd(sClock->cSecond); // 秒
cpTimeData[1] = HexToBcd(sClock->cMinter); // 分
cpTimeData[2] = HexToBcd(sClock->cHour); // 小时,24小时
cpTimeData[3] = HexToBcd(sClock->cDay); // 日
cpTimeData[4] = HexToBcd(sClock->cMonth); // 月
cpTimeData[5] = HexToBcd(sClock->cWeek); // 周
cpTimeData[6] = HexToBcd(sClock->cYear); // 年
cpTimeData[7] = 0x00; // 开写保护
DlsWriteBuffer(0x8e,1,&cpTimeData[7]); // 禁止写保护
DelayMCK4(SPI_BASE_DELAY_TIME); // 延时
DlsWriteBuffer(0xbe,8,cpTimeData); //写入时间
cpTimeData[7]=0x80;
DelayMCK4(SPI_BASE_DELAY_TIME);
DlsWriteBuffer(0x8e,1,&cpTimeData[7]); //启用写保护
}
//=================================================================
// 函数: DlsReadTime
// 功能: 读取时钟
// 参数:
// sClock: 存放时钟信息的结构类型
//=================================================================
void DlsReadTime(struct StruCLOCK *sClock)
{
_BYTE cpTimeData[8];
DlsReadBuffer(0xbf,8,cpTimeData);
sClock->cSecond = BcdToHex(cpTimeData[0]); // 秒
sClock->cMinter = BcdToHex(cpTimeData[1]); // 分
sClock->cHour = BcdToHex(cpTimeData[2]); // 小时,24小时
sClock->cDay = BcdToHex(cpTimeData[3]); // 日
sClock->cMonth = BcdToHex(cpTimeData[4]); // 月
sClock->cWeek = BcdToHex(cpTimeData[5]); // 周
sClock->cYear = BcdToHex(cpTimeData[6]); // 年
}
_BYTE HexToBcd(_BYTE cHex)
{
_BYTE cByteH,cByteL;
cByteH = cHex/10;
cByteL = cHex%10;
return(cByteL|(cByteH<<4));
}
_BYTE BcdToHex(_BYTE cBcd)
{
_BYTE cByteH,cByteL;
cByteH = (cBcd&0xf0)>>4;
cByteL = (cBcd&0x0f);
return(cByteH*10+cByteL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -