📄 ds12c887_config.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 + -