中科因仑“3+1”工程特种兵精英论坛

标题: 搞了很久的万年历 [打印本页]

作者: 曾经最美    时间: 2016-5-31 18:58
标题: 搞了很久的万年历
#include< reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar time_data[7]={12,1,10,29,19,33,00};
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81} ;
unsigned char code digit[10]={"0123456789"};
  void print(uchar *str);
uchar time,num,key;
uchar zhuanhua[14];
sbit DQ        =P3^7;
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit clk=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
bit         w=0;
  void write_12864com(uchar com);
  void read_12864dat(uchar dat);
  void ds1302_byte(uchar dat);
   void ds1302_write(uchar add, uchar dat);
   uchar ds1302_read(uchar add);


void delay1(uint k)  
{
    while(k--);   
}
void delay(uint t)  
{
  int i;
  while(t--)
  {
  for(i=0;i<120;i++);
  }
}
/*******************************************************************************
************************温度传感器的复位:**************************************
********************  flag=0:表示18b20存在flag=1:表示18b20不存在***************/
bit init18b20(void)        
{
bit flag;         //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ = 1;           //先将数据线拉高
for(time=0;time<2;time++) //略微延时约6微秒
     ;
DQ = 0;           //再将数据线从高拉低,要求保持480~960us
for(time=0;time<180;time++)  //略微延时约600微秒
     ;         //以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1;           //释放数据线(将数据线拉高)
  for(time=0;time<10;time++)
     ;  //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)      
for(time=0;time<100;time++)  //延时足够长时间,等待存在脉冲输出完毕
      ;
return (flag);    //返回检测成功标志
}
/********************************************************************************
***********************18b20写一个数据***********************************************/
void write18b20(uchar dat)
{         
unsigned char i=0;
        for (i=0; i<8; i++)
                 {
                  DQ =1;         // 先将数据线拉高
                  _nop_();             //等待一个机器周期         
                  DQ=0;          //将数据线从高拉低时即启动写时序      
                  DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
                       //并将其送到数据线上等待DS18B20采样        
                 for(time=0;time<10;time++)        
                     ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
                  DQ=1;          //释放数据线                    
                  for(time=0;time<1;time++)
                          ;//延时3us,两个写时序间至少需要1us的恢复期
                  dat>>=1;       //将dat中的各二进制位数据右移1位
                 }
          for(time=0;time<4;time++)
                      ; //稍作延时,给硬件一点反应时间
}
uchar read18b20()
{
unsigned char i=0;        
                unsigned char dat;  //储存读出的一个字节数据
                for (i=0;i<8;i++)
                 {
                  
                   DQ =1;       // 先将数据线拉高
                   _nop_();            //等待一个机器周期         
                   DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
                        dat>>=1;
                   _nop_();     //等待一个机器周期                  
                   DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
                   for(time=0;time<2;time++)
             ;      //延时约6us,使主机在15us内采样
                   if(DQ==1)
                      dat|=0x80;  //如果读到的数据是1,则将1存入dat
                        else
                                dat|=0x00;//如果读到的数据是0,则将0存入dat
                     //将单片机检测到的电平信号DQ存入r        
                   for(time=0;time<8;time++)
                              ;              //延时3us,两个读时序之间必须有大于1us的恢复期        
            }                           
         return(dat);    //返回读出的十进制数据
}


void readytemp(void)
{
      init18b20();     //将DS18B20初始化
                write18b20(0xCC); // 跳过读序号列号的操作
                write18b20(0x44); // 启动温度转换         
          delay(5);
                init18b20();     //将DS18B20初始化
                write18b20(0xCC); //跳过读序号列号的操作
        write18b20(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位        
}

  void display_temp1(unsigned char x)
{
unsigned char k,l;     
        k=(x%100)/10;    //取十位
        l=x%10;             //取个位  
    write_12864com(0x9B);   //写显示地址,将在第2行第7列开始显示
        read_12864dat(digit[k]);    //将十位数字的字符常量写入LCD
          read_12864dat  (digit[l]);    //将个位数字的字符常量写入LCD
        print(".")        ;
//        delay(50);         //延时1ms给硬件一点反应时间     
}
    void display_temp2(unsigned char x)
{
  write_12864com(0x9D);      
        read_12864dat(digit[x]);
        print("C");   
//        delay(50);          //延时1ms给硬件一点反应时间
}
void ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
  clk=0;
  io=dat&0x01;
  dat>>=1;               
  clk=1;
}
}
void ds1302_write(uchar add,uchar dat)
{
  rst=0;
_nop_();
clk=0;
_nop_();
                rst=1;
  ds1302_byte(add);
  ds1302_byte( dat);
  rst=0;
  io=1;
  clk=1;
}
uchar ds1302_read(uchar add)
{
        unsigned char i,temp=0x00;
        rst=0;
        _nop_();
        _nop_();
        clk=0;
        _nop_();
        _nop_();
        rst=1;
        _nop_();
        _nop_();
ds1302_byte(add);
        for (i=0;i<8;i++)                 //循环8次 读取数据
        {               
                if(io)
                temp|=0x80;                        //每次传输低字节
                clk=0;
                temp>>=1;                        //右移一位
                _nop_();
           _nop_();
           _nop_();
                clk=1;
        }
        rst=0;
        _nop_();                          //以下为DS1302复位的稳定时间
        _nop_();
        rst=0;
    clk=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    clk=1;
        _nop_();
        _nop_();
        io=0;
        _nop_();
        _nop_();
        io=1;
        _nop_();
        _nop_();
        return (temp);        
}        
void write_12864com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay(1);

