时间,日期,菜单调节

#include <REGX52.H>

/************************************************

			主程序 定义区

************************************************/

//==============DEFINE====================
#define uchar unsigned char
#define uint unsigned int

/*PORT DEFINE*/
#define led_port P0
#define cube_number_port P0
#define cube_location_port P2

//==============BIT DEFINE================
/*LATCH BIT*/
sbit led_latch = P2^5;
sbit cube_latch = P3^6;

//==============METHOD CLAIM==============
/*initial group*/
void initial(void);
	void latch_initial(void);
		void led_latch_initial(void);
		void cube_latch_initial(void);
/*delay group*/
void delay(uchar ms);
/*复制行*/
void line_copy(uchar *destination, uchar *source);
/*十进制转BCD码*/
uchar decimal_2_BCD(uchar decimal);

/************************************************

			LCD1602 定义区

************************************************/

	//=================PORT DEFINE=============
	#define lcd_port P0

	//=================LOCATION DEFINE================
	#define LINE1_HEAD 0x80
	#define LINE2_HEAD 0x80+0x40
	#define YEAR_LOCATION	LINE1_HEAD+3
	#define MONTH_LOCATION	LINE1_HEAD+6
	#define DAY_LOCATION	LINE1_HEAD+9
	#define WEEK_LOCATION	LINE1_HEAD+12
	#define HOUR_LOCATION	LINE2_HEAD+1
	#define MINUTE_LOCATION	LINE2_HEAD+4
	#define SECOND_LOCATION	LINE2_HEAD+7
	#define TEMPERATURE_LOCATION	LINE2_HEAD+10

	//=================BIT DEFINE==============
	sbit LCD_RS = P1^7;
	sbit LCD_RW = P1^6;									
	sbit LCD_EN = P2^4;
	
	//===============DATA CLAIM===============
	uchar code welcome_line1[16] = {"WELCOME TO TIMER"};
	uchar code welcome_line2[16] = {"   loading...   "};
	uchar code option_change_line[16] = {"*+ *- *OK *BACK "};	//格式:【·+ ·- ·OK ·BACK 】
	uchar code option_choose_line[16] = {"*< *> *OK *BACK "};	//格式:【·< ·> ·OK ·BACK 】
	uchar code date_line[16] = {" 20  -  -       "};			//格式:【 XXXX-XX-XX XXX 】
	uchar code time_line[16] = {"   :  :     . `C"};			//格式:【XX:XX:XX  XX.X'C】
	uchar code number_table[10] = {"0123456789"};
	
	uchar line1[16] = {"                "};
	uchar line2[16] = {"                "};

	//===============METHOD CLAIM==============
	void lcd_initial(void);
		void lcd_initial_display(void);
	
	void lcd_command(uchar command);
	void lcd_date(uchar date);
	
	void lcd_line1(void);
	void lcd_line2(void);
	
	void fresh_2bit(uchar location, uchar number);

	void fresh_time(void);	
		void fresh_hour(uchar hour);
		void fresh_minute(uchar minute);
		void fresh_second(uchar second);

	void fresh_date(void);
		void fresh_year (uchar year);
		void fresh_month (uchar month);
		void fresh_day (uchar day);
		void fresh_week (uchar week);
	
	void single_line_display(uchar line, uchar *display_line);

/************************************************

			DS1302 定义区

************************************************/
		
	#define WRITE_PROTECT   0x8E
	/*
		时间数据
	*/
	#define WRITE_SECOND	0x80
	#define WRITE_MINUTE    0x82
	#define WRITE_HOUR      0x84
	#define READ_SECOND     0x81
	#define READ_MINUTE		0x83
	#define READ_HOUR       0x85
	/*
		日期数据
	*/
	#define WRITE_YEAR		0x8c
	#define WRITE_MONTH		0x88
	#define WRITE_DAY		0x86
	#define WRITE_WEEK		0x8a
	#define READ_YEAR		0x8d
	#define READ_MONTH		0x89
	#define READ_DAY		0x87
	#define READ_WEEK		0x8b
	
	//位寻址寄存器定义
	sbit ACC_7 = ACC^7;
	//管脚定义
	sbit SCLK = P1^4;    // DS1302时钟信号      7脚
	sbit DIO= P1^5;      // DS1302数据信号   	6脚
	sbit CE = P2^2;      // DS1302片选   	  	5脚
	
	void ds1302_initial(void);
	
	void Write1302 ( uchar addr,uchar dat );
	uchar Read1302 ( uchar addr );
	/*获取时间*/
	uchar get_second(void);
	uchar get_minute(void);
	uchar get_hour(void);
	/*修改时间*/
	void change_second(uchar second);
	void change_minute(uchar minute);
	void change_hour(uchar hour);
	/*获取日期*/
	uchar get_year(void);
	uchar get_month(void);
	uchar get_day(void);
	uchar get_week(void);
	/*修改日期*/
	void change_day(uchar day);
	void change_month(uchar month);
	void change_year(uchar year);

