搜索
bottom↓
回复: 7

求救 万年历可调程序 有点错误 但是发现不了请各位指点...

[复制链接]

出0入0汤圆

发表于 2012-11-2 12:17:14 | 显示全部楼层 |阅读模式
#include< reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar time_data[7]={12,3,10,30,8,26,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,Year,key,Mon,Day,Shi,Fen,Week;
uchar zhuanhua[14],setime[7],temp;
void shoutime();
  void display_temp(uchar x,uchar y);
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;
sbit key4=P1^3;
  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[i]       
                   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_temp(uchar x,uchar y)
{
unsigned char k,l;     
        k=(x%100)/10;    //取十位
        l=x%10;             //取个位  
    write_12864com(0x9c);   //写显示地址,将在第2行第7列开始显示
        read_12864dat(digit[k]);    //将十位数字的字符常量写入LCD
          read_12864dat  (digit[l]);    //将个位数字的字符常量写入LCD
        print(".")        ;
//         write_12864com(0x9D);      
        read_12864dat(digit[y]);
        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[i]/10;
        time_data[i]=time_data[i]%10;
        time_data[i]=j*16+time_data[i];
}

          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++)
{
          setime[i]=ds1302_read(read_add[i]);
}
}
void time_pros(void)
{
zhuanhua[0]= setime[0]/16+0x30;
zhuanhua[1]= setime[0]%16+0x30;
zhuanhua[2]= setime[1]/16;
zhuanhua[3]= setime[1]%16;
zhuanhua[4]= setime[2]/16+0x30;
zhuanhua[5]= setime[2]%16+0x30;
zhuanhua[6]= setime[3]/16+0x30;
zhuanhua[7]= setime[3]%16+0x30;
zhuanhua[8]= setime[4]/16+0x30;
zhuanhua[9]= setime[4]%16+0x30;
zhuanhua[10]= setime[5]/16+0x30;
zhuanhua[11]= setime[5]%16+0x30;
zhuanhua[12]= setime[6]/16+0x30;
zhuanhua[13]= setime[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[i]!='\0';i++)
{
  read_12864dat(hz[i]);
// checkbusy();
}
}
void print(uchar *str)
{
        while(*str!='\0')
        {
                read_12864dat(*str);
                str++;
        }
}
void distime()
{       

  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[3];
   switch(temp)
   {
           case 1 :   write_12864com(0x9b)        ; print("壹");   break;
        case 2 :   write_12864com(0x9b)        ; print("贰");        break;
        case 3 :   write_12864com(0x9b)        ; print("叁");    break;
        case 4 :   write_12864com(0x9b)        ; print("肆");    break;
        case 5 :   write_12864com(0x9b)        ; print("伍");    break;
        case 6 :   write_12864com(0x9b)        ; print("陆");    break;
        case 7 :   write_12864com(0x9b)        ; 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 shoutime()
{                 uchar TL;
         uchar TH;
         uchar TD;
         uchar TN;
                    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_temp( TN , TD );    //显示温度的整数部分
}
unsigned char O_to_H(unsigned char n)
{
     unsigned char temp1;

    temp1 =  n/10*16 + n%10;
     
    return(temp1);
}
void main(void)
{              
           

             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(key1==0)
      {
                  delay (2);//去抖
              if(key1==0)
                 {
                  key++;
          if(key==7)//如果用到了秒调整,则这里ChooseID==8
                    {key=0;}
                 while (key1==0);//等待按键释放        
         }               
           }

/***********************选择年*************************************/
         if(key==1)
                 {       
                                                        
                         if(key2==0)//向上按键是否按下
                         {
                                  delay (2);//去抖
                              if(key2==0)
                                 {
                    Year=ds1302_read(0x8d);
                                         Year=Year/16*10+Year%16;                     //先读取年
                                         Year++;
                                         if(Year>99){Year=0;}
                                        ds1302_write (0x8e,0x00);                //禁止写保护
                                         ds1302_write (0x8c,O_to_H(Year));            //年写入
                    ds1302_write (0x8e,0x80);                //允许写保护
                     while (key2==0);                              //等待按键释放        
                                }
                          }
              if(key3==0)//向下按键是否按下
                         {
                                  delay(2);//去抖
                              if(key3==0)
                                 {
                     Year=ds1302_read(0x8d);
                                                   Year=Year/16*10+Year%16;          //先读取年
                                         Year--;
                                         if(Year==255){Year=99;} //需要注意,Year是unsigned char型的当它等于0的时候再减1则为255。
                                    ds1302_write (0x8e,0x00);                //禁止写保护
                                         ds1302_write (0x8c,O_to_H(Year));            //年写入
                    ds1302_write (0x8e,0x80);              //允许写保护
                                         while (key3==0);                            //等待按键释放        
                                }
                          }
                           }

if(key==2)
                 {
                         if(key2==0)//向上按键是否按下
                         {
                                  delay (2);//去抖
                              if(key2==0)
                                 {
                     Mon=ds1302_read(0x89);  
                                         Mon=Mon/16*10+Mon%16  ;                //
                                                            Mon++;
                                         if(Mon>12){Mon=1;}
                                      ds1302_write (0x8e,0x00);                //禁止写保护
                                         ds1302_write (0x88,O_to_H(Mon));            //年写入
                    ds1302_write (0x8e,0x80);                //允许写保护
                     while (key2==0);                              //等待按键释放        
                                }
                          }
              if(key3==0)//向下按键是否按下
                         {
                                  delay(2);//去抖
                              if(key3==0)
                                 {
                      Mon=ds1302_read(0x89);  
                                         Mon=Mon/16*10+Mon%16  ;                //
                                                            Mon--;
                                         if(Mon<1){Mon=12;}
                                      ds1302_write (0x8e,0x00);                //禁止写保护
                                         ds1302_write (0x88,O_to_H(Mon));            //年写入
                    ds1302_write (0x8e,0x80);                 //允许写保护
                                         while (key3==0);                            //等待按键释放        
                                }
                          }
                 }

if(key==3)
                 {
                         if(key2==0)//向上按键是否按下
                         {
                                  delay(2);//去抖
                              if(key2==0)
                                 {
                     Day=ds1302_read(0x87);
                                         Day=Day/16*10+Day%16;
                                                             //先读取日
                                         Day++;
                                                                                 if(Day>31)Day=1;
                                         ds1302_write(0x80,0x00);                //禁止写保护
                                         ds1302_write (0x86,O_to_H(Day));           //年写入
                    ds1302_write(0x80,0x00);               //允许写保护
                     while (key2==0);                              //等待按键释放        
                                }
                          }
              if(key3==0)//向下按键是否按下
                         {
                                  delay (2);//去抖
                              if(key3==0)
                                 {
                                   //先读取日
                                         
              Day=ds1302_read(0x87);
                                         Day=Day/16*10+Day%16;
                                                             //先读取日
                                         Day--;
                                                                                 if(Day<1)Day=31;
                                                             ds1302_write(0x80,0x00);                //禁止写保护
                                         ds1302_write (0x86,O_to_H(Day));           //年写入
                    ds1302_write(0x80,0x00);               //允许写保护
                     while (key3==0);                                           //等待按键释放        
                                }
                          }
                 }
   
if(key==4)
                 {
                         if(key2==0)//向上按键是否按下
                         {
                                  delay (2);
                              if(key2==0)
                                 {
                           Shi=ds1302_read(0x85);         
                                    Shi=Shi/16*10+Shi%16;
                                                                        Shi++;     
                                    if(Shi>23){Shi=0;}
                                                                        ds1302_write(0x8e,0x00);//去除写保护
                                                                        ds1302_write(0x84,O_to_H(Shi));
                                                                        ds1302_write(0x8e,0x80);         
                     while (key2==0);                              //等待按键释放        
                                }
                      }
              if(key3==0)//向下按键是否按下
                         {
                                  delay (2);//去抖
                              if(key3==0)
                                 {
                           Shi=ds1302_read(0x85);         
                                    Shi=Shi/16*10+Shi%16;
                                                                        Shi++;     
                                    if(Shi=255){Shi=23;}
                                                                        ds1302_write(0x8e,0x00);//去除写保护
                                                                        ds1302_write(0x84,O_to_H(Shi));
                                                                        ds1302_write(0x8e,0x80);              //允许写保护
                                         while (key3==0);                            //等待按键释放        
                                }
                          }
                 }

if(key==5)
                 {
                         if(key2==0)//向上按键是否按下
                         {
                                  delay (2);//去抖
                              if(key2==0)
                                 {
                            Fen=ds1302_read(0x83);
                                                        Fen=Fen/16*10+Fen%16;              //先读取时
                                         Fen++;
                                         if(Fen>59){Fen=0;}
                                         ds1302_write(0x8e,0x00);
                                                                                 ds1302_write(0x82,O_to_H(Fen));
                                                                                 ds1302_write(0x8e,0x80) ;           //允许写保护
                     while (key2==0);                              //等待按键释放        
                                }
                          }
              if(key3==0)//向下按键是否按下
                         {
                                  delay (2);//去抖
                              if(key3==0)
                                 {
                       Fen=ds1302_read(0x83);
                                                        Fen=Fen/16*10+Fen%16;              //先读取时
                                         Fen++;
                                         if(Fen=255){Fen=59;}
                                         ds1302_write(0x8e,0x00);
                                                                                 ds1302_write(0x82,O_to_H(Fen));
                                                                                 ds1302_write(0x8e,0x80) ;             //允许写保护
                                         while (key3==0);                            //等待按键释放        
                                }
                          }
                 }
   
if(key==6)
                 {
                         if(key2==0)//向上按键是否按下
                         {
                                  delay (2);//去抖
                              if(key2==0)
                                 {
                     Week=ds1302_read(0x8b);
                                         Week=Week/16*10+Week%16;                     //先读取分
                                         Week++;
                                         if(Week>7){Week=1;}
                                         ds1302_write (0x8e,0x00);                //禁止写保护
                                         ds1302_write(0x8a,O_to_H(Week));           //年写入
                     ds1302_write (0x8e,0x80);                //允许写保护
                     while (key2==0);                              //等待按键释放        
                                }
                          }
                if(key3==0)//向上按键是否按下
                         {
                                  delay (2);//去抖
                              if(key3==0)
                                 {
                     Week=ds1302_read(0x8b);
                                         Week=Week/16*10+Week%16;                     //先读取分
                                         Week++;
                                         if(Week<1){Week=7;}
                                         ds1302_write (0x8e,0x00);                //禁止写保护
                                         ds1302_write(0x8a,O_to_H(Week));           //年写入
                     ds1302_write (0x8e,0x80);                //允许写保护
                     while (key3==0);                              //等待按键释放        
                                }
                          }
                          }          
  
                                                              
                                   shoutime();

                       }
                                 }

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-11-2 13:02:49 | 显示全部楼层
楼主为什么说程序"有点错误"

出0入0汤圆

 楼主| 发表于 2012-11-2 16:50:23 | 显示全部楼层
lcw_swust 发表于 2012-11-2 13:02
楼主为什么说程序"有点错误"

因为当key==3时那个DAY不改变

出0入0汤圆

发表于 2012-11-5 13:00:12 | 显示全部楼层
龙格 发表于 2012-11-2 16:50
因为当key==3时那个DAY不改变

"//禁止写保护"那一句好像跟其它地方不一样

出0入0汤圆

 楼主| 发表于 2012-11-9 23:31:24 | 显示全部楼层
lcw_swust 发表于 2012-11-5 13:00
"//禁止写保护"那一句好像跟其它地方不一样

没有看到啊

出0入0汤圆

发表于 2012-11-11 10:11:33 | 显示全部楼层
龙格 发表于 2012-11-9 23:31
没有看到啊

你看这两个“禁止写保护”语句是一样的吗?
if(key==2)
...
  ds1302_write (0x8e,0x00);                //禁止写保护
if(key==3)
...
  ds1302_write(0x80,0x00);                //禁止写保护

出0入0汤圆

 楼主| 发表于 2012-11-12 13:51:58 | 显示全部楼层
lcw_swust 发表于 2012-11-11 10:11
你看这两个“禁止写保护”语句是一样的吗?
if(key==2)
...

呵呵终于发现问题了谢谢啊

出0入0汤圆

发表于 2013-1-27 15:52:45 | 显示全部楼层
lcw_swust 你好,我现在做了一个万年历,很多天了,现在遇到一个问题一直解决不了,就是时间走得很慢,没三秒慢了一秒,还有一个就是加上温度显示的话时间更慢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 10:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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