微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 前两天看到论坛上的一个挂历图所以我也写了一个玩

前两天看到论坛上的一个挂历图所以我也写了一个玩

时间:10-02 整理:3721RD 点击:

      前两天看到论坛上的一个挂历图所以我也写了一个玩,之前不知道星期和日期的排列,闰年平年也分布清生肖排列也不了解多少所以设计的算法还可以优化。
     功能:1常见万能历形式:温度,时间,闹钟,调时;2日历表形式:范围2000~2099年间,计算日按星期排列位置.生肖.闰年平年。
    功能简单,以后有兴趣再增加游戏功能。今天上课时开小差写的,所以程序应该不会有雷同,给大家看一下我写的日历表函数的思路,如果有更简便的方法希望大家一起交流:
//====================================================================================================
void riliban(void)
{
//pdh
//1000830317
//2013/3/7
//基本部分
//无处理
  uchar m,d,yr;                                                            //月日年
  uchar i,xx,y;                                                //i循环计数,xx坐标,y坐标
  uchar monthx,month1;                                                //月首地址,1月首地址
  uchar nday,yu;                                                        //月天数,余数
  uchar rp,run=0,ping=0;                                    //闰年标志,闰年计数,平年计数
  uchar sx;                                                                        //生肖定位
  LCD12864_set_tu(0,0,shu0_31+672,16,64,0); //电子日历字
  LCD12864_set_tu(1,8,shu0_31+560,112,8,0); //周目字//shu0_31存放数值和一些图形
  LCD12864_set_tu(2,0,shu0_31+512,16,8,0);  //年字
  LCD12864_set_tu(4,0,shu0_31+528,16,8,0);  //月字
  LCD12864_set_tu(6,0,shu0_31+544,16,8,0);  //日字
  LCD12864_set_tu(4,56,ziliao,64,8,0);      //个人资料
  gettime(&realtime);
  yr=datastring[0]*10+datastring[1];
  m=datastring[2]*10+datastring[3];
  d=datastring[4]*10+datastring[5];
  LCD12864_set_tu(1,0,shu0_31+yr*16,16,8,0); //年数
  LCD12864_set_tu(3,0,shu0_31+m*16,16,8,0);  //月数
  LCD12864_set_tu(5,0,shu0_31+d*16,16,8,0);  //日数
  sx=(2000+yr)%12;
  LCD12864_set_tu(7,0,shengxiao+sx*16,16,8,0);  //生肖

//年处理

if(yr%4==0){rp=1;}                                                        //判断闰平年
else{rp=0;}

for(i=0;i<yr;i++)
{
   if(i%4==0){run++;}                                                   //计算13到yr间闰年平年数各数量
    else{ping++;}
}
yu=((366*run)+(365*ping))%42+7;                           //以2013年为起始年累算
if(yu<8){month1=yu;}                                                   //求得任意一年1月1日显示的地址代号
else if(yu<15){month1=yu-7;}                                   //
else if(yu<22){month1=yu-14;}
else if(yu<29){month1=yu-21;}
else if(yu<34){month1=yu-28;}
else{month1=yu-35;}
switch(rp)                                                                                //求任一月首地址代号
{
  case 0:{                                                                          //平年
                  if(m==2||m==3||m==11){monthx=month1+3;}
                  else if(m==4||m==7){monthx=month1+1;}
                  else if(m==5){monthx=month1+1;}
                  else if(m==6){monthx=month1+4;}
                  else if(m==8){monthx=month1+2;}
                  else if(m==9||m==12){monthx=month1+5;}
                  else{monthx=month1;}
                  break;
         }
  case 1:{                                                                                //闰年
                  if(m==2||m==8){monthx=month1+3;}
                  else if(m==3||m==11){monthx=month1+4;}
                  else if(m==5){monthx=month1+2;}
                  else if(m==6){monthx=month1+5;}
                  else if(m==10){monthx=month1+1;}
                  else if(m==9||m==12){monthx=month1+6;}
                  else{monthx=month1;}
                  break;
         }
}
if(monthx>7){monthx=monthx-7;}                                         //至此已经得到任意月首地址
if(m==4||m==6||m==9||m==11){nday=30;}                         //取月天数
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){nday=31;}
if(m==2){
          switch(rp)
                            {
                                         case 0:nday=28;break;                //平
                                         case 1:nday=29;break;                //闰
                            }
        }                                                                                //至此已得到月天数

  for(i=1;i<=nday;i++)                                                   //循环显示所有天数
  {
        xx=monthx+i;                                                           
        if(xx>=2&&xx<=8){xx=xx-1;y=16;}                           //求显示地址代码
        if(xx>=9&&xx<=15){xx=xx-8;y=24;}
        if(xx>=16&&xx<=22){xx=xx-15;y=32;}
        if(xx>=23&&xx<=29){xx=xx-22;y=40;}
        if(xx>=30&&xx<=36){xx=xx-29;y=48;}
        if(xx>=37&&xx<=43){xx=xx-36;y=56;}
        if(i==d){LCD12864_set_tu(xx,y,shu0_31+(i*16),16,8,1);}//反白当天
        else{LCD12864_set_tu(xx,y,shu0_31+(i*16),16,8,0);  }//其他天
  }
}

//====================================================================================================






















用<<,>>好还是用+—运算好,比如shu0_31+560还是shu0_31>>560

这个好看

小编的字写得实在不咋地啊

shu0_31>>560  这个好,可以减少运算空间。

不错

不错,

绝对的表示支持.我也想开个小差,可咱能力不行,只有学习.

学习了

不错挺好的

这个不错啊

很好的  一个设计

学习了

赞一个

有原电路图没

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top