找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7302|回复: 0
打印 上一主题 下一主题
收起左侧

单片机公历转农历程序-lcd12864液晶显示

[复制链接]
跳转到指定楼层
楼主
ID:73526 发表于 2015-2-11 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                                                                                                     这是网上公历转农历的程序,看起来还是很流行的,基本思路是将一年里农历的相关信息用32位二进制记录(实际用24位),这样就建立了一个表格,表格的内容就是一年里农历的密码,只要在程序里进行相关运算就可以把这些密码解出来,也就可以得到每一天所对应的农历算出来!
  具体的算法我也不是很看得懂,我只是随便拿了几天代到程序里一步步算了一下,结果是正确的,现在在单片机和DS1337里运行还算正常,农历是对的!
  我用的是12864带字库的液晶,相关数据多存在AT24C16里,但表格没有存入EEPROM,因为存入后读出转换农历里有错,所以暂时放一下!
  表格有二百年的农历,我只用了五十年(2000~2049),想加就加表格就可以了,请不要问我公式,我也不知道,我是直接拿来用的。我只是从网上找到的,好像还是C++,VC++的程序吧!管他,都带C应该可以用的!
    电路图就不能传了,传张结果图吧!因为是用线拉的,还没有做成板,到时画图做板再说吧!






uint MonthAdd[12]={0,31,59,90,120,151,181,212,243,273,304,334};
void chek_table(uint num)
{
switch(num-2000)
{
  case 0: llsu=0x0C9645;break;//2000
  case 1: llsu=0x4D4AB8;break;//2001
  case 2: llsu=0x0D4A4C;break;//2002
  case 3: llsu=0x0DA541;break;//2003
  case 4: llsu=0x25AAB6;break;//2004
  case 5: llsu=0x056A49;break;//2005
  case 6: llsu=0x7AADBD;break;//2006
  case 7: llsu=0x025D52;break;//2007
  case 8: llsu=0x092D47;break;//2008
  case 9: llsu=0x5C95BA;break;//2009
  case 10: llsu=0x0A954E;break;//2010
  case 11: llsu=0x0B4A43;break;//2011
  case 12: llsu=0x4B5537;break;//2012
  case 13: llsu=0x0AD54A;break;//2013
  case 14: llsu=0x955ABF;break;//2014
  case 15: llsu=0x04BA53;break;//2015
  case 16: llsu=0x0A5B48;break;//2016
  case 17: llsu=0x652BBC;break;//2017
  case 18: llsu=0x052B50;break;//2018
  case 19: llsu=0x0A9345;break;//2019
  case 20: llsu=0x474AB9;break;//2020
  case 21: llsu=0x06AA4C;break;//2021
  case 22: llsu=0x0AD541;break;//2022
  case 23: llsu=0x24DAB6;break;//2023
  case 24: llsu=0x04B64A;break;//2024
  case 25: llsu=0x69573D;break;//2025
  case 26: llsu=0x0A4E51;break;//2026
  case 27: llsu=0x0D2646;break;//2027
  case 28: llsu=0x5E933A;break;//2028
  case 29: llsu=0x0D534D;break;//2029
  case 30: llsu=0x05AA43;break;//2030
  case 31: llsu=0x36B537;break;//2031
  case 32: llsu=0x096D4B;break;//2032
  case 33: llsu=0xB4AEBF;break;//2033
  case 34: llsu=0x04AD53;break;//2034
  case 35: llsu=0x0A4D48;break;//2035
  case 36: llsu=0x6D25BC;break;//2036
  case 37: llsu=0x0D254F;break;//2037
  case 38: llsu=0x0D5244;break;//2038
  case 39: llsu=0x5DAA38;break;//2039
  case 40: llsu=0x0B5A4C;break;//2040
  case 41: llsu=0x056D41;break;//2041
  case 42: llsu=0x24ADB6;break;//2042
  case 43: llsu=0x049B4A;break;//2043
  case 44: llsu=0x7A4BBE;break;//2044
  case 45: llsu=0x0A4B51;break;//2045
  case 46: llsu=0x0AA546;break;//2046
  case 47: llsu=0x5B52BA;break;//2047
  case 48: llsu=0x06D24E;break;//2048
  case 49: llsu=0x0ADA42;break;//2049
}
} /**/     
void nongni(uint nian,uchar yue,uchar ri)               
{
uchar i;      
    uint Spring_NY,Sun_NY,StaticDayCount;//Spring_NY 记录春节离当年元旦的天数
    uint index,flag;//Sun_NY 记录阳历日离当年元旦的天数。      
chek_table(nian);
    if(((llsu&0x0060)>>5)== 1)
        Spring_NY=(llsu&0x001F)-1;
    else         
        Spring_NY=(llsu&0x001F)-1+31;
    Sun_NY=MonthAdd[yue-1]+ri-1;   
    if((!(nian%4))&&(yue>2))           
        Sun_NY++;     
    //StaticDayCount记录大小月的天数 29 或30
    //index 记录从哪个月开始来计算。   
    //flag 是用来对闰月的特殊处理。   
    //判断阳历日在春节前还是春节后
    if(Sun_NY>=Spring_NY)//阳历日在春节后(含春节那天)
    {               
        Sun_NY-=Spring_NY;      
        yue=1;      
        index=1;           
        flag=0;   
        if((llsu&(0x80000>>(index-1))) ==0)
            StaticDayCount=29;
        else     
            StaticDayCount=30;
        while(Sun_NY>= StaticDayCount)
        {      
            Sun_NY-=StaticDayCount;
            index++;   
            if(yue==((llsu&0xF00000)>>20))
            {           
                flag=~flag;   
                if(flag==0)   
                    yue++;
            }     
            else      
                yue++;   
            if((llsu&(0x80000>>(index-1)))==0)     
                StaticDayCount=29;     
            else         
                StaticDayCount=30;
        }         
        ri=Sun_NY+1;     
    }      
    else//阳历日在春节前   
    {           
        Spring_NY-=Sun_NY;     
        nian--;      
        yue=12;      
        if (((llsu& 0xF00000)>>20)== 0)   
            index=12;
        else
   index=13;
        flag = 0;
        if((llsu&(0x80000>>(index-1)))==0)
            StaticDayCount=29;
        else         
            StaticDayCount=30;   
        while(Spring_NY>StaticDayCount)   
        {           
            Spring_NY-=StaticDayCount;   
            index--;      
            if(flag==0)     
                yue--;     
            if(yue==((llsu&0xF00000)>>20))
                flag=~flag;                  
            if((llsu&(0x80000>>(index-1)))==0)   
                StaticDayCount=29;      
            else         
                StaticDayCount=30;     
         }           
         ri=StaticDayCount-Spring_NY+1;
    }   

//以下为显示部分,因显示器件不同可以更改,read()为读取at24c16内的数据(已存)      
write_cmd(0x98);
for(i=0;i<2;i++)
{
  write_data(read(0xa2,0x00+((nian-2000)%10)*2+i));
}
for(i=0;i<2;i++)
{
  write_data(read(0xa2,0x00+20+((nian-2000)%12)*2+i));
}
for(i=0;i<2;i++)
{
  write_data(read(0xa0,0x80+i));
}
if(yue==1)
{
  for(i=0;i<2;i++)
  {
   write_data(read(0xa0,0x8e+i));
  }
}
if(yue>=10)
{
  for(i=0;i<2;i++)
  {
   write_data(read(0xa2,0x70+20+i));
  }
}
if(yue!=10&&yue!=1)
for(i=0;i<2;i++)
{
  write_data(read单片机公历转农历程序(0xa2,0x70+(yue%10)*2+i));
}
for(i=0;i<2;i++)
{
  write_data(read(0xa0,0x84+i));
}
if(ri/10==3)for(i=0;i<2;i++)write_data(read(0xa2,0x70+6+i));
if(ri/10==2)for(i=0;i<2;i++)write_data(read(0xa2,0x70+22+i));
if(ri/10==1)for(i=0;i<2;i++)write_data(read(0xa2,0x70+20+i));
if(ri/10==0)for(i=0;i<2;i++)write_data(read(0xa2,0x70+i));
for(i=0;i<2;i++)
{
  write_data(read(0xa2,0x70+(ri%10)*2+i));
}
}                                                                                                                    
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表