微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > MAX7219+ds12C887万年时钟这程序那错了

MAX7219+ds12C887万年时钟这程序那错了

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NoOp   0x00         /*空操作*/
#define Digit0 0x01         /*数码管1*/
#define Digit1 0x02         /*数码管2*/
#define Digit2 0x03         /*数码管3*/
#define Digit3 0x04         /*数码管4*/
#define Digit4 0x05         /*数码管5*/
#define Digit5 0x06         /*数码管6*/
#define Digit6 0x07         /*数码管7*/
#define Digit7 0x08         /*数码管8*/
#define DecodeMode 0x09     /*译码模式*/
#define Intensity 0x0a     /*亮度*/
#define ScanLimit 0x0b      /*扫描界限*/
#define ShutDown 0x0c       /*掉电模式*/
#define DisplayTest 0x0f    /*显示测试*/
#define ShutdownMode 0x00      /*掉电方式工作*/
#define NormalOperation 0x01   /*正常操作方式*/                 
#define DecodeDigit 0xff       /*译码位数设置*/
#define IntensityGrade 0x0f    /*显示亮度级别设置*/
#define ScanDigit 0x07         /*扫描位数设置*/
#define TestMode 0x01          /*显示测试方式*/
#define TextEnd 0x00           /*显示测试结束,正常工作*/
extern uchar year_h;
extern uchar year_l;
extern uchar week;
extern uchar month_h;
extern uchar month_l;
extern uchar day_h;
extern uchar day_l;
extern uchar hour_h;
extern uchar hour_l;
extern uchar min_h;
extern uchar min_l;
extern uchar sec_h;
extern uchar sec_l;  
extern uchar month_lunar_h,month_lunar_l,date_lunar_h,date_lunar_l;
extern uchar time_year,time_week,time_month,time_day,time_hour,time_min,time_sec;
extern uchar hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;
extern uchar c_moon,year_moon,month_moon,day_moon;
extern uchar TempBuffer[2];
extern uchar temp_value;
extern bit down_flag;
extern bit up_flag;
extern bit flag;
extern uchar count;
extern uchar temp_1;
#define DS12C887_DATA P3
sfr  WDT_CONTR = 0xe1;
sbit dis_DIN=P0^0;           /*显示串行数据输入端*/
sbit dis_LOAD=P0^1;          /*显示数据锁存端*/
sbit dis_CLK=P0^2;           /*显示时钟输入端*/
sbit DQ=P1^0;
sbit DS12C887_DS=P2^0;
sbit DS12C887_WR=P2^1;
sbit DS12C887_AS=P2^2;
sbit DS12C887_CS=P2^3;
sbit DS12C887_IRQ=P2^4;
sbit set=P1^4;
sbit up=P1^3;
sbit down=P1^2;
sbit out=P1^1;
extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
void SendChar (uchar ch);
void WriteWord_3 (uchar addr,uchar num);
void WriteWord_2 (uchar addr,uchar num);
void WriteWord_1 (uchar addr,uchar num);
unsigned char ReadOneChar(void);
void WriteOneChar(uchar dat);
void ReadTemp(void);
void temp_to_str();
void Init_DS18B20(void);
void delay_18B20(uint i);
void DS12C887_write(unsigned char add,unsigned char dat);
unsigned char DS12C887_read(unsigned char add);
void DS12C887_Gettime();
void WriteWord_1 (unsigned char addr,unsigned char num);
void InitDis (void);
void display();
bit get_moon_day(unsigned char month_p,unsigned int table_addr);
void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day);
void Delay_xMs(unsigned int x);
void timedone();
void downkey();
void upkey();
void scankey();
void outkey();
uchar time_year,time_month,time_day,time_week,time_hour,time_min,time_sec;
uchar c_moon,year_moon,month_moon,day_moon;
uchar year_h,year_l,week,month_h,month_l,day_h,day_l,hour_h,hour_l,min_h,min_l,sec_h,sec_l;
uchar month_lunar_h ,month_lunar_l ,date_lunar_l,date_lunar_h;
uchar hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;
uchar temp_value;
uchar TempBuffer[2];
bit   flag;
uchar count;
bit   up_flag;
bit   down_flag;
uchar temp_1;
void DS12C887_write(uchar add,uchar dat)
{
DS12C887_CS=0;
    DS12C887_AS=1;
DS12C887_DS=1;
DS12C887_WR=1;
DS12C887_DATA=add;
DS12C887_AS=0;
DS12C887_WR=0;
DS12C887_DATA=dat;
DS12C887_WR=1;
DS12C887_AS=1;
DS12C887_CS=1;
}
uchar DS12C887_read(uchar add)
{
uchar ds_date;
DS12C887_AS=1;
DS12C887_DS=1;
DS12C887_WR=1;
DS12C887_CS=0;
DS12C887_DATA=add;
DS12C887_AS=0;
DS12C887_DS=0;
DS12C887_DATA=0xff;
ds_date=DS12C887_DATA;
DS12C887_DS=1;
DS12C887_AS=1;
DS12C887_CS=1;
return ds_date;  
}
void DS12C887_Gettime()
{
time_year=DS12C887_read(0x09);
time_month=DS12C887_read(0x08);
time_day=DS12C887_read(0x07);
time_week=DS12C887_read(0x06);
time_hour=DS12C887_read(0x04);
time_min=DS12C887_read(0x02);
time_sec=DS12C887_read(0x00);
}
/***********ds18b20延迟子函数(晶振12MHz )*******/
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
  unsigned char x=0;
  DQ = 1;          //DQ复位
  delay_18B20(8);  //稍做延时
  DQ = 0;          //单片机将DQ拉低
  delay_18B20(80); //精确延时 大于 480us
  DQ = 1;          //拉高总线
  delay_18B20(14);
  x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delay_18B20(20);
}
/***********ds18b20读一个字节**************/  
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
  {
    DQ = 0; // 给脉冲信号
    dat>>=1;
    DQ = 1; // 给脉冲信号
    if(DQ)
    dat|=0x80;
    delay_18B20(4);
  }
  return(dat);
}
/*************ds18b20写一个字节****************/  
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
   DQ = dat&0x01;
     delay_18B20(5);
   DQ = 1;
     dat>>=1;
}
}
/**************读取ds18b20当前温度************/
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC);     // 跳过读序号列号的操作
WriteOneChar(0x44);  // 启动温度转换
delay_18B20(100);       // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC);  //跳过读序号列号的操作
WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_18B20(100);
a=ReadOneChar();     //读取温度值低位
b=ReadOneChar();     //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;

               
}
void temp_to_str()   //温度数据转换成液晶字符显示
{
  TempBuffer[0]=temp_value/10;  //十位
  TempBuffer[1]=temp_value%10;  //个位
}
/*C51写的公历转农历和星期
            C51写的公历转农历和星期
                        收集:杨本荣  来源: 网络   发表于 2005-9-3 */
      
   
                  /*
                  公历年对应的农历数据,每年三字节,
                  格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
                  第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
                  月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)
                  第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
                  */
                  code uchar year_code[597]={
                                      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
                  };
                  ///月份数据表
                  code uchar
                  day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
                  code uint day_code2[3]={0x111,0x130,0x14e};
                  /*
                  函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
                  调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
                  如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
                  c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
                  纪,c_sun=1为19世纪
                  调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
                  */
                  
                  /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/
                  bit get_moon_day(uchar month_p,uint table_addr)
                  {
                  uchar temp;
                      switch (month_p){
                          case 1:{temp=year_code[table_addr]&0x08;
                               if (temp==0)return(0);else return(1);}
                          case 2:{temp=year_code[table_addr]&0x04;
                               if (temp==0)return(0);else return(1);}
                          case 3:{temp=year_code[table_addr]&0x02;
                               if (temp==0)return(0);else return(1);}
                          case 4:{temp=year_code[table_addr]&0x01;
                               if (temp==0)return(0);else return(1);}
                          case 5:{temp=year_code[table_addr+1]&0x80;
                               if (temp==0) return(0);else return(1);}
                          case 6:{temp=year_code[table_addr+1]&0x40;
                               if (temp==0)return(0);else return(1);}
                          case 7:{temp=year_code[table_addr+1]&0x20;
                               if (temp==0)return(0);else return(1);}
                          case 8:{temp=year_code[table_addr+1]&0x10;
                               if (temp==0)return(0);else return(1);}
                          case 9:{temp=year_code[table_addr+1]&0x08;
                               if (temp==0)return(0);else return(1);}
                          case 10:{temp=year_code[table_addr+1]&0x04;
                               if (temp==0)return(0);else return(1);}
                          case 11:{temp=year_code[table_addr+1]&0x02;
                               if (temp==0)return(0);else return(1);}
                          case 12:{temp=year_code[table_addr+1]&0x01;
                               if (temp==0)return(0);else return(1);}
                          case 13:{temp=year_code[table_addr+2]&0x80;
                               if (temp==0)return(0);else return(1);}default :return(1);
                      }
                  }
                  /*
                  函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
                  调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
                  如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
                  c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
                  纪,c_sun=1为19世纪
                  调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
                  */
                  void Conversion(bit c,uchar year,uchar month,uchar day)
                  {                         //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
                      uchar temp1,temp2,temp3,month_p;
                      uint 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]
            &n

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

网站地图

Top