/************************************************

			单键盘 定义区

************************************************/

	/*键盘位 定义*/
	sbit key1 = P1^0;
	sbit key2 = P1^1;
	sbit key3 = P1^2;
	sbit key4 = P1^3;
	
	/*子函数 声明*/
	uchar key_pressed(void);
/************************************************

			修改时间、日期模块 定义区

************************************************/

	uchar cursor_number = 0;
	/*主菜单*/	
	void menu(void);
		void menu_initial(void);
		void menu_quit(void);
		void menu_fresh(void);
	/*选择、修改 子菜单*/
	void time_choose_menu(void);
	void time_change_menu(void);
		void time_change_initial(void);
	void date_choose_menu(void);
	void date_change_menu(void);
		void date_change_initial(void);
	/*修改时间*/
	void time_change_secondL(void);
	void time_change_secondH(void);
	void time_change_minuteL(void);
	void time_change_minuteH(void);
	void time_change_hourL(void);
	void time_change_hourH(void);
	/*修改日期*/	
	void date_change_dayL(void);
	void date_change_dayH(void);
	void date_change_monthL(void);
	void date_change_monthH(void);
	void date_change_yearL(void);
	void date_change_yearH(void);
	/*数据预览*/
	void fresh_virtul_time(uchar single_bit);
	/*光标状态*/
	void cursor_choose(void);
	void cursor_change(void);
	void cursor_normal(void);
	/*光标定位*/
	void cursor_location(void);
	/*光标移动*/
	void cursor_left(void);
	void cursor_right(void);

/************************************************************************************************

							MAIN() 主函数

************************************************************************************************/

void main(void)
{
	initial();
	delay(255);delay(255);delay(255);
	single_line_display(1,date_line);
	single_line_display(2,time_line);
	while(1)
	{
		fresh_date();
		fresh_time();
		if(key_pressed() == 3)
		{
			menu();	
		}
		delay(5);
	}
}

/************************************************

			主程序 子函数 定义区

************************************************/

/******************************

	主程序 子函数 初始化

******************************/
void initial(void)
{
	latch_initial();
	lcd_initial();
	ds1302_initial();
}
void latch_initial(void)
{
	led_latch_initial();
	cube_latch_initial();
}

void led_latch_initial(void)
{
	led_latch = 1;
	led_port = 0xff;
	led_latch = 0; 	
}

void cube_latch_initial(void)
{
	cube_number_port = 0xff;
	cube_location_port = 0xff;
	cube_latch = 1;
	cube_latch = 0;
}

/******************************

	延时子程序

******************************/
void delay(uchar ms)
{
	uchar basic = 0;
	while(ms--)
	{
		for(basic = 125; basic > 0; basic--);
	}
}

/******************************

	行字符 复制程序

******************************/
void line_copy(uchar *destination, uchar *source)
{
	uchar i = 0;
	for(i = 0; i<16; i++)
	{
		*(destination+i) = *(source + i);
	}
}

/******************************

	十进制 转 十六进制

******************************/

uchar decimal_2_BCD(uchar decimal)
{
	uchar hex,temp;

	hex = decimal / 10;		//十进制的十位
	temp = decimal % 10;	//十进制的个位
	hex = hex*16 + temp;
	
	return hex;
}

/************************************************

			LCD1602 子函数 定义区

************************************************/
/*******************************

		初始化程序

*******************************/
void lcd_initial(void)
{
	LCD_RW = 0;//进入写模式	
	
	lcd_command(0x38);//显示模式							(0011 1000)B
	lcd_command(0x0c);//显示开、光标不显示、光标不闪烁	 	(0000 1100)B
	lcd_command(0x06);//读/写字符后光标向右移、整屏不移动	(0000 0110)B
	lcd_command(0x80);//地址指针定位						
	lcd_initial_display(); //初始化显示字符,进入加载模式(假的)
}

void lcd_initial_display(void)
{
	line_copy(line1,welcome_line1);
	line_copy(line2,welcome_line2);
	lcd_line1();
	lcd_line2();
}

