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

📄 main.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=40,sec_pre=0;
u8 wink_mode=0;	
u8 key_temp=0;
u8 key_coun=0;
u8 sys_mode=1;
bit key_flag=0;
bit adj_flag=0;

u8 hour=23,min=59,month=10,day=25;
u16 m_day=365,year=2001;


void Sys_Init();
void calc_time();
unsigned char calc_day(u16 year);
void display();
void calc_month_day();
void wink_set(u8 wink);
void delay(u16 timeinms);
void key_scan();
void key_proc();
void stopwatch_ctrl(u8 ctrl);
void time_adj(u8 ctrl);



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=67;
		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()
{  
	Sys_Init();
	while(1)
	{
	if(sec_pre!=sec)
		{
			calc_time();
			display();
			sec_pre=sec;
		}
	key_scan();
	key_proc();
	}	
}

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


void calc_time()
{
	if(adj_flag)
		{
		calc_month_day();
		return;
		}
	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;
					year+=1;
					}
				}
			 }
		 }
	calc_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()
{	
	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()
{

				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()
{
	if(key_coun>50)
		{
		  	if(key_temp==KEY1)
				{
				sys_mode=0;
				adj_flag=1;
				put_str("ADJTIME",1);
				wink_mode=1;
				if(adj_flag)
					key_coun=0;
				}
		//	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(DOWN);
						break;
					}
				case KEY3:					
					{
						if(sys_mode==2)
							stopwatch_ctrl(STOP);
						if(sys_mode==0)
							time_adj(UP);
						break;
					}
				case KEY4:
					{
						if(sys_mode==0)
							sys_mode=1;
							adj_flag=0;
							put_str("       ",1);
							wink_mode=0;
						break;
					}
				default: break;	
				}
	//	put_str("short",1);		
		key_coun=0;
	}
			
	
}

void stopwatch_ctrl(u8 ctrl)
{}
void time_adj(u8 ctrl)
{
	u8 is_leap=calc_day(year);
	u8 temp;
	switch(wink_mode)
	{
	case 0:
		break;
	case 1:
		if(ctrl==UP)
			year+=1;
		else if(ctrl==DOWN)
			year-=1;
			if(calc_day(year)||is_leap)
				if(is_leap)
					m_day-=1;
				else
					m_day+=1;
		  break;
	case 2:
		if(ctrl==UP&&month<12)
			m_day+=non_leap_table[month+(is_leap?0:12)];
		else if(ctrl==DOWN&&month>1)
			m_day-=non_leap_table[month+(is_leap?0:12)-1];;
		  break;			
	case 3:
		if(ctrl==UP)
		{
			if(m_day<(calc_day(year)?365:366))
			m_day+=1;
			else
			{year+=1;m_day=1;}
		}
		else if(ctrl==DOWN)
		{
			if(m_day>1)
			m_day-=1;
			else
			m_day=calc_day(year-1)?365:366;
		}

		  break;
	case 4:
		if(ctrl==UP)
			{if(hour<23)hour+=1;else hour=0;}
		else if(ctrl==DOWN)
			{if(hour>0)hour-=1;else hour=23;}
		  break;
	case 5:
		if(ctrl==UP)
			{if(min<59)min+=1;else min=0;}
		else if(ctrl==DOWN)
			{if(min>0)min-=1;else min=59;}
		  break;	  	
	case 6:
		sec=0;
		  break;		  
	default:
		  break;
	}
}

⌨️ 快捷键说明

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