en=1;
delay(3);
en=0;
}
void read_12864dat(uchar dat)
{
rs=1;
rw=0;
P0=dat;
delay(1);

en=1;
delay(3);

en=0;
}



void set_rtc(void)

{           uchar i,j,k;
for(i=0;i<7;i++)
{
        j =time_data/10;
        time_data=time_data%10;
        time_data=j*16+time_data;
}

          ds1302_write(0x8e,0x00); //去除写保护
          for(k=0;k<7;k++)
          {
          ds1302_write(write_add[k],time_data[k]);
          }
         ds1302_write(0x8e,0x80);
}
void read_rtc(void)
{         
      uchar i;
      for(i=0;i<7;i++)
{
          time_data=ds1302_read(read_add);
}
}
void time_pros(void)
{
zhuanhua[0]=time_data[0]/16+0x30;
zhuanhua[1]=time_data[0]%16+0x30;
zhuanhua[2]=time_data[1]/16;
zhuanhua[3]=time_data[1]%16;
zhuanhua[4]=time_data[2]/16+0x30;
zhuanhua[5]=time_data[2]%16+0x30;
zhuanhua[6]=time_data[3]/16+0x30;
zhuanhua[7]=time_data[3]%16+0x30;
zhuanhua[8]=time_data[4]/16+0x30;
zhuanhua[9]=time_data[4]%16+0x30;
zhuanhua[10]=time_data[5]/16+0x30;
zhuanhua[11]=time_data[5]%16+0x30;
zhuanhua[12]=time_data[6]/16+0x30;
zhuanhua[13]=time_data[6]%16+0x30;
}
void init_lcd(void)
{ P0=0xff;
delay1(10);
write_12864com(0x30); //写基本指令集
delay1(1);
write_12864com(0x30);
delay1(1);
write_12864com(0x0c); //显示开
delay1(1);
write_12864com(0x01);  //清屏指令
delay1(5);
  write_12864com(0x06);  //游标右移
  //delay1(20);
}
dishanzi(uchar addr,uchar *hz)
{
int i;
//checkbusy();
write_12864com(addr);
for(i=0;hz!='\0';i++)
{
  read_12864dat(hz);
// checkbusy();
}
}
void print(uchar *str)
{
        while(*str!='\0')
        {
                read_12864dat(*str);
                str++;
        }
}
void distime()
{        uchar temp;
  dishanzi(0x90,"阳20");
read_12864dat(zhuanhua[0]);
read_12864dat(zhuanhua[1]);
  dishanzi(0x93,"年");
read_12864dat(zhuanhua[4]);
read_12864dat(zhuanhua[5]);                                                   
  dishanzi(0x95,"月");   
read_12864dat(zhuanhua[6]);
read_12864dat(zhuanhua[7]);
  dishanzi(0x97,"日");
write_12864com(0x88);
read_12864dat(zhuanhua[8]);
read_12864dat(zhuanhua[9]);
  dishanzi(0x89,"时");
read_12864dat(zhuanhua[10]);
read_12864dat(zhuanhua[11]);
  dishanzi(0x8b,"分");
read_12864dat(zhuanhua[12]);
read_12864dat(zhuanhua[13]);
  dishanzi(0x8d,"秒");
  dishanzi(0x98,"星期");
   temp=zhuanhua[2]*10+zhuanhua[3];
   switch(temp)
   {
           case 1:   write_12864com(0x9a)        ; print("一");   break;
        case 2:   write_12864com(0x9a)        ; print("二");        break;
        case 3:   write_12864com(0x9a)        ; print("三");    break;
        case 4:   write_12864com(0x9a)        ; print("四");    break;
        case 5:   write_12864com(0x9a)        ; print("五");    break;
        case 6:   write_12864com(0x9a)        ; print("六");    break;
        case 7:   write_12864com(0x9a)        ; print("日");    break;
   }
}  

