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

📄 clock.c

📁 自己遍的
💻 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 + -