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

📄 ds12c887_config.c

📁 用GCC编写ATMEG128应用软件源代码
💻 C
字号:
/**********************************************************/
/*														  */
/*文 件 名:Ds12c887_Config.c						      */
/*功    能:实时时钟配置文件                               */
/*                                                        */
/*当前版本:V1.0									          */
/*作    者:白广斌									      */
/*														  */
/*开始日期:2007.10.20								      */
/*完成日期:2007.10.20								      */
/*      	                                              */
/**********************************************************/
#include <avr/io.h>
#include <avr/pgmspace.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int

/* 时钟系统寄存器地址通道定义 */ 
#define TIMER_Second    *(volatile uchar *)(0x1100)       /*秒*/
#define TIMER_Minute    *(volatile uchar *)(0x1102) 	     /*分*/
#define TIMER_Hour      *(volatile uchar *)(0x1104) 	     /*小时*/
#define TIMER_Week      *(volatile uchar *)(0x1106) 	     /*星期*/
#define TIMER_Date      *(volatile uchar *)(0x1107) 	     /*日*/
#define TIMER_Month     *(volatile uchar *)(0x1108) 	     /*月*/
#define TIMER_Year      *(volatile uchar *)(0x1109) 	     /*年*/ 
#define TIMER_Century   *(volatile uchar *)(0x1132) 	     /*世纪*/
#define TIMER_RegA      *(volatile uchar *)(0x110a) 	     /*A*/
#define TIMER_RegB      *(volatile uchar *)(0x110b) 	     /*B*/
#define TIMER_RegC      *(volatile uchar *)(0x110c) 	     /*C*/
#define TIMER_RegD      *(volatile uchar *)(0x110d) 	     /*D*/

extern void LCM_Screen_str(uchar low,uchar high,const prog_char *pstr,uchar Layer,uchar fs);
extern void LCM_Screen_HZ(uchar Row,uchar Col,uchar bm,uchar Layer,uchar fs);
extern void LCM_Screen_RAMstr(uchar Row,uchar Col,uchar *pstr,uchar Layer,uchar fs);

/* 函数声明部分 */ 
void StartDs12c887(void);                   //启动时钟芯片函数
void YDT(void);			                    //读系统时间
void SetTime(uchar SS,uchar MM,uchar HH);  //时间设置
void SetDate(uchar DD,uchar MM,uchar YY);  //日期设置
void SYS_TimerDisplay(uchar Row,uchar Col);
void SYS_DateDisplay(uchar Row,uchar Col);
void SYS_WeekDisplay(uchar Row,uchar Col);

uchar Year[]="2007";   //定义系统时间  年   字符串  
uchar Month[]="08";    //定义系统时间  月   字符串
uchar Date[]="01";     //定义系统时间  日   字符串
uchar Timer_H[]="17";  //定义系统时间  小时 字符串
uchar Timer_M[]="17";  //定义系统时间  分钟 字符串
uchar Timer_S[]="17";  //定义系统时间  秒   字符串

/***********************************************
函数名称:void StartDs12c887(void)
函数功能:该函数用来启动时钟芯片工作 
应用范围:仅在时钟芯片首次使用时用到一次 
入口参数: 
出口参数: 
************************************************/ 
void StartDs12c887(void) 
{ 
    if(TIMER_RegA!=0x20)
	{
	    TIMER_RegA = 0x20;  /* 开启时钟芯片*/
	} 
    TIMER_RegB   &= 0x02; /* 使能刷新 */   
}
 
/***********************************************
函数名称:void InitDs12c887()
函数功能:该函数用来初始化时钟芯片 
应用范围:使用BCD码格式、24小时模式、不使用夏令时 
入口参数: 
出口参数: 
***********************************************/ 
void InitDs12c887(void) 
{ 
	TIMER_RegB    = 0x82; /* 禁止刷新 */ 
    TIMER_Century = 0x20; /* 设置为21世纪 */ 
    TIMER_RegB   &= 0x02; /* 使能刷新 */ 
}

/**********************************************
函数名称:SetTime(uchar SS,uchar MM,uchar HH)
函数功能:该函数用来设置时钟芯片的时间 
应用范围: 
入口参数:SS、MM、HH是设定时间的BCD码 
出口参数: 
**********************************************/ 
void SetTime(uchar SS,uchar MM,uchar HH) 
{ 
	TIMER_RegB   = 0x82; /* 禁止刷新 */ 
    TIMER_Second = SS;   /* 设置  秒 */
    TIMER_Minute = MM;   /* 设置  分 */
    TIMER_Hour   = HH;   /* 设置  时 */
    TIMER_RegB   = 0x02; /* 使能刷新 */ 
}

/**********************************************
函数名称:SetDate(uchar DD,uchar MM,uchar YY)
函数功能:该函数用来设置时钟芯片的日期 
应用范围: 
入口参数:DD、MM、YY是设定日期的BCD码 
出口参数: 
**********************************************/ 
void SetDate(uchar DD,uchar MM,uchar YY)
{ 
	InitDs12c887();
	TIMER_RegB  = 0x82; /* 禁止刷新 */ 
    TIMER_Date  = DD;   /*  设置  日*/
    TIMER_Month = MM;   /*  设置  月*/
    TIMER_Year  = YY;   /*  设置  年*/
    TIMER_RegB  = 0x02; /* 使能刷新 */ 
}