/*---------------------------------公历转换阴历年份数据表--------------------------------*/

static unsigned char code year_code[]=
{
        0x04,0xAe,0x53, //1901 0
        0x0A,0x57,0x48, //1902 3
        0x55,0x26,0xBd, //1903 6
        0x0d,0x26,0x50, //1904 9
        0x0d,0x95,0x44, //1905 12
        0x46,0xAA,0xB9, //1906 15
        0x05,0x6A,0x4d, //1907 18
        0x09,0xAd,0x42, //1908 21
        0x24,0xAe,0xB6, //1909
        0x04,0xAe,0x4A, //1910
        0x6A,0x4d,0xBe, //1911
        0x0A,0x4d,0x52, //1912
        0x0d,0x25,0x46, //1913
        0x5d,0x52,0xBA, //1914
        0x0B,0x54,0x4e, //1915
        0x0d,0x6A,0x43, //1916
        0x29,0x6d,0x37, //1917
        0x09,0x5B,0x4B, //1918
        0x74,0x9B,0xC1, //1919
        0x04,0x97,0x54, //1920
        0x0A,0x4B,0x48, //1921
        0x5B,0x25,0xBC, //1922
        0x06,0xA5,0x50, //1923
        0x06,0xd4,0x45, //1924
        0x4A,0xdA,0xB8, //1925
        0x02,0xB6,0x4d, //1926
        0x09,0x57,0x42, //1927
        0x24,0x97,0xB7, //1928
        0x04,0x97,0x4A, //1929
        0x66,0x4B,0x3e, //1930
        0x0d,0x4A,0x51, //1931
        0x0e,0xA5,0x46, //1932
        0x56,0xd4,0xBA, //1933
        0x05,0xAd,0x4e, //1934
        0x02,0xB6,0x44, //1935
        0x39,0x37,0x38, //1936
        0x09,0x2e,0x4B, //1937
        0x7C,0x96,0xBf, //1938
        0x0C,0x95,0x53, //1939
        0x0d,0x4A,0x48, //1940
        0x6d,0xA5,0x3B, //1941
        0x0B,0x55,0x4f, //1942
        0x05,0x6A,0x45, //1943
        0x4A,0xAd,0xB9, //1944
        0x02,0x5d,0x4d, //1945
        0x09,0x2d,0x42, //1946
        0x2C,0x95,0xB6, //1947
        0x0A,0x95,0x4A, //1948
        0x7B,0x4A,0xBd, //1949
        0x06,0xCA,0x51, //1950
        0x0B,0x55,0x46, //1951
        0x55,0x5A,0xBB, //1952
        0x04,0xdA,0x4e, //1953
        0x0A,0x5B,0x43, //1954
        0x35,0x2B,0xB8, //1955
        0x05,0x2B,0x4C, //1956
        0x8A,0x95,0x3f, //1957
        0x0e,0x95,0x52, //1958
        0x06,0xAA,0x48, //1959
        0x7A,0xd5,0x3C, //1960
        0x0A,0xB5,0x4f, //1961
        0x04,0xB6,0x45, //1962
        0x4A,0x57,0x39, //1963
        0x0A,0x57,0x4d, //1964
        0x05,0x26,0x42, //1965
        0x3e,0x93,0x35, //1966
        0x0d,0x95,0x49, //1967
        0x75,0xAA,0xBe, //1968
        0x05,0x6A,0x51, //1969
        0x09,0x6d,0x46, //1970
        0x54,0xAe,0xBB, //1971
        0x04,0xAd,0x4f, //1972
        0x0A,0x4d,0x43, //1973
        0x4d,0x26,0xB7, //1974
        0x0d,0x25,0x4B, //1975
        0x8d,0x52,0xBf, //1976
        0x0B,0x54,0x52, //1977
        0x0B,0x6A,0x47, //1978
        0x69,0x6d,0x3C, //1979
        0x09,0x5B,0x50, //1980
        0x04,0x9B,0x45, //1981
        0x4A,0x4B,0xB9, //1982
        0x0A,0x4B,0x4d, //1983
        0xAB,0x25,0xC2, //1984
        0x06,0xA5,0x54, //1985
        0x06,0xd4,0x49, //1986
        0x6A,0xdA,0x3d, //1987
        0x0A,0xB6,0x51, //1988
        0x09,0x37,0x46, //1989
        0x54,0x97,0xBB, //1990
        0x04,0x97,0x4f, //1991
        0x06,0x4B,0x44, //1992
        0x36,0xA5,0x37, //1993
        0x0e,0xA5,0x4A, //1994
        0x86,0xB2,0xBf, //1995
        0x05,0xAC,0x53, //1996
        0x0A,0xB6,0x47, //1997
        0x59,0x36,0xBC, //1998
        0x09,0x2e,0x50, //1999 294
        0x0C,0x96,0x45, //2000 297
        0x4d,0x4A,0xB8, //2001
        0x0d,0x4A,0x4C, //2002
        0x0d,0xA5,0x41, //2003
        0x25,0xAA,0xB6, //2004
        0x05,0x6A,0x49, //2005
        0x7A,0xAd,0xBd, //2006
        0x02,0x5d,0x52, //2007
        0x09,0x2d,0x47, //2008
        0x5C,0x95,0xBA, //2009
        0x0A,0x95,0x4e, //2010
        0x0B,0x4A,0x43, //2011
        0x4B,0x55,0x37, //2012
        0x0A,0xd5,0x4A, //2013
        0x95,0x5A,0xBf, //2014
        0x04,0xBA,0x53, //2015
        0x0A,0x5B,0x48, //2016
        0x65,0x2B,0xBC, //2017
        0x05,0x2B,0x50, //2018
        0x0A,0x93,0x45, //2019
        0x47,0x4A,0xB9, //2020
        0x06,0xAA,0x4C, //2021
        0x0A,0xd5,0x41, //2022
        0x24,0xdA,0xB6, //2023
        0x04,0xB6,0x4A, //2024
        0x69,0x57,0x3d, //2025
        0x0A,0x4e,0x51, //2026
        0x0d,0x26,0x46, //2027
        0x5e,0x93,0x3A, //2028
        0x0d,0x53,0x4d, //2029
        0x05,0xAA,0x43, //2030
        0x36,0xB5,0x37, //2031
        0x09,0x6d,0x4B, //2032
        0xB4,0xAe,0xBf, //2033
        0x04,0xAd,0x53, //2034
        0x0A,0x4d,0x48, //2035
        0x6d,0x25,0xBC, //2036
        0x0d,0x25,0x4f, //2037
        0x0d,0x52,0x44, //2038
        0x5d,0xAA,0x38, //2039
        0x0B,0x5A,0x4C, //2040
        0x05,0x6d,0x41, //2041
        0x24,0xAd,0xB6, //2042
        0x04,0x9B,0x4A, //2043
        0x7A,0x4B,0xBe, //2044
        0x0A,0x4B,0x51, //2045
        0x0A,0xA5,0x46, //2046
        0x5B,0x52,0xBA, //2047
        0x06,0xd2,0x4e, //2048
        0x0A,0xdA,0x42, //2049
        0x35,0x5B,0x37, //2050
        0x09,0x37,0x4B, //2051
        0x84,0x97,0xC1, //2052
        0x04,0x97,0x53, //2053
        0x06,0x4B,0x48, //2054
        0x66,0xA5,0x3C, //2055
        0x0e,0xA5,0x4f, //2056
        0x06,0xB2,0x44, //2057
        0x4A,0xB6,0x38, //2058
        0x0A,0xAe,0x4C, //2059
        0x09,0x2e,0x42, //2060
        0x3C,0x97,0x35, //2061
        0x0C,0x96,0x49, //2062
        0x7d,0x4A,0xBd, //2063
        0x0d,0x4A,0x51, //2064
        0x0d,0xA5,0x45, //2065
        0x55,0xAA,0xBA, //2066
        0x05,0x6A,0x4e, //2067
        0x0A,0x6d,0x43, //2068
        0x45,0x2e,0xB7, //2069
        0x05,0x2d,0x4B, //2070
        0x8A,0x95,0xBf, //2071
        0x0A,0x95,0x53, //2072
        0x0B,0x4A,0x47, //2073
        0x6B,0x55,0x3B, //2074
        0x0A,0xd5,0x4f, //2075
        0x05,0x5A,0x45, //2076
        0x4A,0x5d,0x38, //2077
        0x0A,0x5B,0x4C, //2078
        0x05,0x2B,0x42, //2079
        0x3A,0x93,0xB6, //2080
        0x06,0x93,0x49, //2081
        0x77,0x29,0xBd, //2082
        0x06,0xAA,0x51, //2083
        0x0A,0xd5,0x46, //2084
        0x54,0xdA,0xBA, //2085
        0x04,0xB6,0x4e, //2086
        0x0A,0x57,0x43, //2087
        0x45,0x27,0x38, //2088
        0x0d,0x26,0x4A, //2089
        0x8e,0x93,0x3e, //2090
        0x0d,0x52,0x52, //2091
        0x0d,0xAA,0x47, //2092
        0x66,0xB5,0x3B, //2093
        0x05,0x6d,0x4f, //2094
        0x04,0xAe,0x45, //2095
        0x4A,0x4e,0xB9, //2096
        0x0A,0x4d,0x4C, //2097
        0x0d,0x15,0x41, //2098
        0x2d,0x92,0xB5, //2099
};