/*******************************

		基础程序组

*******************************/
void lcd_command(uchar command)
{
	LCD_RS = 0;
	lcd_port = command;
	delay(1);
	LCD_EN = 1;
	delay(1);
	LCD_EN = 0;
}

void lcd_date(uchar date)
{
	LCD_RS = 1;
	lcd_port = date;
	delay(1);
	LCD_EN = 1;
	delay(1);
	LCD_EN = 0;
}

/*******************************

		整行显示

*******************************/
void lcd_line1(void)
{
	uchar i;
	lcd_command( LINE1_HEAD );

	for(i = 0; i<16; i++)
	{
		lcd_date(line1[i]);
		delay(2);
	}
}

void lcd_line2(void)
{
	uchar i;
	lcd_command( LINE2_HEAD );

	for(i = 0; i<16; i++)
	{
		lcd_date(line2[i]);
		delay(2);
	}
}

/*******************************

		两位数字 显示更新
	
*******************************/

void fresh_2bit(uchar location, uchar number)
{
	lcd_command(location);
	lcd_date( number_table[number/10] );
	lcd_date( number_table[number%10] );
	delay(1);
}

/*******************************

		DS1302 时间显示更新
	
*******************************/

void fresh_time(void)
{
	fresh_hour(get_hour()); 
	fresh_minute(get_minute());
	fresh_second(get_second());	
}

void fresh_hour(uchar hour)
{
	fresh_2bit(HOUR_LOCATION,hour);
}

void fresh_minute(uchar minute)
{
	fresh_2bit(MINUTE_LOCATION,minute);
}

void fresh_second(uchar second)
{
	fresh_2bit(SECOND_LOCATION,second);
}

/*******************************

		DS1302 日期显示更新
	
*******************************/

void fresh_date(void)
{
	fresh_year(get_year());
	fresh_month(get_month());
	fresh_day(get_day());
	fresh_week(get_week());	
}

void fresh_year (uchar year)
{
	fresh_2bit(YEAR_LOCATION, year);
}

void fresh_month (uchar month)
{
	fresh_2bit(MONTH_LOCATION, month);
}

void fresh_day (uchar day)
{
	fresh_2bit(DAY_LOCATION, day);
}

void fresh_week (uchar week)
{
	lcd_command(WEEK_LOCATION);
	switch(week)
	{
		case 1:	lcd_date( 'M' );
				lcd_date( 'O' );
				lcd_date( 'N' );
				break;
		case 2:	lcd_date( 'T' );
				lcd_date( 'U' );
				lcd_date( 'S' );
				break;
		case 3:	lcd_date( 'W' );
				lcd_date( 'E' );
				lcd_date( 'N' );
				break;
		case 4:	lcd_date( 'T' );
				lcd_date( 'H' );
				lcd_date( 'U' );
				break;
		case 5:	lcd_date( 'F' );
				lcd_date( 'R' );
				lcd_date( 'I' );
				break;
		case 6:	lcd_date( 'S' );
				lcd_date( 'A' );
				lcd_date( 'T' );
				break;
		case 7:	lcd_date( 'S' );
				lcd_date( 'U' );
				lcd_date( 'N' );
				break;
	}
}

/*******************************

		显示选项行(1、2选择第一行还是第二行)

*******************************/
void single_line_display(uchar line, uchar *display_line)
{
	if(line == 1)
	{
		line_copy(line1, display_line);
		lcd_line1();
	}else
	{
		line_copy(line2, display_line);
		lcd_line2();
	}
}


/************************************************

			DS1302 子函数 定义区

************************************************/

/*******************************

		初始化程序

*******************************/
void ds1302_initial(void)   
{
       Write1302 (WRITE_PROTECT,0X00);      //写保护 关
	   Write1302 (WRITE_YEAR,	0x11);
	   Write1302 (WRITE_MONTH,	0x08);
	   Write1302 (WRITE_DAY,	0x15);
	   Write1302 (WRITE_WEEK,	0x01);
       Write1302 (WRITE_SECOND,	0x36);      //秒位初始化   	(0101 0101)B
       Write1302 (WRITE_MINUTE,	0x16);      //分钟初始化	(0101 1001)B
       Write1302 (WRITE_HOUR,	0x23);		//小时初始化	(0010 0011)B
       Write1302 (WRITE_PROTECT,0x80);      //写保护 开
}

/*******************************

		基础程序

*******************************/ 
//地址、数据发送子程序
void Write1302 ( uchar addr,uchar dat )    
{
       uchar i,temp;
       CE=0;                         //CE引脚为低,数据传送中止
       SCLK=0;                    //清零时钟总线
       CE = 1;                       //CE引脚为高,逻辑控制有效
       //发送地址
       for ( i=8; i>0; i-- ) //循环8次移位
       {    
			SCLK = 0;
			temp = addr;
			DIO = (bit)(temp&0x01);          //每次传输低字节
			addr >>= 1;                //右移一位
			SCLK = 1;
       }
      
	//发送数据
       for ( i=8; i>0; i-- )
       {    
			SCLK = 0;
			temp = dat;
			DIO = (bit)(temp&0x01);         
			dat >>= 1;                  
			SCLK = 1;
       }
       CE = 0;        
}
 
//数据读取子程序
uchar Read1302 ( uchar addr )
{
       uchar i,temp,dat1,dat2;
       CE=0;          
       SCLK=0;            
       CE = 1; 
       //发送地址
       for ( i=8; i>0; i-- )                      //循环8次移位
       {    
			SCLK = 0;
			temp = addr;
			DIO = (bit)(temp&0x01);          //每次传输低字节
			addr >>= 1;                              //右移一位
			SCLK = 1;
       }
       //读取数据
       for ( i=8; i>0; i-- )
       {
         	ACC_7=DIO;
        	SCLK = 1;
        	ACC>>=1;
            SCLK = 0;
       }    
       CE=0;
       dat1=ACC;
       dat2=dat1/16;                           //数据进制转换
       dat1=dat1%16;                         //十六进制转十进制
       dat1=dat1+dat2*10;
       return (dat1);
}

/*******************************
		
		获取时间 接口程序

*******************************/
uchar get_second(void)
{
   	return Read1302(READ_SECOND);
}

uchar get_minute(void)
{
	return Read1302(READ_MINUTE);
}

uchar get_hour(void)
{
	return Read1302(READ_HOUR);
}

/*******************************
		
		修改时间 接口程序

*******************************/

void change_second(uchar second)
{
	Write1302 (WRITE_PROTECT,0X00);
	Write1302 (WRITE_SECOND, decimal_2_BCD(second));
	Write1302 (WRITE_PROTECT,0X80);
}

void change_minute(uchar minute)
{
	Write1302 (WRITE_PROTECT,0X00);
	Write1302 (WRITE_MINUTE, decimal_2_BCD(minute));
	Write1302 (WRITE_PROTECT,0X80);
}

void change_hour(uchar hour)
{
	Write1302 (WRITE_PROTECT,0X00);
	Write1302 (WRITE_HOUR, decimal_2_BCD(hour));
	Write1302 (WRITE_PROTECT,0X80);
}

/*******************************
		
		获取日期 接口程序

*******************************/
uchar get_year(void)
{
	return Read1302(READ_YEAR);
}

uchar get_month(void)
{
	return Read1302(READ_MONTH);
}

uchar get_day(void)
{
	return Read1302(READ_DAY);
}
uchar get_week(void)
{
	return Read1302(READ_WEEK);
}

/*******************************
		
		修改日期 接口程序

*******************************/

void change_day(uchar day)
{
	Write1302 (WRITE_PROTECT,0X00);
	Write1302 (WRITE_DAY, decimal_2_BCD(day));
	Write1302 (WRITE_PROTECT,0X80);
}

void change_month(uchar month)
{
	Write1302 (WRITE_PROTECT,0X00);
	Write1302 (WRITE_MONTH, decimal_2_BCD(month));
	Write1302 (WRITE_PROTECT,0X80);
}

void change_year(uchar year)
{
	Write1302 (WRITE_PROTECT,0X00);
	Write1302 (WRITE_YEAR, decimal_2_BCD(year));
	Write1302 (WRITE_PROTECT,0X80);
}

/************************************************

			单键盘 子函数 定义区

************************************************/

uchar key_pressed(void)
{
	uchar key_press = 0;
	key1 = key2 = key3 = key4 = 1;
	if( (key1&key2&key3&key4)!=1 )	//有键被按下
	{
		delay(5);	//延时 消抖
		if( (key1&key2&key3&key4)!=1 )
		{
			if( !key1 )
			{
				key_press = 1;
			}else if( !key2 )
			{
				key_press = 2;				
			}else if( !key3 )
			{
				key_press = 3;				
			}else if( !key4 )
			{
				key_press = 4;				
			}		
		}
		while( (key1&key2&key3&key4)!=1 )	//等待放开
		{;}						
		delay(5);	//延时 消抖
		while( (key1&key2&key3&key4)!=1 )	//确认放开
		{;}
	}
	return key_press;
}

/************************************************

			修改时间、日期模块 子函数 定义区

************************************************/
/*******************************
		
		主菜单

*******************************/

void menu(void)
{
	uchar quit = 0;	
	menu_initial();

	while( !quit )
	{
		switch( key_pressed() )	
		{
			case 1:	cursor_left();
					menu_fresh();
					break;
			case 2:	cursor_right();
					menu_fresh();
					break;
			case 3:	if(cursor_number < 6)
					{
						time_change_menu();
					}else
					{
						date_change_menu();
					}
					menu_fresh();
					break;
			case 4:	quit = 1;
					break;
		}
	}

	menu_quit();
}

void menu_initial(void)
{
	cursor_number = 0;
	time_choose_menu();
}

void menu_quit(void)
{
	single_line_display(1, date_line);
	fresh_date();
	single_line_display(2, time_line);
	fresh_time();
	cursor_normal();
}

void menu_fresh(void)
{
	if(cursor_number < 6)
	{
		time_choose_menu();
	}else
	{
		date_choose_menu();
	}
	cursor_location();
}

/*******************************
		
		副菜单
			调整时间 选择位菜单
			调整时间 修改菜单
			调整日期 选择位菜单
			调整日期 修改菜单

*******************************/

void time_choose_menu(void)
{
	single_line_display(1, option_choose_line);
	single_line_display(2, time_line);
	fresh_time();
	cursor_location();
	cursor_choose();
}

void time_change_menu(void)
{
	time_change_initial();
	
	switch( cursor_number )
	{
		case 0:	time_change_secondL();
				break;
		case 1:	time_change_secondH();
				break;
		case 2:	time_change_minuteL();
				break;
		case 3:	time_change_minuteH();
				break;
		case 4:	time_change_hourL();
				break;
		case 5:	time_change_hourH();
				break;
	}	
}

void time_change_initial(void)
{
	 single_line_display(1, option_change_line);
	 fresh_time();
	 cursor_location();
	 cursor_change();
}

void date_choose_menu(void)
{
	single_line_display(2, option_choose_line);
	single_line_display(1, date_line);
	fresh_date();
	cursor_location();
	cursor_choose();
}

void date_change_menu(void)
{
	date_change_initial();
	switch(cursor_number)
	{
		case 6:	date_change_dayL();
				break;
		case 7:	date_change_dayH();
				break;
		case 8:	date_change_monthL();
				break;
		case 9:	date_change_monthH();
				break;
		case 10:date_change_yearL();
				break;
		case 11:date_change_yearH();
				break;
	}
}

void date_change_initial(void)
{
	 single_line_display(2, option_change_line);
	 fresh_date();
	 cursor_location();
	 cursor_change();
}

/*******************************
		
		修改时间模块 子函数

*******************************/

void time_change_secondL(void)
{
	uchar quit =0;
	uchar second, secondL;

	second = get_second();
	secondL = second%10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	secondL ++;
					if( secondL > 9)
					{
						secondL = 0;
					}
					fresh_virtul_time(secondL);
					cursor_location();
					break;
			case 2:	secondL --;
					if( secondL > 9)
					{
						secondL = 9;
					}
					fresh_virtul_time(secondL);
					cursor_location();
					break;
			case 3:	second -= second%10;
					second += secondL;
					change_second(second);
			case 4:	quit = 1;
					break;
		}
	}

}

void time_change_secondH(void)
{
	uchar quit =0;
	uchar second, secondH;

	second = get_second();
	secondH = second/10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	secondH ++;
					if( secondH > 5)
					{
						secondH = 0;
					}
					fresh_virtul_time(secondH);
					cursor_location();
					break;
			case 2:	secondH --;
					if( secondH >5)
					{
						secondH = 5;
					}
					fresh_virtul_time(secondH);
					cursor_location();
					break;
			case 3:	second = second % 10;
					second += secondH * 10;
					change_second(second);
			case 4:	quit = 1;
					break;
		}
	}
}

void time_change_minuteL(void)
{
	uchar quit =0;
	uchar minute, minuteL;

	minute = get_minute();
	minuteL = minute%10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	minuteL ++;
					if( minuteL >9 )
					{
						minuteL = 0;
					}
					fresh_virtul_time(minuteL);
					cursor_location();
					break;
			case 2:	minuteL --;
					if( minuteL > 9)
					{
						minuteL = 9;
					}
					fresh_virtul_time(minuteL);
					cursor_location();
					break;
			case 3:	minute -= minute%10;
					minute += minuteL;
					change_minute(minute);
			case 4:	quit = 1;
					break;
		}
	}
}

