打印
[STM32F4]

【Nucleo-F413ZH创想】生肖图案型万年历 之一

[复制链接]
1020|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    收到Nucleo-F413ZH开发板已经有一段时间了,由于前一段较忙就没有及时上手,现在该兑现当初的设想了。
当初的设想是制作生肖图案型万年历,主要涉及几个关键的步骤:
1)完成开发环境的构建,为制作与开发准备好条件;
2)以Nucleo-F413ZH为核心,利用其内部的RTC实现万年历的计时功能;
3)利用Nucleo-F413ZH自身1.5MBFlash,在无SD卡及文件系统的条件下实现串口TFT屏上的生肖图案显示;
4)建立年份与生肖图案的对应关系;
5)配置按键以进行时间值的设置与修正,并完成设计目标。
说到这,我们的主角是什么样子呢?
那就来看看它帅帅的样子吧,详见图1所示。
    图1 Nucleo-F413ZH 开发板

    新年刚过,还是先让我们从生肖聊起吧。
今年是丁酉年,也就是**年。这是由我们传统的天干地支纪年法来表示的,即用天干的甲乙丙丁戊己庚辛壬癸,
与地支的子(鼠)丑(牛)寅(虎)卯(兔)辰(龙)巳(蛇)午(马)未(羊)申(猴)酉(**)戌(狗)
亥(猪)所组合出的。以今年的2017为例,是丁酉年。那2018年就是在天干中取出“丁”的下一位“戊”,
与地支中“酉”下一位“戌”相组合构成“戊戌”,即戊戌变法120周年。
依天干地支计年法可知,60年是一个轮回(1012的最小公倍数),即一个甲子。所以到明年,就距戊戌变法
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 年 甲子鼠年

后面我们再介绍星期值得推算方法。

沙发
cgd| | 2017-2-23 17:52 | 只看该作者
前排留名

使用特权

评论回复
板凳
wahahaheihei| | 2017-2-23 21:48 | 只看该作者
收了,没想到还可以通过C语音来计算这个老黄历。

使用特权

评论回复
地板
jinglixixi|  楼主 | 2017-2-24 08:32 | 只看该作者
wahahaheihei 发表于 2017-2-23 21:48
收了,没想到还可以通过C语音来计算这个老黄历。

比较有意思,后面准备把星期值、24节气的推算做完并在TFT屏上实现。

使用特权

评论回复
5
wahahaheihei| | 2017-2-26 20:54 | 只看该作者
jinglixixi 发表于 2017-2-24 08:32
比较有意思,后面准备把星期值、24节气的推算做完并在TFT屏上实现。

这个好,我们都还不会算呢,弄好了,分享分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2703

帖子

38

粉丝