找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3131|回復(fù): 1
收起左側(cè)

怎么解決基于單片機(jī)電子時鐘設(shè)計(jì)與制作.C(564): warning C291: not every exit pat...

[復(fù)制鏈接]
ID:106230 發(fā)表于 2016-2-26 10:15 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar sec,min,hour,day,month,year,week;
bit w;
uchar next;
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延時1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}
void delay(uint ms)  // 延時子程序
{   
uint a,b,c; //ms=1000為1.015s
    for(a=2;a>0;a--)
for(b=46;b>0;b--)
for(c=ms;c>0;c--);
}
sbit RS = P2^4;
sbit RW = P2^5;
sbit E  = P2^6;
sbit RES = P2^1;
sbit PSB = P2^0;
sbit  sclk=P1^0;      //1302串行時鐘
sbit  I_O=P1^1;      //1302數(shù)據(jù)端口
sbit  rst=P1^2;      //1302復(fù)位
sbit k1=P3^4;       //功能健
sbit k2=P3^5;       //時間加
sbit k3=P3^6;         //時間減
sbit k4=P3^7;       //確定鍵
#define DataPort P0        //單片機(jī) P0<------> 液晶DB0-DB7
uchar code DayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
uint  code DayCode2[3]={0x111,0x130,0x14e};
uchar LunarMonth,LunarDay,LunarYear;
bit c_moon;
uchar code YearCode[300]=
{
    0x0C,0x96,0x45,    //2000 297
    0x4d,0x4A,0xB8,    //2001 300
    0x0d,0x4A,0x4C,    //2002 303
    0x0d,0xA5,0x41,    //2003 306
    0x25,0xAA,0xB6,    //2004 309
    0x05,0x6A,0x49,    //2005 312
    0x7A,0xAd,0xBd,    //2006 315
    0x02,0x5d,0x52,    //2007 318
    0x09,0x2d,0x47,    //2008 321
    0x5C,0x95,0xBA,    //2009 324
    0x0A,0x95,0x4e,    //2010 327
    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
};
/***復(fù)位1302***/
void reset1302()
{
sclk=0;
rst=0;
rst=1;
}
/***向1302寫入1字節(jié)***/
void wrieteByte1302(uchar add)
{
uchar i;
  for(i=0;i<8;i++)
  {
   I_O=0;
   if(add&0x01)I_O=1;
   sclk=0;
   sclk=1;
   add>>=1;
  }
}
void writeClkBye(uchar add,uchar num)
{
reset1302();
wrieteByte1302(add);
wrieteByte1302(num);
}
/***1302初始化***/
void init1302()
{
reset1302();
writeClkBye(0x8e,0);     //允許寫入
reset1302();
writeClkBye(0x90,0xaa);    //慢充電
reset1302();
writeClkBye(0x80,00);    //秒初值
reset1302();
writeClkBye(0x82,0x12);    //分
reset1302();
writeClkBye(0x84,0x12);    // 時
reset1302();
writeClkBye(0x86,0x04);    // 日
reset1302();
writeClkBye(0x88,0x03);    // 月
reset1302();
writeClkBye(0x8a,0x07);    // 星期
reset1302();
writeClkBye(0x8c,0x12);    // 年
reset1302();
}
/***檢測忙位***/
void Check_Busy()
{  
    RS=0;
    RW=1;
    E=1;
    DataPort=0xff;
    while((DataPort&0x80)==0x80);//忙則等待
    E=0;
}
/***寫命令***/
void Write_Cmd(unsigned char Cmd)
{
Check_Busy();
RS=0;
RW=0;
E=1;
DataPort=Cmd;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/****寫數(shù)據(jù)***/
void Write_Data(unsigned char Data)
{
Check_Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/****液晶屏初始化***/
void Init_ST7920()
{  
   DelayMs(40);           //大于40MS的延時程序
   PSB=1;                 //設(shè)置為8BIT并口工作模式
   DelayMs(1);            //延時
   RES=0;                 //復(fù)位
   DelayMs(1);            //延時
   RES=1;                 //復(fù)位置高
   DelayMs(10);
   Write_Cmd(0x30);       //選擇基本指令集
   DelayUs2x(50);         //延時大于100us
   Write_Cmd(0x30);       //選擇8bit數(shù)據(jù)流
   DelayUs2x(20);         //延時大于37us
   Write_Cmd(0x0c);       //開顯示(無游標(biāo)、不反白)
   DelayUs2x(50);         //延時大于100us
   Write_Cmd(0x01);       //清除顯示,并且設(shè)定地址指針為00H
   DelayMs(15);           //延時大于10ms
   Write_Cmd(0x06);       //指定在資料的讀取及寫入時,設(shè)定游標(biāo)的移動方向及指定顯示的移位,光標(biāo)從右向左加1位移動
   DelayUs2x(50);         //延時大于100us
}
/****從1302讀取***/
uchar ReadByte1302()
{
uchar i;
uchar RByte;
uchar TempByte;
  RByte=0x00;
  I_O=1;
  for(i=0;i<8;i++)
  {
   sclk=1;
   sclk=0;
   TempByte=(uchar)I_O;
   TempByte<<=7;
   RByte>>=1;
   RByte|=TempByte;
  }
  return RByte;
}
uchar read1302(uchar add)
{
uchar num;
reset1302();
wrieteByte1302(add);
ReadByte1302();
num=ReadByte1302();
return num;
}
void LCDTestWord(bit i, uchar word)
{
if(i==0)
{
  Write_Cmd(word);               //i=0;則寫入指令
}
else
{
  Write_Data(word);                //i=1;則寫入數(shù)據(jù)  
}
}
/***向LCD發(fā)送一個字符串即寫漢字***/
void LCDSendWord(uchar *p)        
{
while(*p>0)                           
{
  Write_Data(*p);
  p++;
}
}
/***往LCD上填寫 年 月 日 小時 分鐘 秒 星期以及它們的 數(shù)據(jù)***/
void DisplayYear()                 
{
  year=read1302(0x8d);         //從1302的0X8D處讀出年數(shù)據(jù)
  LCDTestWord(0,0x81);             //寫指令  在第一行第二個字符位置顯示 年
  LCDTestWord(1,(year/16)+0x30);   //寫數(shù)據(jù)
  LCDTestWord(1,year%16+0x30);     //寫數(shù)據(jù)
  LCDTestWord(0,0x82);             //寫指令  第一行第三個字符位置
  LCDSendWord("年");               //顯示 年  LCD DDRAM第一行地址為80-87,
          //第二行為90-97,第三行為88-8F,第四行為98-9F
}
void DisplayMonth()               
{
month=read1302(0x89);          //從1302中讀取月份數(shù)據(jù)
  LCDTestWord(0,0x83);               //寫命令
  if(month/16!=0)
  {
    LCDTestWord(1,(month/16)+0x30);  //寫數(shù)據(jù)
  }
  else
  {
    LCDTestWord(1,0x20);             //寫數(shù)據(jù)
  }
  LCDTestWord(1,month%16+0x30);     //寫數(shù)據(jù)  
  LCDTestWord(0,0x84);              //寫指令
  LCDSendWord("月");                //顯示 月
}
void DisplayDay()                       
{
  day=read1302(0x87);              //從1302中讀取日期數(shù)據(jù)
  LCDTestWord(0,0x85);
    if(day/16!=0)   
    {
   LCDTestWord(1,(day/16)+0x30);
       }         
  else
     {
   LCDTestWord(1,0x20);
   }
  LCDTestWord(1,day%16+0x30);
  LCDTestWord(0,0x86);
  LCDSendWord("日");
}
void DisplayWeek()                  
{
  week=(read1302(0x8b))%16;      //從1302中讀取星期數(shù)據(jù)  
  LCDTestWord(0,0x95);
  LCDSendWord("星期");
  LCDTestWord(0,0x97);
  if(week==7)    {LCDSendWord("日");}
  if(week==6)    {LCDSendWord("六");}
  if(week==5)    {LCDSendWord("五");}
  if(week==4)    {LCDSendWord("四");}
  if(week==3)    {LCDSendWord("三");}
  if(week==2)    {LCDSendWord("二");}
  if(week==1)    {LCDSendWord("一");}  //顯示星期一到星期日
}
void DisplayHour()                 
{
  hour=read1302(0x85);
  LCDTestWord(0,0x90);
  LCDTestWord(1,(hour/16)+0x30);
  LCDTestWord(1,hour%16+0x30);
}
void DisplayMin()                    
{
  min=read1302(0x83);
  LCDTestWord(0,0x91);
  LCDTestWord(1,0x3a);    //寫入分割號 :
  LCDTestWord(1,(min/16)+0x30);
  LCDTestWord(1,min%16+0x30);
  LCDTestWord(1,0x3a);    //寫入分割號 :
}
void DisplaySec()                 
{
  sec=read1302(0x81);
  LCDTestWord(0,0x93);
  LCDTestWord(1,(sec/16)+0x30);
  LCDTestWord(1,sec%16+0x30);
}
void UpDate()
{
DisplayYear();     //顯示年
DisplayMonth();    //顯示月
DisplayDay();    //顯示日
DisplayWeek();    //顯示星期
DisplayHour();    //顯示時
DisplayMin();    //顯示分
DisplaySec();    //顯示秒
}
void SetTime(uchar count)
{
unsigned char address,item;
unsigned char max,mini;
LCDTestWord(0,0x98);
LCDSendWord("設(shè)置");
if(count==5)  {LCDSendWord("秒鐘      ");address=0x81; max=59;mini=0;}
if(count==4)  {LCDSendWord("分鐘      ");address=0x83; max=59;mini=0;}
if(count==3)  {LCDSendWord("小時      ");address=0x85; max=23;mini=0;}
if(count==6)  {LCDSendWord("星期      ");address=0x8b; max=7;mini=1;}
if(count==2)  {LCDSendWord("日期      ");address=0x87; max=31; mini=1;}
if(count==1)  {LCDSendWord("月份      ");address=0x89; max=12;mini=1;}
if(count==0)  {LCDSendWord("年份      ");address=0x8d; max=99;mini=0;}
item=read1302(address);//讀取DS1302某地址上的數(shù)值賦給item  
item=(item/16)*10+item%16;
if(k2==0)       //加
  item++;          //數(shù)加 1
if(k3==0)     //-減
  item--;          //數(shù)減 1
if(item>max)
  item=mini;       //查看數(shù)值有效范圍  
if(item<mini)
  item=max;
writeClkBye(0x8e,0x00);
item=(item/10)*16+item%10;
writeClkBye(address-1,item); //將調(diào)整好的item值寫入DS1302
    UpDate();
}
/*鍵盤掃描*/
void keyscan ()
{
if (k1==0)           // 設(shè)置時間
{
    DelayMs(10);         //按鍵消抖   
  if(k1==0&&w==0)  //當(dāng)是正常狀態(tài)時就進(jìn)入調(diào)時狀態(tài)
  {
   w=1;          //進(jìn)入調(diào)時   
   SetTime(next);   //調(diào)整   
  }
  if(k1==0&&w==1)  //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項(xiàng)
  {
   next++;
   if(next>=7)   {next= 0;}
   SetTime(next);   //調(diào)整   
  }
     while(k1==0);    //等待鍵松開
}
if(k4==0)           // 當(dāng)在調(diào)時狀態(tài)時就退出調(diào)時
    {
  DelayMs(10);         //按鍵消抖
  if(k4==0&&w==1)
  {
   w=0;next=0;
Write_Cmd(0x01);      //清除LCD的顯示內(nèi)容
  }
  while(k4==0);   //等待鍵松開
}
if (k2==0)          //加調(diào)整
{
     DelayMs(10);         //按鍵消抖
     if(k2==0&&w==1)
  {   
   SetTime(next);   //調(diào)整
  }
  while(k2==0);       //等待鍵松開
}
if (k3==0)        //減調(diào)整
{        
     DelayMs(10);         //按鍵消抖
     if(k3==0&&w==1)
  {   
   SetTime(next);   //調(diào)整
  }  
  while(k3==0);     //等待鍵松開
}  
}
/***開機(jī)畫面***/
void welcome()
{
     LCDTestWord(0,0x81);
  LCDSendWord("萬年歷設(shè)計(jì)");
     LCDTestWord(0,0x91);
  LCDSendWord("指導(dǎo):…");
     LCDTestWord(0,0x89);
  LCDSendWord("制作:…");
     LCDTestWord(0,0x99);
  LCDSendWord("陽光總在風(fēng)雨后");
}
bit GetMoonDay(uchar LunarMonth,uint TableAddr)
{
  uchar temp;
    switch (LunarMonth)                       //LunarMonth指向農(nóng)歷月份
   {
        case 1:
      {
       temp=YearCode[TableAddr]&0x08;   //1月,對應(yīng)年份表里第一字節(jié)的BIT3位
             if (temp==0) return(0);          //為0,月小  
       else  return(1);                 //為1,月大
      }
        case 2:
      {
       temp=YearCode[TableAddr]&0x04;   //2月,對應(yīng)年份表里第一字節(jié)的BIT2位
         if (temp==0) return(0);          //為0,月小
       else  return(1);                 //為1,月大
      }
        case 3:
     {
      temp=YearCode[TableAddr]&0x02;   //3月,對應(yīng)第一字節(jié)的BIT1位
      if (temp==0) return(0);          //為0,月小
      else  return(1);                 //為1,月大
     }
        case 4:
     {
      temp=YearCode[TableAddr]&0x01;    //1月,對應(yīng)第一字節(jié)的BIT0位
      if (temp==0) return(0);     //為0,月小
      else return(1);       //為1,月大
     }
        case 5:
     {
      temp=YearCode[TableAddr+1]&0x80;  //5月,對應(yīng)第二字節(jié)的BIT7位
      if (temp==0)  return(0);    //為0,月小
      else  return(1);       //為1,月大
     }
        case 6:
     {
      temp=YearCode[TableAddr+1]&0x40;  //6月,對應(yīng)第二字節(jié)的BIT6位
      if (temp==0) return(0);     //為0,月小
      else  return(1);       //為1,月大
     }
        case 7:
     {
      temp=YearCode[TableAddr+1]&0x20;  //7月,對應(yīng)第二字節(jié)的BIT5位
      if (temp==0) return(0);       //為0,月小
      else  return(1);       //為1,月大
     }
        case 8:
     {
      temp=YearCode[TableAddr+1]&0x10;  //8月,對應(yīng)第二字節(jié)的BIT4位
      if (temp==0) return(0);     //為0,月小
      else  return(1);       //為1,月大
     }
        case 9:
     {
      temp=YearCode[TableAddr+1]&0x08;  //9月,對應(yīng)第二字節(jié)的BIT3位
      if (temp==0) return(0);     //為0,月小
      else  return(1);       //為1,月大
     }
        case 10:
     {
      temp=YearCode[TableAddr+1]&0x04;  //10月,對應(yīng)第二字節(jié)的BIT2位
      if (temp==0) return(0);           //為0,月小
      else  return(1);       //為1,月大
     }
        case 11:
     {
      temp=YearCode[TableAddr+1]&0x02;  //11月,對應(yīng)第二字節(jié)的BIT1位
      if (temp==0) return(0);     //為0,月小
      else  return(1);        //為1,月大
     }
        case 12:
     {
      temp=YearCode[TableAddr+1]&0x01;  //12月,對應(yīng)第二字節(jié)的BIT0位
      if (temp==0) return(0);     //為0,月小
      else  return(1);       //為1,月大
     }
        case 13:
     {
      temp=YearCode[TableAddr+2]&0x80;  //13月,對應(yīng)第三字節(jié)的BIT7位
      if (temp==0) return(0);     //為0,月小
      else  return(1);       //為1,月大
     }
    }
}
void Conversion(uchar year,uchar month,uchar day)                             
{                        
    uchar temp1,temp2,temp3,MonthP;//temp3,temp4分別表示春節(jié)距元旦的天數(shù)
    uint temp4,TableAddr;     //公歷日離元旦的天數(shù)
    bit flag2,flag_y;
    temp1=year/16;              //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制  高位
    temp2=year%16;              //低位
    year=temp1*10+temp2;        //把 年 數(shù)據(jù) 轉(zhuǎn)換成16進(jìn)制
    temp1=month/16;             //月份 高位
    temp2=month%16;             //月份 低位
    month=temp1*10+temp2;       //把 月 數(shù)據(jù) 轉(zhuǎn)換成16進(jìn)制
    temp1=day/16;               //日期 高位
    temp2=day%16;               //日期 低位
    day=temp1*10+temp2;         //把 日 數(shù)據(jù) 轉(zhuǎn)換成16進(jìn)制                     
  TableAddr=year*0x03;         //定位數(shù)據(jù)表地址
  LCDTestWord(0,0x80);
  LCDSendWord("20");  
    temp1=YearCode[TableAddr+2]&0x60;       //取當(dāng)年春節(jié)所在的公歷月份   年份表中第三字節(jié)BIT6-5表示春節(jié)的公歷月份
    temp1=_cror_(temp1,5);                  //循環(huán)右移5位,得到 春節(jié)所在的公歷月份
    temp2=YearCode[TableAddr+2]&0x1f;       //取當(dāng)年春節(jié)所在的公歷日    年份表中第三字節(jié)BIT4-0表示當(dāng)年春節(jié)所在的公歷日
    if(temp1==0x01)                         // 計(jì)算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月   
        temp3=temp2-1;                      //假如春節(jié)在公歷1月,則元旦離春節(jié)的天數(shù)為  temp2-1 天
    else
        temp3=temp2+0x1f-1;                 //假如春節(jié)在公歷2月,則無旦離春節(jié)的天數(shù)為  temp2+0x1f-1 天
    if (month<10)
        temp4=DayCode1[month-1]+day-1;      //0到8月某日距元旦的天數(shù)
    else
        temp4=DayCode2[month-10]+day-1;     //9月開始的某一天距元旦的天數(shù)
    if ((month>0x02)&&(year%0x04==0))       //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
        temp4+=1;
                                         //計(jì)算機(jī)出公歷日距元旦的天數(shù)和春節(jié)距元旦的天數(shù),則是為了比較公歷日是在春節(jié)前還是春節(jié)后
                                         //如果temp3>temp4  則 公歷日在春節(jié)之前
    if (temp4>=temp3)                       //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進(jìn)行運(yùn)算
   {   
        temp4-=temp3;                       //公歷日離春節(jié)的天數(shù)  因?yàn)楣珰v日在春節(jié)后  所以為temp4-temp3
        month=0x01;
        MonthP=0x01;                        //LunarMonth為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日LunarMonth指向首月
        flag2=GetMoonDay(MonthP,TableAddr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
        flag_y=0;
        if(flag2==0)                            //GetMoonDay()函數(shù)返回的是0
     {temp1=0x1d;}                       //小月29天
        else                                    //GetMoonDay()函數(shù)返回的是1
     {temp1=0x1e;}                       //大月30天
        temp2=YearCode[TableAddr]&0xf0;         //年份數(shù)據(jù)表中第1字節(jié)BIT7-4為閏月,為0則這年無閏月,如為1,表示有閏月
        temp2=_cror_(temp2,4);                  //從數(shù)據(jù)表中取該年的閏月月份,如為0,則該年無閏月  BIT3-0表示陰歷1到4月的大小 1為大 0 為小
        while(temp4>=temp1)
      {
            temp4-=temp1;
            MonthP+=1;
            if(month==temp2)
          {
              flag_y=~flag_y;
              if(flag_y==0)month+=1;
              }
            else month+=1;      
            flag2=GetMoonDay(MonthP,TableAddr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
          }
        day=temp4+1;
     }
    else
   {               //公歷日在春節(jié)前使用下面代碼進(jìn)行運(yùn)算
        temp3-=temp4;                          //公歷日離春節(jié)的天數(shù)  因?yàn)楣珰v日在春節(jié)前  所以為temp3-temp4
        if (year==0x00){year=0x63;}
        else year-=1;
        TableAddr-=0x03;
        month=0x0c;
        temp2=YearCode[TableAddr]&0xf0;    //格式第一字節(jié)BIT7-4位表示閏月月份,為0,則無閏月,BIT3-0對應(yīng)陰歷第1-4月的大小,
        temp2=_cror_(temp2,4);
        if (temp2==0)MonthP=0x0c;
        else MonthP=0x0d; //
        /* MonthP為月份指向,如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12*/
       flag_y=0;
        flag2=GetMoonDay(MonthP,TableAddr);
        if(flag2==0)temp1=0x1d;
        else temp1=0x1e;
        while(temp3>temp1)
     {
            temp3-=temp1;
            MonthP-=1;
            if(flag_y==0)month-=1;
            if(month==temp2)flag_y=~flag_y;
            flag2=GetMoonDay(MonthP,TableAddr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
         }
        day=temp1-temp3+1;
     }
    c_moon=1;               
    temp1=year/10;
    temp1=_crol_(temp1,4);
    temp2=year%10;
    LunarYear=temp1|temp2;
    temp1=month/10;
    temp1=_crol_(temp1,4);
    temp2=month%10;
    LunarMonth=temp1|temp2;
    temp1=day/10;
    temp1=_crol_(temp1,4);
    temp2=day%10;
    LunarDay=temp1|temp2;
}
void Displaynongli()
{
  uchar LunarYearD,ReYear;
  Conversion(year,month,day);
  LCDTestWord(0,0x88);                     //顯示在LCD的0X94位置上
  LCDSendWord("農(nóng)歷");
  LCDTestWord(1,LunarMonth/16+0x30);       //農(nóng)歷月十位
  LCDTestWord(1,LunarMonth%16+0x30);       //農(nóng)歷月個位  
  LCDSendWord("月");
  LCDTestWord(1,LunarDay/16+0x30);         //農(nóng)歷日十位
  LCDTestWord(1,LunarDay%16+0x30);         //農(nóng)歷日個位
  LunarYearD=(LunarYear/16)*10+LunarYear%16;        //農(nóng)歷年轉(zhuǎn)換成10進(jìn)制數(shù)
  ReYear=LunarYearD%12;                             //農(nóng)歷年模12,取余運(yùn)算
  switch(ReYear)
  {
  case 0: LCDTestWord(0,0x8e);LCDSendWord("龍年");break;   //余0即整除 農(nóng)歷 龍年
  case 1: LCDTestWord(0,0x8e);LCDSendWord("蛇年");break;   //蛇年
  case 2: LCDTestWord(0,0x8e);LCDSendWord("馬年");break;
  case 3: LCDTestWord(0,0x8e);LCDSendWord("羊年");break;
  case 4: LCDTestWord(0,0x8e);LCDSendWord("猴年");break;
  case 5: LCDTestWord(0,0x8e);LCDSendWord("雞年");break;
  case 6: LCDTestWord(0,0x8e);LCDSendWord("狗年");break;
  case 7: LCDTestWord(0,0x8e);LCDSendWord("豬年");break;
  case 8: LCDTestWord(0,0x8e);LCDSendWord("鼠年");break;
  case 9: LCDTestWord(0,0x8e);LCDSendWord("牛年");break;
  case 10:LCDTestWord(0,0x8e);LCDSendWord("虎年");break;
  case 11:LCDTestWord(0,0x8e);LCDSendWord("兔年");break;
}
}
/***主程序***/
main()
{
k1=1;
k2=1;
k3=1;
k4=1;
Init_ST7920();
welcome();
delay(3000);
init1302();
Init_ST7920();
while(1)
{
   DisplayYear();         //顯示年
   DisplayMonth();          //顯示月
   DisplayDay();      //顯示日
   DisplayWeek();      //顯示星期
   DisplayHour();      //顯示時
   DisplayMin();      //顯示分
   DisplaySec();      //顯示秒
   Displaynongli();         //顯示農(nóng)歷
   keyscan();               //鍵盤掃描
}
}
回復(fù)

使用道具 舉報

ID:82765 發(fā)表于 2017-9-6 18:18 | 顯示全部樓層
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表