深夜不眠,和大家分享自己刚写出来的GPS获得的UTC时间转换为北京时间,还有星期转换函数,在0.96寸oled显示
//月修正数据表
unsigned char const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};
//获得现在是星期几
//功能描述:输入公历日期得到星期(只允许1901-2099年)
//year,month,day:公历年月日
//返回值:星期号
unsigned char GPS_Get_Week(unsigned int year,unsigned char month,unsigned char day)
{
unsigned int temp2;
unsigned char yearH,yearL;
yearH=year/100; yearL=year%100;
// 如果为21世纪,年份数加100
if (yearH>19)yearL+=100;
// 所过闰年数只算1900年之后的
temp2=yearL+yearL/4;
temp2=temp2%7;
temp2=temp2+day+table_week[month-1];
if (yearL%4==0&&month<3)temp2--;
return(temp2%7);
}
//星期几显示
void Week_Show(unsigned int year,unsigned char month,unsigned char day)
{
unsigned char week;
week = GPS_Get_Week(year,month,day);
switch(week)
{
case 1:
OLED_Show_Chinese(112,16,one_font,1,16,1);//显示汉字“一”
break;
case 2:
OLED_Show_Chinese(112,16,two_font,1,16,1);//显示汉字“二”
break;
case 3:
OLED_Show_Chinese(112,16,three_font,1,16,1);//显示汉字“三”
break;
case 4:
OLED_Show_Chinese(112,16,four_font,1,16,1);//显示汉字“四”
break;
case 5:
OLED_Show_Chinese(112,16,five_font,1,16,1);//显示汉字“五”
break;
case 6:
OLED_Show_Chinese(112,16,six_font,1,16,1);//显示汉字“六”
break;
case 7:
OLED_Show_Chinese(112,16,seven_font,1,16,1);//显示汉字“日”
break;
default:
break;
}
OLED_Show_Chinese(80,16,week_font,2,16,1);//显示汉字“日”
}
//UTC时间转换为北京时间
void UTCToBeijing(unsigned int year,unsigned char month,unsigned char day,unsigned int hour,unsigned char minute,unsigned char second)
{
hour += 8;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//1,3,5,7,8,9,12月每月为31天
{
if(hour >= 24)
{
hour -= 24;day += 1;//如果超过24小时,减去24小时,后再加上一天
if(day > 31){day -= 31;month += 1;}//如果超过31一天,减去31天,后加上一个月
}
}
else if(month==4||month==6||month==9||month==11)//4,6,9,11月每月为30天
{
if(hour >= 24)
{
hour -= 24;day += 1;//如果超过24小时,减去24小时,后再加上一天
if(day > 30){day -= 30;month += 1;}//如果超过30一天,减去30天,后加上一个月
}
}
else//剩下为2月,闰年为29天,平年为28天
{
if(hour >= 24)
{
hour -= 24;day += 1;
if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//判断是否为闰年,年号能被400整除或年号能被4整除,而不能被100整除为闰年
{if(day > 29){day -= 29;month += 1;}}//为闰年
else{if(day > 28){day -= 28;month += 1;}}//为平年
}
}
sprintf((char *)date_dtbuf,"%04d",year);
OLED_ShowString(8,0,date_dtbuf,16,1);
sprintf((char *)date_dtbuf,"%02d",month);
OLED_ShowString(56,0,date_dtbuf,16,1);
sprintf((char *)date_dtbuf,"%02d",day);
OLED_ShowString(88,0,date_dtbuf,16,1);
OLED_Show_Chinese(40,0,year_font,1,16,1);//显示汉字“年”
OLED_Show_Chinese(72,0,month_font,1,16,1);//显示汉字“月”
OLED_Show_Chinese(104,0,day_font,1,16,1);//显示汉字“日”
sprintf((char *)time_dtbuf,"%02d:%02d:%02d",hour,minute,second);
OLED_ShowString(0,16,time_dtbuf,16,1);
Week_Show(year,month,day);//星期显示
OLED_Refresh_Gram();
}
|