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

📄 main.c

📁 一个完整的万年表程序,用Keil uVision可以成功编译
💻 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 + -