📄 clock.c
字号:
#include "Include.h"
#define CLKCS_EN P3OUT &= 0xFE //时钟片选信号有效
#define CLKCS_DIS P3OUT |= 0x01 //时钟片选信号无效
#define SCLK_LOW P3OUT &= 0xF7
#define SCLK_HI P3OUT |= 0x08
#define DIN1 P3OUT |= 0x02
#define DIN0 P3OUT &= 0xFD
#define DOUT P3IN & 0x04
//#define WAIT_TXEMPTY while((U0TCTL & TXEPT) == 0)
char clk_err; //时钟状态标志,如果出错则为1
INT8U Empty;
char clockRD(char val)
{
char initv = 0x80;
char i,rslt=0;
SCLK_HI;
CLKCS_EN;
for(i=0;i<8;i++)
{
SCLK_LOW;
if(initv & val)
DIN1;
else
DIN0;
SCLK_HI;
initv >>= 1;
}
for(i=0;i<8;i++)
{
SCLK_LOW;
DIN1;
SCLK_HI;
if(DOUT)
rslt += 1;
if(i < 7) rslt <<= 1;
}
CLKCS_DIS;
SCLK_HI;
return rslt;
}
void clockWE(int val)
{
int initv = 0x4000;
char i;
SCLK_HI;
CLKCS_EN;
SCLK_LOW;
DIN1;
SCLK_HI;
for(i=0;i<15;i++)
{
SCLK_LOW;
if(initv & val)
DIN1;
else
DIN0;
SCLK_HI;
initv >>= 1;
}
CLKCS_DIS;
}
/*$PAGE*/
/**********************************************************************************************************
* 函数原型 :void ClockInit (void)
* 功能描述 : 时钟初始化。
* 输入参数 : 无
* 输出参数 :无
* 返回值 :无
*********************************************************************************************************
*/
void ClockInit(void)
{
INT8U st_val;
st_val = clockRD(0x0e);
if((st_val & 0x80) == 0x00)
{
clk_err = 0;
}
else
{
clockWE(0x8d18);
clockWE(0x8e00);
clk_err = 1;
}
}
/*$PAGE*/
/**********************************************************************************************************
* 函数原型 :void ClockWrite (sTIME *time)
* 功能描述 : 将Hex格式的时钟数据写的时钟芯片。
* 输入参数 : *time 放置时间数据的结构指针
* 输出参数 :无
* 返回值 :无
*********************************************************************************************************
*/
void ClockWrite(sTIME *time)
{
INT8U i, *TimeBuf;
int tempv;
sTIME temp;
temp.HundOfSec = ((time->HundOfSec / 10) << 4) | ((time->HundOfSec % 10) & 0x0f);
temp.Second = ((time->Second / 10) << 4) | ((time->Second % 10) & 0x0f);
temp.Minute = ((time->Minute / 10) << 4) | ((time->Minute % 10) & 0x0f);
temp.Hour = ((time->Hour / 10) << 4) | ((time->Hour % 10) & 0x0f);
temp.Day = time->Day & 0x0f;
temp.Date = ((time->Date / 10) << 4) | ((time->Date % 10) & 0x0f);
temp.Month = ((time->Month / 10) << 4) | ((time->Month % 10) & 0x0f);
temp.Year = ((time->Year / 10) << 4) | ((time->Year % 10) & 0x0f);
TimeBuf = (INT8U *)&temp.HundOfSec;
for(i = 0; i < 8; i++)
{
tempv = ((0x80+i) << 8) | TimeBuf[i];
clockWE(tempv);
}
}
/*$PAGE*/
/**********************************************************************************************************
* 函数原型 :void ClockRead (sTIME *time)
* 功能描述 : 读出BCD类型的时间数据并放置到指定的数据结构内
* 输入参数 : 无
* 输出参数 :*time 放置时间数据的结构指针
* 返回值 :无
*********************************************************************************************************
*/
void ClockRead(sTIME *time)
{
INT8U i, *TimeBuf;
TimeBuf = (INT8U *)&time->HundOfSec;
//i = clockRD(1);
for(i=0;i<8;i++)
{
TimeBuf[i] = clockRD(i);
}
}
/*
void ClockRead(sTIME *time)
{
INT8U i, *TimeBuf;
sTIME temp;
TimeBuf = (INT8U *)&temp.HundOfSec;
for(i=0;i<8;i++)
{
TimeBuf[i] = clockRD(i);
}
time->HundOfSec = (temp.HundOfSec >> 4) * 10 + (temp.HundOfSec & 0x0f);
time->Second = (temp.Second >> 4) * 10 + (temp.Second & 0x0f);
time->Minute = (temp.Minute >> 4) * 10 + (temp.Minute & 0x0f);
time->Hour = ((temp.Hour >> 4) & 0x03) * 10 + (temp.Hour & 0x0f);
time->Day = temp.Day & 0x07;
time->Date = (temp.Date >> 4) * 10 + (temp.Date & 0x0f);
time->Month = ((temp.Month >> 4) & 0x01) * 10 + (temp.Month & 0x0f);
time->Year = (temp.Year >> 4) * 10 + (temp.Year & 0x0f);
}
*/
/*$PAGE*/
/**********************************************************************************************************
* 函数原型 :void ClockTimeBcdToHex (sTIME *timeBcd, sTIME *timeHex)
* 功能描述 : 把BCD类型的时间数据转换成Hex类型的时间数据
* 输入参数 : *timeBcd 放置BCD类型时间数据的结构指针
* 输出参数 :*timeHex 放置Hex类型时间数据的结构指针
* 返回值 :无
*********************************************************************************************************
*/
void ClockTimeBcdToHex(sTIME *timeBcd, sTIME *timeHex)
{
timeHex->HundOfSec = (timeBcd->HundOfSec >> 4) * 10 + (timeBcd->HundOfSec & 0x0f);
timeHex->Second = (timeBcd->Second >> 4) * 10 + (timeBcd->Second & 0x0f);
timeHex->Minute = (timeBcd->Minute >> 4) * 10 + (timeBcd->Minute & 0x0f);
timeHex->Hour = ((timeBcd->Hour >> 4) & 0x03) * 10 + (timeBcd->Hour & 0x0f);
timeHex->Day = timeBcd->Day & 0x07;
timeHex->Date = (timeBcd->Date >> 4) * 10 + (timeBcd->Date & 0x0f);
timeHex->Month = ((timeBcd->Month >> 4) & 0x01) * 10 + (timeBcd->Month & 0x0f);
timeHex->Year = (timeBcd->Year >> 4) * 10 + (timeBcd->Year & 0x0f);
}
/*$PAGE*/
/**********************************************************************************************************
* 函数原型 :void ClockTimeGet (sTIME *time)
* 功能描述 : 读出Hex类型的时间数据并放置到指定的数据结构内
* 输入参数 : 无
* 输出参数 :*time 放置时间数据的结构指针
* 返回值 :无
*********************************************************************************************************
*/
void ClockTimeGet(sTIME *time)
{
sTIME temp;
ClockRead(&temp);
ClockTimeBcdToHex(&temp, time);
}
/*$PAGE*/
/**********************************************************************************************************
* 函数原型 :INT8U ClockCheckTime (sTIME *time)
* 功能描述 : 检查时间
* 输入参数 : 无
* 输出参数 :*time 放置时间数据的结构指针
* 返回值 :CLOCK_NO_ERR 时间无误
CLOCK_ERR 时间有误
*********************************************************************************************************
*/
INT8U ClockCheckTime(sTIME *time)
{
INT16U year;
if(time->Second > 59) return(CLOCK_ERR);
if(time->Minute > 59) return(CLOCK_ERR);
if(time->Hour > 23) return(CLOCK_ERR);
if(time->Month > 12 || time->Month < 1) return(CLOCK_ERR);
if(time->Date > 31) return(CLOCK_ERR);
if(time->Date==31) { /*判断大小月是否对*/
if(time->Month%2) { /*单月*/
if(time->Month>7) return(CLOCK_ERR);
} else { /*双月*/
if(time->Month<8) return(CLOCK_ERR);
}
}
year = 2000 + (INT16U)(time->Year);
if(time->Month == 2) { /*判断闰月的对错*/
if(time->Date > 29) return(CLOCK_ERR);
if(time->Date == 29) {
if(year % 4) {
return(CLOCK_ERR);
} else {
if((year%100)==0) {
if(year%400) return(CLOCK_ERR);
}
}
}
}
time->HundOfSec = 0x00;
return(CLOCK_NO_ERR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -