#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;
}
}
时间,日期,菜单调节
最新推荐文章于 2022-11-03 21:38:46 发布