📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** 中国矿业大学理学院
** 物理系04级
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: 万年历主程序
**创 建 人: 卢家顺
**最后修改日期: 2007年8月29日
**描 述: 可以显示农历的年,月,日和阴历的月,日(程序稍加修改可以显示阴历的年).
** 可以显示时,分,秒.
** 可以显示星期.
** 可以显示温度,
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 卢家顺
** 版 本: 1.0
** 日 期: 2007年8月29日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#include <reg52.h>
#include <lcd1602.h>
#include <ds1302.h>
extern ReadTemperature(void);
sbit KEY1 = P1^0;
sbit KEY2 = P1^1;
sbit KEY3 = P1^2;
/* *********************************************************************************************************
* 与万年历体系结构相关的一些定义
**********************************************************************************************************/
uchar weeks[7][4]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
code uchar ping[12]={31,28,31,30,31,30,31,31,30,31,30,31};
code uchar rn[12]={31,29,31,30,31,30,31,31,30,31,30,31};
code uchar yue[2]={30,29};
uchar year2,month2,day2;
/* *********************************************************************************************************
* 万年历从阳历转阴历的关系表,具体参见北航的<<单片机课程设计实例设计>>(李光飞
* 等编著,2004年九月第一版)
**********************************************************************************************************/
code unsigned long guanxi[51]=
{
0x35155100,0x23115241,0x42126500,
0x31113200,0x21425221,0x39522500,
0x28250471,0x48664200,0x37332200,
0x25152451,0x44055200,0x33226500,
0x22212541,0x40245200,0x30524291,
0x49550500,0x38264400,0x27535060,
0x46532400,0x35255400,0x24415241,
0x42452500,0x31245200,0x21511221,
0x40551100,0x28262161,0x47266100,
0x36133100,0x25053151,0x43125400,
0x33512500,0x22422531,0x41322200,
0x30550271,0x49552200,0x38266200,
0x27136460,0x45133200,0x34125500,
0x23105351,0x42224500,0x31522200,
0x21524421,0x40554400,0x29265071,
0x47445500,0x36253200,0x25233250,
0x44445500,0x32244500,0x22551130
} ;
void keyscan(TIME_ds1302 Time);
void Delay(uint count);
void show(TIME_ds1302 Time);
void yangtoyin(TIME_ds1302 Time);
uchar id=0;
void main()
{
TIME_ds1302 Time={0,0,12,5,29,8,7,"07-01-16","12:00:00"};
unsigned long i;
uchar j, m;
lcd_init();
lcd_str(1,1,"WELCOME TO YOU!");
lcd_str(2,2,"LCD1602 is ok!");
Delay(100);
LCD_CMD(LCD_CLS);
DS1302_SetTime(&Time);
while(1)
{
yangtoyin(Time);
LCD_CMD(LCD_LINE2+9);
LCD_CHAR((month2/10)+'0');
LCD_CHAR((month2%10)+'0');
LCD_CHAR('-');
LCD_CHAR((day2/10)+'0');
LCD_CHAR((day2%10)+'0');
i=ReadTemperature();
Delay(100);
j=i /100;
m=(i-100*j)/10;
LCD_CMD(LCD_LINE1+13);
LCD_CHAR(j+'0');
LCD_CHAR(m+'0');
LCD_CHAR('C');
keyscan(Time);
DS1302_GetTime(&Time);
DateToStr(&Time);
lcd_str(1,1,Time.DateString);
lcd_str(1,2,Time.TimeString);
LCD_CMD(LCD_LINE2+15)
LCD_CHAR((id==0? 0x20:id+'0'));
lcd_str(10,1,weeks[Time.Week-1]);
}
}
/*********************************************************************************************************
** 函数名称: keyscan
** 功能描述: 检测三个按键,并进行相应处理
**
** 输 入: 和时间有关的数据结构
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 卢家顺
** 日 期: 2007年8月24日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void keyscan(TIME_ds1302 Time)
{
if(!KEY1)
{
Delay(50);
if (!KEY1) {while(!KEY1);++id;id=id%8;}
}
if(!KEY2)
{
Delay(100);
if (!KEY2)
{
aaa: switch(id)
{
case(0):break;
case(1):Time.Second=(++(Time.Second))%60;break;
case(2):Time.Minute=(++(Time.Minute))%60;break;
case(3):Time.Hour=(++(Time.Hour))%24;break;
case(4):Time.Week=(++(Time.Week)%7==0?7:((Time.Week)%7));break;
case(5):Time.Day=(++(Time.Day)%31==0?31:(Time.Day)%31);break;
case(6):Time.Month=(++(Time.Month)%12==0?12:(Time.Month)%12);break;
case(7):Time.Year=++Time.Year;
}
if(id!=0)
{
DS1302_SetTime(&Time);
DS1302_GetTime(&Time);
DateToStr(&Time);
lcd_str(1,1,Time.DateString);
lcd_str(1,2,Time.TimeString);
LCD_CMD(LCD_LINE2+15)
LCD_CHAR(id+'0');
lcd_str(10,1,weeks[Time.Week-1]);
}
Delay(100);
if(!KEY2) goto aaa;
}
}
if(!KEY3)
{
Delay(100);
if (!KEY3)
{
bbb: switch(id)
{
case(0):break;
case(1):Time.Second=(--(Time.Second)+60)%60;break;
case(2):Time.Minute=(--(Time.Minute)+60)%60;break;
case(3):Time.Hour=(--(Time.Hour)+24)%24;break;
case(4):Time.Week=((--(Time.Week)+7)%7==0?7:((Time.Week)%7));break;
case(5):Time.Day=((--(Time.Day)+31)%31==0?31:(Time.Day)%31);break;
case(6):Time.Month=((--(Time.Month)+12)%12==0?12:(Time.Month)%12);break;
case(7):Time.Year=--Time.Year;
}
if(id!=0)
{
DS1302_SetTime(&Time);
DS1302_GetTime(&Time);
DateToStr(&Time);
lcd_str(1,1,Time.DateString);
lcd_str(1,2,Time.TimeString);
LCD_CMD(LCD_LINE2+15)
LCD_CHAR(id+'0');
lcd_str(10,1,weeks[Time.Week-1]);
}
Delay(100);
if(!KEY3) goto bbb;
}
}
}
void Delay(uint count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
/*********************************************************************************************************
** 函数名称: yangtoyin
** 功能描述: 阳历转阴历程序
**
** 输 入: 和时间有关的数据结构
** 输 出 : 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 卢家顺
** 日 期: 2007年8月24日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void yangtoyin(TIME_ds1302 Time)
{
uchar w,y,z;
signed int c,d;
uint k=0;
uchar i=0;
year2=0;month2=1;day2=0;
w=(guanxi[Time.Year]&0x000000f0)>>4;
y=(guanxi[Time.Year]&0x0f);
z=yue[y];
if (Time.Year %4==0 )
{
for(i=1;i<Time.Month;i++)
{
day2=day2+rn[i-1];
}
}
else
{
for(i=1;i<Time.Month;i++)
{
day2=day2+ping[i-1];
}
}
day2=day2+Time.Day;
d=day2-((guanxi[Time.Year]&0xff000000)>>24)/16*10-((guanxi[Time.Year]&0x0f000000)>>24);
if (d>0)
{
year2=Time.Year;
if(w==0) goto ccc;
for(i=0;i<w;i++)
{
k=k+yue[((guanxi[Time.Year]&0x00ffff00)>>(22-(i/3)*4-(i%3)))%2];
}
if(k<d)
{
d=d-k;
month2=w;
if((d-z)>0)
{
month2++;
d=d-z;
for(i=w;;i++)
{
c=d;
d=d-yue[((guanxi[Time.Year]&0x00ffff00)>>(22-(i/3)*4-(i%3)))%2];
if(d>0)
{
month2++;
}
else
{
day2=c;
break;
}
}
}
else
{
day2=d;
}
}
else
{
ccc: for(i=0;;i++)
{
c=d;
d=d-yue[((guanxi[Time.Year]&0x00ffff00)>>(22-(i/3)*4-(i%3)))%2];
if(d>0)
{
month2++;
}
else
{
day2=c;
break;
}
}
}
}
else
{
year2=Time.Year-1;
if ((d+yue[((guanxi[Time.Year-1]&0x00ffff00)>>8)%2])>0)
{
month2=12;
day2=d+yue[((guanxi[Time.Year-1]&0x00000100)>>8)%2];
}
else
{
month2=11;
day2=d+yue[((guanxi[Time.Year-1]&0x00300)>>9)%2]+yue[((guanxi[Time.Year-1]&0x00000300)>>8)%2];
}
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -