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

📄 main_bak.c

📁 KEIL下编的SST89E58单片机万年历(定时器)程序
💻 C
字号:
/*
 *	Copyright (C) 2007, 华中科技大学电气与电子科技创新中心
 *	All Rights Reserved.
 *	
 *	文件名:		main.c
 *	文件描述:   万年历主程序
 *			
 *	当前版本:	1.0
 *	作者:		Zuowenping(fmku007@163.com)
 *	完成日期:	2007年12月17日
 *	
*/
#include "reg51.h"
#include "intrins.h"
#include "lcd1602.h"


typedef unsigned char u8;
typedef unsigned int u16;

#define MAIN_COUN 49  

#define KEY1 0xfe
#define KEY2 0xfd
#define KEY3 0xfb
#define KEY4 0xf7

#define START 0x01
#define PAUSE 0x02
#define STPAU 0x03
#define STOP  0x00

#define UP    0x01
#define DOWN  0x02


u8 int_coun=0,sec=0,sec_pre=0;
u8 wink_mode=0;	
u8 key_temp=0;
u8 key_coun=0;
u8 sys_mode=1;
bit key_flag=0;


void Sys_Init();
void calc_time(u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day);
unsigned char calc_day(u16 year);
void display(u8 sec,u8 min,u8 hour,u16 year,u8 day,u8 month);
void calc_month_day(u16 m_day,u16 year,u8* month,u8* day);
void wink_set(u8 wink);
void delay(u16 timeinms);
void key_scan();
void key_proc(u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day);
void stopwatch_ctrl(u8 ctrl);
void time_adj(u8 ctrl,u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day);



static u8 code non_leap_table[]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};  //0-11:non_leap  12-23  leap year month table



void int_svr() interrupt 3
{	
	TH1=184;
	TL1=0;
		if(int_coun<MAIN_COUN)
	 		int_coun+=1;
		else 
		{	int_coun=0;
			if(sec<59)
				sec+=1;
			else
				sec=0;
		}
		if(int_coun==MAIN_COUN/2)
		{/*put_char(13,1,32);*/wink_set(wink_mode);}
	else if(int_coun==0)
		put_char(13,1,':');

}


void main()
{  
	u8 hour,min,month,day;
	u16 m_day=365,year=2000;
	Sys_Init();
	while(1)
	{
	if(sec_pre!=sec)
		{
			calc_time(&min,&hour,&m_day,&year,&month,&day);
			display(sec,min,hour,year,day,month);
			sec_pre=sec;
		}
	key_scan();
	key_proc(&min,&hour,&m_day,&year,&month,&day);
	}	
}

void Sys_Init()
{
	lcd_init();
	TMOD=0x10;
	TH1=184;
	TL1=0;
	EA=1;
	ET1=1;
	TR1=1;
}


void calc_time(u8* min,u8* hour,u16* m_day,u16* year,u8* month,u8* day)
{
	if(sec_pre==59)
		{
		if(*min<59)
			*min+=1;
		else 
			{
			*min=0;
			if(*hour<23)
				*hour+=1;
			else
				{
				*hour=0;
				if(*m_day<(365+calc_day(*year)))
					*m_day+=1;
				else
					*m_day=1;
				}
			 }
		 }
	calc_month_day(*m_day,*year,month,day);

}

unsigned char calc_day(u16 year)
{
	if((year%4==0&&year%100!=0)||year%400==0)
		return 1;
	else
		return 0;
}


void calc_month_day(u16 m_day,u16 year,u8* month,u8* day)
{	
	u8 leap_flag,i;
	u16 day_sum=0;
	if(calc_day(year))
		leap_flag=12;
	else
		leap_flag=0;
//	leap_flag=12;
	for(i=1;i<13;i++)
			{
			day_sum+=non_leap_table[leap_flag+i-1];
			if(day_sum>=m_day)
				{	
				*month=i;
				*day=m_day+non_leap_table[leap_flag+i-1]-day_sum;
				break;
				}		
			 }
}

void display(u8 sec,u8 min,u8 hour,u16 year,u8 day,u8 month)
{

				put_char(0,0,year/1000+48);
				put_char(1,0,(year%1000)/100+48);
				put_char(2,0,year%1000%100/10+48);
				put_char(3,0,year%1000%100%10+48);


				put_char(5,0,month/10+48);
				put_char(6,0,month%10+48);


				put_char(8,0,day/10+48);	
				put_char(9,0,day%10+48);

				put_char(8,1,hour/10+48);
				put_char(9,1,hour%10+48);

				put_char(11,1,min/10+48);
				put_char(12,1,min%10+48);

				put_char(14,1,sec/10+48);
				put_char(15,1,sec%10+48);
	
				put_char(4,0,'-');
				put_char(7,0,'-');
				put_char(10,1,':');	
}


void wink_set(u8 wink)
{
	switch(wink)
	{
	case 0:
		break;
	case 1:
		{ 		
			put_char(0,0,' ');
			put_char(1,0,' ');
			put_char(2,0,' ');
			put_char(3,0,' ');
			break;
		}
	case 2:
		{
			put_char(5,0,' ');
			put_char(6,0,' ');
			break;
		}
	case 3:
		{
			put_char(8,0,' ');
			put_char(9,0,' ');
			break;
		}
	case 4:
		{
			put_char(8,1,' ');
			put_char(9,1,' ');
			break;
		}
	case 5:
		{
			put_char(11,1,' ');
			put_char(12,1,' ');
			break;
		}
	case 6:
		{
			put_char(14,1,' ');
			put_char(15,1,' ');
			break;
		}
	default: break;
	}
}

void delay(u16 timeinms)
{
	u16 i,j;
	for (i=timeinms;i>0;i--)
		for(j=0;j<1000;j++)
			_nop_();
}

void key_scan()
{
	P1=0xFF;
	if(P1!=0xFF)
		{
			key_temp=P1;
			delay(2);
			if(key_temp==P1&&key_coun<255)
					key_coun+=1;
		}
	 else
	 	key_coun=0;
}

void key_proc(&min,&hour,&m_day,&year,&month,&day)
{
	if(key_coun>50)
		{
		  	if(key_temp==KEY1)
				{
				sys_mode=0;
				wink_mode=1;
				}
			put_str("long ",1);
			return;
		}
	if(key_coun>5&&(P1!=key_temp))
	{
			switch(key_temp) {
				case KEY1:
					{	
						if(sys_mode==1)
							sys_mode=2;
						if(sys_mode==2)
							sys_mode=3;
						if(sys_mode==3)
							sys_mode=1;
						if(sys_mode==0)
							{
							if(wink_mode<6)
								wink_mode+=1;
							else
								wink_mode=1;
							}
						break;
					}
				case KEY2:
					{
						if(sys_mode==2)
							stopwatch_ctrl(STPAU);
						if(sys_mode==0)
							time_adj(UP);
						break;
					}
				case KEY3:					
					{
						if(sys_mode==2)
							stopwatch_ctrl(STOP);
						if(sys_mode==0)
							time_adj(DOWN,min,hour,m_day,year,month,day);
						break;
					}
				case KEY4:
					{
						if(sys_mode==0)
							sys_mode=1;
							wink_mode=0;
						break;
					}
				default: break;	
				}
		put_str("short",1);		
		key_coun=0;
	}
			
	
}

void stopwatch_ctrl(u8 ctrl)
{}
void time_adj(u8 ctrl)
{
	switch(wink_mode)
	{
	case 0:
		break;
	case 1:
		if(ctrl==UP);
			
	
	}
}

⌨️ 快捷键说明

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