/*-------------------------------------月份数据表----------------------------------------*/

static unsigned char  code day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
static unsigned short code day_code2[3]={0x111,0x130,0x14e};

bit c_moon,century;
data uchar year_moon,month_moon,day_moon,week;

/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0------------------*/
static unsigned char GetMoonDay(unsigned char month_p,unsigned short table_addr)
{
        switch (month_p)
        {
                case 1:
                        if((year_code[table_addr]&0x08)==0)                return(0);
                        else                                                                         return(1);
                case 2:
                        if((year_code[table_addr]&0x04)==0)                return(0);
                        else                                                                         return(1);
                case 3:
                        if((year_code[table_addr]&0x02)==0)                return(0);
                        else                                                                         return(1);
                case 4:
                        if((year_code[table_addr]&0x01)==0)                return(0);
                        else                                                                     return(1);
                case 5:
                        if((year_code[table_addr+1]&0x80)==0)        return(0);
                        else                                                                         return(1);
                case 6:
                        if((year_code[table_addr+1]&0x40)==0)        return(0);
                        else                                                                         return(1);
                case 7:
                        if((year_code[table_addr+1]&0x20)==0)        return(0);
                        else                                                                         return(1);
                case 8:
                        if((year_code[table_addr+1]&0x10)==0)        return(0);
                        else                                                                         return(1);
                case 9:
                        if((year_code[table_addr+1]&0x08)==0)        return(0);
                        else                                                                         return(1);
                case 10:
                        if((year_code[table_addr+1]&0x04)==0)        return(0);
                        else                                                                         return(1);
                case 11:
                        if((year_code[table_addr+1]&0x02)==0)        return(0);
                        else                                                                         return(1);
                case 12:
                        if((year_code[table_addr+1]&0x01)==0)        return(0);
                        else                                                                         return(1);
                case 13:
                        if((year_code[table_addr+2]&0x80)==0)        return(0);
                        else                                                                         return(1);
        }
        return(0);
}

/*--------------------------------公历转农历函数-----------------------------------------*/

void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day)
{                        
        unsigned char temp1,temp2,temp3,month_p;
        unsigned int temp4,table_addr;
        bit flag2,flag_y;
        temp1=year/16; //BCD->hex 先把数据转换为十六进制
        temp2=year%16;
        year=temp1*10+temp2;
        temp1=month/16;
        temp2=month%16;
        month=temp1*10+temp2;
        temp1=day/16;
        temp2=day%16;
        day=temp1*10+temp2;
        //定位数据表地址
        if(c==0) { table_addr=(year+0x64-1)*0x3; }
           else { table_addr=(year-1)*0x3;  }
        //取当年春节所在的公历月份
        temp1=year_code[table_addr+2]&0x60;
        temp1=_cror_(temp1,5);
        //取当年春节所在的公历日
        temp2=year_code[table_addr+2]&0x1f;
        //取当年春节所在的公历日完成
        //计算当年春年离当年元旦的天数,春节只会在公历1月或2月
        if(temp1==0x1)         { temp3=temp2-1; }  
           else                  { temp3=temp2+0x1f-1; }

        // 计算当年春年离当年元旦的天数完成
        //计算公历日离当年元旦的天数,为了减少运算,用了两个表
        //day_code1[9],day_code2[3]
        //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
        //在九月后,天数大于0xff,用表day_code2[3]
        //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
        //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
        if(month<10)        { temp4=day_code1[month-1]+day-1; }
                else             { temp4=day_code2[month-10]+day-1;}

//        if ((month>0x2)&&(year%0x4==0)&&(year!=0)) //此语句造成2000年3月1日—12月31日之间
                                                                                                //计算农历少算一天,应删除判断语句“&&(year!=0)”
        if ((month>0x2)&&(year%0x4==0))
                temp4+=1; //如果公历月大于2月并且该年的2月为闰月,天数加1
        //计算公历日离当年元旦的天数完成
         
        //判断公历日在春节前还是春节后
        if (temp4>=temp3)
        {
                temp4-=temp3; month=0x1;
                month_p=0x1;  //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
                flag2=GetMoonDay(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0
                flag_y=0;
      if(flag2==0)temp1=0x1d;   //小月29天
              else    temp1=0x1e;    //大月30天
                temp2=year_code[table_addr]&0xf0;
                temp2=_cror_(temp2,4);  //从数据表中取该年的闰月月份,如为0则该年无闰月
                while(temp4>=temp1)
                {
                        temp4-=temp1; month_p+=1;
                        if(month==temp2)
                    {
                                flag_y=~flag_y;
                 if(flag_y==0)month+=1;
                        }
                        else month+=1;
                        flag2=GetMoonDay(month_p,table_addr);
         if(flag2==0)temp1=0x1d;
                 else    temp1=0x1e;
                }
                day=temp4+1;
        }
        else
        {  
                temp3-=temp4;
                if (year==0x0){year=0x63;c=1;}
                        else        year-=1;
                table_addr-=0x3;
                month=0xc;
                temp2=year_code[table_addr]&0xf0;
                temp2=_cror_(temp2,4);
                if (temp2==0)month_p=0xc;
                        else        month_p=0xd;
                flag_y=0;
                flag2=GetMoonDay(month_p,table_addr);
                if(flag2==0)temp1=0x1d;
              else        temp1=0x1e;
                while(temp3>temp1)
                {
                        temp3-=temp1;
                        month_p-=1;
                        if(flag_y==0)month-=1;
         if(month==temp2)flag_y=~flag_y;
         flag2=GetMoonDay(month_p,table_addr);
         if(flag2==0)temp1=0x1d;
            else        temp1=0x1e;
                }
                day=temp1-temp3+1;
        }
        c_moon=c;
        year_moon=year;
        month_moon=month;
        day_moon=day;
        dishanzi(0x80,"阴20");
        read_12864dat(year_moon/10+0x30);
        read_12864dat(year_moon%10+0x30);
                 dishanzi(0x83,"年");
    read_12864dat(month_moon/10+0x30);
        read_12864dat(month_moon%10+0x30);
                dishanzi(0x85,"月");
        read_12864dat(day_moon/10+0x30);
        read_12864dat(day_moon%10+0x30);
          dishanzi(0x87,"日");
}
void display()
{
  uchar nian ,yue ,ri;
  nian = ds1302_read(0x8d);
  yue = ds1302_read(0x89);
  ri =  ds1302_read(0x87);
    Conversion(0,nian,yue,ri);

        
}
void keyscan()
{
if(key1==0)
{
delay(1);
if(key1==0)
{
    key++;
  if(key>=6)
  {
    key=0;
  }
  write_12864com(0x9a);
}
while(key1!=0);

}         
}
void main(void)
{               
         uchar TL;
         uchar TH;
         uchar TD;
         uchar TN;

             init_lcd();

                  dishanzi(0x80,"--电子时钟显示--");
                  dishanzi(0x90,"2012年10月29日制作");
                  dishanzi(0x88,"--版本:keil4--");
                  dishanzi(0x98,"----贺暑龙----");
                  delay(2000);
                  write_12864com(0x01);
                  write_12864com(0x03);
                  delay(500);
                  //set_rtc();
                 init18b20();
                 while(1)
                 {        
                 if(w==0)
                 {                                         
                  read_rtc();
                  time_pros();
                  display();
                 distime();     
                    readytemp();
       TL=read18b20();    //先读的是温度值低位
                TH=read18b20();    //接着读的是温度值高位
                TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
                                          //这样得出的是温度的整数部分,小数部分被丢弃了
          TD=(TL%16)*10/16;
           
          display_temp1(TN);    //显示温度的整数部分
          display_temp2(TD);    //显示温度的小数部分
          }
          }
   }
求大神指点一下 按键总是调不好





欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4