void time_change_minuteH(void)
{
	uchar quit =0;
	uchar minute, minuteH;

	minute = get_minute();
	minuteH = minute/10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	minuteH ++;
					if( minuteH >5 )
					{
						minuteH = 0;
					}
					fresh_virtul_time(minuteH);
					cursor_location();
					break;
			case 2:	minuteH --;
					if( minuteH > 5)
					{
						minuteH = 5;
					}
					fresh_virtul_time(minuteH);
					cursor_location();
					break;
			case 3:	minute = minute % 10;
					minute += minuteH * 10;
					change_minute(minute);
			case 4:	quit = 1;
					break;
		}
	}
}

void time_change_hourL(void)
{
	uchar quit =0;
	uchar hour, hourL;

	hour = get_hour();
	hourL = hour%10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	hourL ++;
					if(hour < 20)
					{
						if( hourL > 9)
						{
							hourL = 0;
						}
					 }else
					 {
					 	if( hourL > 3)
						{
							hourL = 0;
						}
					 }
					fresh_virtul_time(hourL);
					cursor_location();
					break;
			case 2:	hourL --;
					if(hour < 20)
					{
						if( hourL > 9)
						{
							hourL = 9;
						}
					 }else
					 {
					 	if( hourL > 3)
						{
							hourL = 3;
						}
					 }
					fresh_virtul_time(hourL);
					cursor_location();
					break;
			case 3:	hour -= hour%10;
					hour += hourL;
					change_hour(hour);
			case 4:	quit = 1;
					break;
		}
	}
}

void time_change_hourH(void)
{
	uchar quit =0;
	uchar hour, hourH;

	hour = get_hour();
	hourH = hour/10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	hourH ++;
					if(hour%10 >3)
					{
						if(hourH > 1 )
						{
							hourH = 0;
						}
					}else
					{
						if(hourH > 2)
						{
							hourH = 0;
						}
					}
					fresh_virtul_time(hourH);
					cursor_location();
					break;
			case 2:	hourH --;
					if(hour%10 >3)
					{					
						if(hourH > 2 )
						{
							hourH = 1;
						}
					}else
					{
						if(hourH > 2)
						{
							hourH = 2;
						}
					}
					fresh_virtul_time(hourH);
					cursor_location();
					break;
			case 3:	hour = hour % 10;
					hour += hourH * 10;
					change_hour(hour);
			case 4:	quit = 1;
					break;
		}
	}
}
								
/*******************************
		
		修改日期模块 子函数

*******************************/

void date_change_dayL(void)
{
	uchar quit =0;
	uchar day, month, year, dayL;

	day = get_day();
	month = get_month();
	year = get_year();
	dayL = day%10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	dayL ++;
					if(month == 2) //2月
					{
						if( (year%4 == 0 && year%100 != 0)||(year%400 == 0) ) //闰年
						{
							if(day < 9)
							{	
								if(dayL > 9)	//10以内,0-9	
								{
									dayL = 1;
								}
							}else
							{
								if(dayL > 9) 	//10以上 1-9
								{
									dayL = 0;
								}
							}
						}else
						{
							if( day < 10)
							{
								if(dayL > 9)
								{
									dayL = 1;
								}
							}else if( day <20)
							{
								if(dayL > 9)
								{
									dayL = 0;
								}
							}else
							{
								if(dayL > 8)
								{
									dayL = 0;
								}
							}
						}
					}else		   //2月之外
					{
						if( day < 10 )	 //10以内,个位1~9
						{					
							if( dayL > 9)
							{
								dayL = 1;
							}
						}else if(day <20)
						{
							if( dayL >9)
							{
								dayL = 0;
							}
						}else			  //30以上,按月份区分
						{
							if((month == 4)||(month == 6)||(month == 9)||(month == 11))
							{
								dayL = 0;	//4、6、9、11月只有30号
							}else
							{
								if(dayL > 1)
								{
									dayL =0;
								}
							}	
						}
					}
					fresh_virtul_time(dayL);
					cursor_location();
					break;
			case 2:	dayL --;
					if(month == 2) //2月
					{
						if( (year%4 == 0 && year%100 != 0)||(year%400 == 0) ) //闰年
						{						
							if(dayL < 1) 	
							{
								dayL = 9;
							}
						}else	//平年
						{
							if( day < 10)
							{
								if(dayL < 1)
								{
									dayL = 9;
								}
							}else if( day < 20)
							{
								 if(dayL > 9)
								 {
								 	dayL = 9;
								 }
							}else
							{
								if(dayL > 9)
								{
									dayL = 8;
								}
							}
						}
					}else		   //2月之外
					{
						if( day < 10 )	 //10以内,个位1~9
						{					
							if( dayL < 1)
							{
								dayL = 9;
							}
						}else if(day < 30)
						{
							 if(dayL > 9)
							 {
							 	dayL = 9;
							 }
						}else
						{
							if( (month == 4)||(month == 6)||(month == 9)||(month == 11) ) //只有30的月
							{
								dayL = 0;
							}else
							{
								if( dayL > 1 )
								{
									dayL = 1;
								}
							}
						}
					}
					fresh_virtul_time(dayL);
					cursor_location();
					break;
			case 3:	day -= day%10;
					day += dayL;
					change_day(day);
			case 4:	quit = 1;
					break;
		}
	}
	
}
void date_change_dayH(void)
{
	uchar quit =0;
	uchar day, month, year, dayH;

	day = get_day();
	month = get_month();
	year = get_year();
	dayH = day/10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	dayH ++;
					if( month == 2 )
					{
						if( (year%4 == 0 && year%100 != 0)||(year%400 == 0) )
						{
							if( day % 10 == 0 )
							{
								if(dayH > 2)
								{
									dayH = 1;
								}
							}else
							{
								if( dayH > 2 )
								{
									dayH = 0;
								}
							}
						}else
						{
							if( day % 10 == 0 )
							{
								if( dayH > 2 )
								{
									dayH = 1;
								}
							}else if( day % 10 == 9 )
							{
								if( dayH > 1 )
								{
									dayH = 0;
								}
							}else
							{
								if( dayH > 2 )
								{
									dayH = 0;
								}
							}
						}
					}else if( (month == 4)||(month == 6)||(month == 9)||(month == 11) )
					{
						if( day % 10 == 0 )
						{
							if( dayH > 3 )
							{
								dayH = 1;
							}
						}else
						{
							if( dayH >2 )
							{
								dayH = 0;
							}
						}
					}else
					{
						if( day % 10 == 0 )
						{
							if( dayH > 3 )
							{
								dayH = 1;
							}
						}else if( day % 10 == 1)
						{
							if( dayH > 3 )
							{
								dayH = 0;
							}
						}else
						{
							if( dayH > 2 )
							{
								dayH = 0;
							}
						}						
					}
					fresh_virtul_time(dayH);
					cursor_location();
					break;
			case 2:	dayH --;
					if( month == 2 )
					{
						if( (year%4 == 0 && year%100 != 0)||(year%400 == 0) )
						{
							if( day % 10 == 0 )
							{
								if(dayH < 1)
								{
									dayH = 2;
								}
							}else
							{
								if( dayH > 2 )
								{
									dayH = 2;
								}
							}
						}else
						{
							if( day % 10 == 0 )
							{
								if( dayH < 1 )
								{
									dayH = 2;
								}
							}else if( day % 10 == 9 )
							{
								if( dayH > 1 )
								{
									dayH = 1;
								}
							}else
							{
								if( dayH > 2 )
								{
									dayH = 2;
								}
							}
						}
					}else if( (month == 4)||(month == 6)||(month == 9)||(month == 11) )
					{
						if( day % 10 == 0 )
						{
							if( dayH < 1 )
							{
								dayH = 3;
							}
						}else
						{
							if( dayH > 2 )
							{
								dayH = 2;
							}
						}
					}else
					{
						if( day % 10 == 0 )
						{
							if( dayH < 1 )
							{
								dayH = 3;
							}
						}else if( day % 10 == 1 )
						{
							if( dayH > 3 )
							{
								dayH = 3;
							}
						}else
						{
							if( dayH > 2 )
							{
								dayH = 2;
							}
						}						
					}
					fresh_virtul_time(dayH);
					cursor_location();
					break;
			case 3:	day = day % 10;
					day += dayH * 10;
					change_day(day);
			case 4:	quit = 1;
					break;
		}
	}
}

void date_change_monthL(void)
{
	uchar quit =0;
	uchar month, monthL;

	month = get_month();
	monthL = month%10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	monthL ++;
					if( month / 10 == 0 )
					{
						if( monthL > 9 )
						{
							monthL = 1;
						}
					}else
					{
						if( monthL > 2 )
						{
							monthL = 0;
						}
					}
					fresh_virtul_time(monthL);
					cursor_location();
					break;
			case 2:	monthL --;
					if( month / 10 == 0 )
					{
						if( monthL < 1 )
						{
							monthL = 9;
						}
					}else
					{
						if( monthL > 2 )
						{
							monthL = 2;
						}
					}
					fresh_virtul_time(monthL);
					cursor_location();
					break;
			case 3:	month -= month%10;
					month += monthL;
					change_month(month);
			case 4:	quit = 1;
					break;
		}
	}
	
}
void date_change_monthH(void)
{
	uchar quit =0;
	uchar month, monthH;

	month = get_month();
	monthH = month/10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	monthH ++;
					if( month % 10 == 0 )
					{
						monthH = 1;
					}else if( month % 10 == 1 || month % 10 == 2 )
					{
						if( monthH > 1 )
						{
							monthH = 0;
						}
					}else
					{
						monthH = 0;
					}
					fresh_virtul_time(monthH);
					cursor_location();
					break;
			case 2:	monthH --;
					if( month % 10 == 0 )
					{
						monthH = 1;
					}else if( month % 10 == 1 || month % 10 == 2 )
					{
						if( monthH > 1 )
						{
							monthH = 1;
						}
					}else
					{
						monthH = 0;
					}
					fresh_virtul_time(monthH);
					cursor_location();
					break;
			case 3:	month = month % 10;
					month += monthH * 10;
					change_month(month);
			case 4:	quit = 1;
					break;
		}
	}
}

void date_change_yearL(void)
{
	uchar quit =0;
	uchar year, yearL;

	year = get_year();
	yearL = year % 10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	yearL ++;
					if( yearL > 9 )
					{
						yearL = 0;
					}
					fresh_virtul_time(yearL);
					cursor_location();
					break;
			case 2:	yearL --;
					if( yearL > 9 )
					{
						yearL = 9;
					}
					fresh_virtul_time(yearL);
					cursor_location();
					break;
			case 3:	year -= year%10;
					year += yearL;
					change_year(year);
			case 4:	quit = 1;
					break;
		}
	}
	
}

void date_change_yearH(void)
{
	uchar quit =0;
	uchar year, yearH;

	year = get_year();
	yearH = year/10;
		
	while( !quit )
	{
		switch( key_pressed() )
		{
			case 1:	yearH ++;
					if( yearH > 7 )
					{
						yearH = 0;
					}
					fresh_virtul_time(yearH);
					cursor_location();
					break;
			case 2:	yearH --;
					if( yearH > 7 )
					{
						yearH = 7;
					}
					fresh_virtul_time(yearH);
					cursor_location();
					break;
			case 3:	year = year % 10;
					year += yearH * 10;
					change_year(year);
			case 4:	quit = 1;
					break;
		}
	}
}

/*******************************
		
		即时刷新数据 函数

*******************************/
void fresh_virtul_time(uchar single_bit)
{
	lcd_date( number_table[single_bit] );
}

/*******************************
		
		光标状态 子函数

*******************************/
void cursor_choose(void)
{
	lcd_command(0x0f);
}

void cursor_change(void)
{
	lcd_command(0x0e);
}

void cursor_normal(void)
{
	lcd_command(0x0c);
}

/*******************************
		
		光标定位 子函数

*******************************/

void cursor_location(void)
{
	switch(cursor_number)
	{
		case 0:	lcd_command(SECOND_LOCATION+1);
				break;
		case 1:	lcd_command(SECOND_LOCATION);
				break;
		case 2:	lcd_command(MINUTE_LOCATION+1);
				break;
		case 3:	lcd_command(MINUTE_LOCATION);
				break;
		case 4:	lcd_command(HOUR_LOCATION+1);
				break;
		case 5:	lcd_command(HOUR_LOCATION);
				break;
		case 6:	lcd_command(DAY_LOCATION+1);
				break;
		case 7:	lcd_command(DAY_LOCATION);
				break;
		case 8:	lcd_command(MONTH_LOCATION+1);
				break;
		case 9:	lcd_command(MONTH_LOCATION);
				break;
		case 10:lcd_command(YEAR_LOCATION+1);
				break;
		case 11:lcd_command(YEAR_LOCATION);
				break;
	}
}

/*******************************
		
		光标移动 子函数

*******************************/
void cursor_left(void)
{
	cursor_number++;
	if(cursor_number > 11)
	{
		cursor_number = 0;
	}	
}

void cursor_right(void)
{
	cursor_number--;
	if(cursor_number > 11)
	{
		cursor_number = 11;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值