/*********************************************
函数名称:YDT(void) 
函数功能:该函数用来读系统时间 
应用范围: 
入口参数: 
出口参数: 
*********************************************/
void YDT(void) 
{
    uchar temp;

	temp=TIMER_Century;		            //取世纪
	Year[0]=(temp>>4)+0x30;		    //将BCD码转换成ASCII码
	Year[1]=(temp&0x0f)+0x30;	        //将BCD码转换成ASCII码

	temp=TIMER_Year;			        //取年
	Year[2]=(temp>>4)+0x30;		    //将BCD码转换成ASCII码
	Year[3]=(temp&0x0f)+0x30;	        //将BCD码转换成ASCII码

	temp=TIMER_Month;			        //取月
	Month[0]=(temp>>4)+0x30;		    //将BCD码转换成ASCII码
	Month[1]=(temp&0x0f)+0x30;	    //将BCD码转换成ASCII码

	temp=TIMER_Date;			        //取日
	Date[0]=(temp>>4)+0x30;		    //将BCD码转换成ASCII码
	Date[1]=(temp&0x0f)+0x30;	        //将BCD码转换成ASCII码

	temp=TIMER_Hour;				    //取小时
	Timer_H[0]=((temp>>4)&0x03)+0x30;//将BCD码转换成ASCII码
	Timer_H[1]=(temp&0x0f)+0x30;	    //将BCD码转换成ASCII码

	temp=TIMER_Minute;				    //取分钟
	Timer_M[0]=(temp>>4)+0x30;		//将BCD码转换成ASCII码
	Timer_M[1]=(temp&0x0f)+0x30;	    //将BCD码转换成ASCII码

	temp=TIMER_Second;				    //取秒
	Timer_S[0]=(temp>>4)+0x30;		//将BCD码转换成ASCII码
	Timer_S[1]=(temp&0x0f)+0x30;	    //将BCD码转换成ASCII码
}

/*********************************************************************************************
函数名称:WeekComputer(uint y,uint m,uint d) 
函数功能:计算星期几函数(基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7)
应用范围:
入口参数:y:年,m:月,d:日 
出口参数:返回星期值 
*********************************************************************************************/ 
uchar WeekComputer(uint y,uint m,uint d)
{  
   int a=7;               //用来保存计算得到的星期几的整数
   if ((m==1)||(m==2))   //如果是1月2月换算为去年的13 14月计算
   {
      m+=12;
      y--;
   }

   a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;   //得到的星期几的整数

   switch (a)
   {  
       case 0:	   //星期一
       {
	       a=2;
           break;
	   }
       case 1:	   //星期二
       {
	       a=3;
           break;
	   }
       case 2:	   //星期三
       {		  
	       a=4;
           break;
	   }
       case 3:	   //星期四
       {
	       a=5;
           break;
	   }
       case 4:	   //星期五
       {
	       a=6;
           break;
	   }
       case 5:	   //星期六
       {
	       a=7;
           break;
	   }
       case 6:		//星期日
       {
	       a=1;
           break;
	   }
   }

   return(uchar)(a);
}

/***********************************************/
//函数名称:SYS_DateDisplay(uchar Row,uchar Col)
//函数功能:系统日期显示函数
//输入参数:Row,Col
//返 回 值:无
/***********************************************/
void SYS_DateDisplay(uchar Row,uchar Col)
{
	LCM_Screen_RAMstr(Row,Col,&Year[0],1,1);
	LCM_Screen_str(Row,(Col+4),"-",1,1);
	LCM_Screen_RAMstr(Row,(Col+5),&Month[0],1,1);
	LCM_Screen_str(Row,(Col+7),"-",1,1);
	LCM_Screen_RAMstr(Row,(Col+8),&Date[0],1,1);
}

/***********************************************/
//函数名称:SYS_WeekDisplay(uchar Row,uchar Col)
//函数功能:星期显示函数
//输入参数:Row,Col
//返 回 值:无
/***********************************************/
void SYS_WeekDisplay(uchar Row,uchar Col)
{
    LCM_Screen_HZ(Row,Col,25,1,1);  //星期
	LCM_Screen_HZ(Row,(Col+2),26,1,1);
	/*显示星期*/
	switch (TIMER_Week)
	{
		 case 1:  //星期日
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),21,1,1);	//日
			 break;
		 }
		 case 2:  //星期一
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),13,1,1);	//一
			 break;
		 }
		 case 3:  //星期二
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),14,1,1);	//二
			 break;
		 }
		 case 4:  //星期三
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),15,1,1);	//三
			 break;
		 }
		 case 5:  //星期四
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),16,1,1);	//四
			 break;
		 }
		 case 6:  //星期五
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),17,1,1);	//五
			 break;
		 }
		 case 7:  //星期六
		 {
		 	 LCM_Screen_HZ(Row,(Col+4),18,1,1);	//六
			 break;
		 }
		 default:
		 {
		 	 break;
		 }
	}
}

/***********************************************/
//函数名称:SYS_TimerDisplay(void)
//函数功能:系统日期显示函数
//输入参数:Row,Col
//返 回 值:无
/***********************************************/
void SYS_TimerDisplay(uchar Row,uchar Col)
{
    /*显示时间*/
    LCM_Screen_RAMstr(Row,Col,&Timer_H[0],1,1);
 	LCM_Screen_str(Row,(Col+2),":",1,1);	// -
 	LCM_Screen_RAMstr(Row,(Col+3),&Timer_M[0],1,1);
 	LCM_Screen_str(Row,(Col+5),":",1,1);	// -
 	LCM_Screen_RAMstr(Row,(Col+6),&Timer_S[0],1,1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -