收到Nucleo-F413ZH开发板已经有一段时间了,由于前一段较忙就没有及时上手,现在该兑现当初的设想了。 当初的设想是制作生肖图案型万年历,主要涉及几个关键的步骤: 1)完成开发环境的构建,为制作与开发准备好条件; 2)以Nucleo-F413ZH为核心,利用其内部的RTC实现万年历的计时功能; 3)利用Nucleo-F413ZH自身1.5MB的Flash,在无SD卡及文件系统的条件下实现串口TFT屏上的生肖图案显示; 4)建立年份与生肖图案的对应关系; 5)配置按键以进行时间值的设置与修正,并完成设计目标。 说到这,我们的主角是什么样子呢? 那就来看看它帅帅的样子吧,详见图1所示。 图1 Nucleo-F413ZH 开发板
新年刚过,还是先让我们从生肖聊起吧。 今年是丁酉年,也就是**年。这是由我们传统的天干地支纪年法来表示的,即用天干的甲乙丙丁戊己庚辛壬癸, 与地支的子(鼠)丑(牛)寅(虎)卯(兔)辰(龙)巳(蛇)午(马)未(羊)申(猴)酉(**)戌(狗) 亥(猪)所组合出的。以今年的2017为例,是丁酉年。那2018年就是在天干中取出“丁”的下一位“戊”, 与地支中“酉”下一位“戌”相组合构成“戊戌”,即戊戌变法120周年。 依天干地支计年法可知,60年是一个轮回(10与12的最小公倍数),即一个甲子。所以到明年,就距戊戌变法 2个甲子了。 了解了前面的关系,我们基本上就可以为公历纪年与生肖纪年建立一个转换关系。 方法是先找到甲子年,然后进行推算。 今年是丁酉年,向回推9年,就是戊子年,即2008年。 再回推12年,即2008-12=1996年为丙子年,可见每回退12年,则天干就向前回退2个位置,那么甲子年就是 1996-12=1984年。 有了1984年为甲子年这个基准,我们就可以推算出给定年份的生肖,其方法如下: 设x=2036年,则d=2036-1984=52,天干=d %10+甲=2+甲=丙,地支=d%12+子=4+子=辰,所以2036年为丙辰龙年。 为了使推算的时间范围更广,也可将甲子年的基点设的更早,如0004年也可以。 经实际检查,结果也是准确的,通过串口输出的结果如图2所示。 图1 生肖纪年转换效果 相应的程序代码如下: int main(void)
{
unsigned int i,j,k,t,d;
HAL_Init();
SystemClock_Config();
USART3_Init();
// com3 9600bps
printf("天干地支纪年推算 \r\n");
i=2016;
while(1)
{
printf("%d 年",i);
k=i-4; //1984
t=k%10;
d=k%12;
if(t==0) printf("甲");
if(t==1) printf("乙");
if(t==2) printf("丙");
if(t==3) printf("丁");
if(t==4) printf("戊");
if(t==5) printf("己");
if(t==6) printf("庚");
if(t==7) printf("辛");
if(t==8) printf("壬");
if(t==9) printf("癸");
if(d==0) printf("子鼠");
if(d==1) printf("丑牛");
if(d==2) printf("寅虎");
if(d==3) printf("卯兔");
if(d==4) printf("辰龙");
if(d==5) printf("巳蛇");
if(d==6) printf("午马");
if(d==7) printf("未羊");
if(d==8) printf("申猴");
if(d==9) printf("酉**");
if(d==10) printf("戌狗");
if(d==11) printf("亥猪");
printf("年 \r\n");
i++;
HAL_Delay(1000);
}
}
部分验证结果如下:
历史年份转换值: 1544 年 甲辰龙年 1545 年 乙巳蛇年 1546 年 丙午马年 1547 年 丁未羊年 1548 年 戊申猴年 1549 年 己酉**年 1550 年 庚戌狗年 1551 年 辛亥猪年 1552 年 壬子鼠年 1553 年 癸丑牛年 1554 年 甲寅虎年 1555 年 乙卯兔年 1556 年 丙辰龙年 1557 年 丁巳蛇年 1558 年 戊午马年 1559 年 己未羊年 1560 年 庚申猴年 1561 年 辛酉**年 1562 年 壬戌狗年 1563 年 癸亥猪年 1564 年 甲子鼠年
未来年份转换值: 2084 年 甲辰龙年 2085 年 乙巳蛇年 2086 年 丙午马年 2087 年 丁未羊年 2088 年 戊申猴年 2089 年 己酉**年 2090 年 庚戌狗年 2091 年 辛亥猪年 2092 年 壬子鼠年 2093 年 癸丑牛年 2094 年 甲寅虎年 2095 年 乙卯兔年 2096 年 丙辰龙年 2097 年 丁巳蛇年 2098 年 戊午马年 2099 年 己未羊年 2100 年 庚申猴年 2101 年 辛酉**年 2102 年 壬戌狗年 2103 年 癸亥猪年 2104 年 甲子鼠年
后面我们再介绍星期值得推算方法。
|