久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4725|回復: 10
收起左側

哪位大神幫我看一下這個單片機程序,按鍵不起作用

[復制鏈接]
ID:61140 發表于 2018-6-10 16:06 | 顯示全部樓層 |閱讀模式
這個程序是我從網上下載的,因為它是用普通51單片機的,但我用的STC12C5A60S2,所以改了延時能用了,但是現在按鍵調整時間不管用,有沒有大神幫我看一下問題出在哪。
  1. #include<stc12c5a60s2.h>
  2. #include<intrins.h>
  3. #define SoundSpace 3/4   
  4. unsigned char sec,min,hour,day,month,year,cen,week;  //秒,分,小時,公歷日期,月份,年份,世紀,星期
  5. unsigned char LunarMonth,LunarDay,LunarYear;         //陰歷日期,月份,年份
  6. bit c_moon;                                          //大小月標志位                                          
  7. bit cenbit=0;                                          //世紀標志,為1,則表示20世紀,為0,則表示21世紀
  8. bit w;                                               //調時狀態標志位
  9. unsigned char next;
  10. /**********定義LCD12864的數據線和相關函數*************/
  11. sbit LCD_RS=P1^1;        //模式位,低電平輸入指令,高電平輸入數據
  12. sbit LCD_RW=P1^0;        //讀寫位,低電平讀,高電平寫
  13. sbit LCD_E=P4^2;         //LCD12864使能位,低電平無效,高電平使能
  14. //sbit PSB=P1^4;
  15. #define Busy 0x80
  16. #define LCD_Data P0     //LCD12864的8位數據總線,單片機的P0端口
  17. void WriteDataLCD(unsigned char WDLCD);          //給LCD12864寫數據
  18. void WriteCommandLCD(unsigned char WCLCD);       //給LCD12864寫指令
  19. void LCDInit(void);                              //LCD12864初始化
  20. void LCDClear(void);                             //LCD12864清屏
  21. void CheckBusy(void);                            //忙檢測
  22. void LCDSendWord(unsigned char *p);              //向LCD發送一個字符串
  23. void LCDTestWord(bit i,unsigned char word);
  24. void DisplaySec(void);                           //在LCD上顯示秒鐘
  25. void DisplayMin(void);                           //在LCD上顯示分鐘
  26. void DisplayHour(void);                          //在LCD上顯示小時
  27. void DisplayDay(void);                           //在LCD上顯示日期
  28. void DisplayYear(void);                          //在LCD上顯示年份
  29. void DisplayMonth(void);                         //在LCD上顯示月份
  30. void DisplayWeek(void);                          //在LCD上顯示星期
  31. void Holidays(void);                             //在LCD上顯示節日
  32. /*********定義時間芯片DS1302的數據線及相關函數***********/
  33. sbit DS1302_CLK=P2^5;         //DS1302的時鐘信號線   
  34. sbit DS1302_IO=P2^6;          //DS1302的數據端口線
  35. sbit DS1302_RST=P2^7;         //DS1302的片選信號線
  36. void WriteDs1302byte(unsigned char temp);                    //給DS1302寫一個字節
  37. void WriteDs1302(unsigned char address,unsigned char dat);  //給DS1302寫入時間,先確定地址,再確定要寫入的數據
  38. unsigned char ReadDs1302(unsigned char address);           //讀取DS1302的數據
  39. void InitDS1302();
  40. /**********定義溫度傳感器DS18B20的數據線和相關函數*************/
  41. sbit DS18B20=P4^4;                        //DS18B20的數據線
  42. int temp;
  43. void DS18B20Init(void);                   //DS18B20初始化函數
  44. int GetTemp(void);
  45. void TempWriteByte(unsigned char dat);
  46. unsigned char TempRead(void);
  47. bit TempReadBit(void);   
  48. void delayb(unsigned int count);
  49. void TempChange(void);
  50. void Conversion(bit cen_m,unsigned char year,unsigned char month,unsigned char day);
  51. bit GetMoonDay(unsigned char month_p,unsigned int TableAddr);
  52. void DisplayShengXiao(void);
  53. void DelayMs(unsigned int a);
  54. void Delay(unsigned char num);
  55. /**********定義開關按鍵,及蜂鳴器的數據線************/
  56. sbit SetKey=P1^4;       //按鍵功能:設置
  57. sbit SureKey=P1^5;      //按鍵功能:確認
  58. sbit PlusKey=P1^6;      //按鍵功能:加
  59. sbit ReduceKey=P1^7;    //按鍵功能:減
  60. void Key(void);

  61. #define Fosc 24000000      //定義晶振頻率24000000HZ
  62. #define jiepai 3/4         //定義普通音符演奏的長度分率,每4分音符間隔
  63. sbit Speaker=P3^0;         //定義輸出管腳

  64. unsigned int code FreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};  //C調歌曲12個半音的頻率
  65. unsigned char code PositTab[7]={0,2,4,5,7,9,11};                                   //1~7在頻率表中的位置
  66. unsigned char code LengthTab[7]={1,2,4,8,16,32,64};                       
  67. unsigned char SoundTempTH0,SoundTempTL0;    //音符定時器初值暫存
  68. unsigned char SoundTempTH1,SoundTempTL1;    //音長定時器初值暫存
  69. void SpeakerDiDi(void);
  70. void SpeakerDiDi(void)
  71. {
  72. unsigned char i;  //整點報時延時
  73. for(i=0;i<3;i++)
  74. {
  75.   Speaker=0;
  76.   DelayMs(800);
  77.   Speaker=1;
  78.   DelayMs(800);
  79. }
  80. DelayMs(4000);
  81. for(i=0;i<3;i++)
  82. {
  83.   Speaker=0;
  84.   DelayMs(800);
  85.   Speaker=1;
  86.   DelayMs(800);
  87. }
  88. DelayMs(4000);
  89. for(i=0;i<2;i++)
  90. {
  91.   Speaker=0;
  92.   DelayMs(4000);
  93.   Speaker=1;
  94.   DelayMs(1000);
  95. }
  96. }
  97. void InitialSound(void)
  98. {
  99.     Speaker=1;
  100.     SoundTempTH1=(65535-(1/1200)*Fosc)/256;    //計算TL1應裝入的初值     (10ms的初裝值)
  101.     SoundTempTL1=(65535-(1/1200)*Fosc)%256;    //計算TH1應裝入的初值
  102.     TH1=SoundTempTH1;                          //裝入初值
  103.     TL1=SoundTempTL1;
  104.     TMOD|=0x11;                                //定時器1、2都工作在定時器模式,工作方式1
  105.     ET0=1;                                     //定時器0開中斷
  106.     ET1=0;                                     //定時器1關中斷
  107.     TR0=0;                                     //不啟動定時器
  108.     TR1=0;                                     //不啟動定時器
  109.     EA=1;                                      //開啟CPU中斷
  110. }  

  111. void Speakertimer(void) interrupt 1            //音符發生中斷
  112. {
  113.     Speaker=!Speaker;                          //取反  
  114.     TH0=SoundTempTH0;                          //定時器0重新裝初值
  115.     TL0=SoundTempTL0;
  116. }
  117. void PlayMusic(unsigned char *SoundName,unsigned char diaohao,unsigned shengjiang,unsigned int Speed)
  118.                                    //SoundName為演奏歌曲歌名 diaohao是指樂曲升多少個半音演奏
  119.            //shengjiang 1:降八度, 2:不升不降, 3:升八度; Speed歌曲演奏速度
  120. {
  121.     unsigned int NewFreTab[12];         //新的頻率表
  122.     unsigned char i,j;
  123.     unsigned int Point,yinfuchang,yipai,LDiv1,LDiv2,sifenyifu,CurrentFre,TempCounter,SoundLength;
  124.              //Point 指針索引值  LDiv  音符演奏的長度(多少個10ms)   yipai 1分音符的長度(幾個10ms)即一個節拍   
  125.              //sifenyifu 4分音符的長度   CurrentFre 查出對應音符的頻率   SoundLength歌曲長度   TempCounter計算計數器初值
  126.     unsigned char yindiao,length,yinfu,shengban,gaodi,SLen,leixing,fudian;
  127.              //yindiao音調  length音長  yinfu音符  gaodi高低音  shengban是否升半   leixing音符類型(0普通1連音2頓音)
  128.     for(i=0;i<12;i++)                   // 根據調號及升降八度來生成新的頻率表
  129.     {
  130.         j=i+diaohao;
  131.         if(j>11)
  132.         {
  133.             j=j-12;
  134.             NewFreTab[i]=FreTab[j]*2;            //頻率翻倍速
  135.         }
  136.         else
  137.             NewFreTab[i]=FreTab[j];
  138.         if(shengjiang==1) NewFreTab[i]>>=2;      //如果是降調  則頻率除以2
  139.         else if(shengjiang==3) NewFreTab[i]<<=2; //如果是升調 則頻率翻倍速
  140.     }                                   
  141.     SoundLength=0;
  142.     while(SoundName[SoundLength]!=0x00)          //計算歌曲長度 以0X00結尾
  143.     {
  144.         SoundLength+=2;
  145.     }
  146.     Point=0;
  147.     yindiao=SoundName[Point];                    //第一個字節為音符音調
  148.     length=SoundName[Point+1];                   //第二個字節為音符時值
  149.     yipai=12000/Speed;                           //算出一個節拍的長度(單位是10ms)   
  150.     sifenyifu=yipai/4;                           //算出4分音符的長度
  151.     sifenyifu=sifenyifu-sifenyifu*jiepai;        //普通音最長間隔標準
  152.     TR0=0;
  153.     TR1=1;                                       //啟動定時器1
  154.     while(Point<SoundLength)
  155.     {
  156.         yinfu=yindiao%10;                        //個位,1--7七個音符                                 
  157.         gaodi=yindiao/10%10;                     //十位,高低音
  158.         shengban=yindiao/100;                    //百位,是否升半
  159.         CurrentFre=NewFreTab[PositTab[yinfu-1]+shengban];     //查出對應音符的頻率   
  160.         if(yinfu!=0)
  161.         {
  162.             if (gaodi==1) CurrentFre>>=2;         //低音,頻率除以2
  163.             if (gaodi==3) CurrentFre<<=2;         //高音, 頻率翻倍速
  164.             TempCounter=65536-(50000/CurrentFre)*10/(24000000/Fosc);//計算計數器初值
  165.             SoundTempTH0=TempCounter/256;
  166.             SoundTempTL0=TempCounter%256;
  167.             TH0=SoundTempTH0;
  168.             TL0=SoundTempTL0+12;                 //加12是對中斷延時的補償
  169.         }
  170.         SLen=LengthTab[length%10];               //算出是幾分音符
  171.         leixing=length/10%10;                    //算出音符類型(0普通1連音2頓音)
  172.         fudian=length/100;
  173.         yinfuchang=yipai/SLen;                   //算出連音音符演奏的長度(多少個10ms)
  174.         if (fudian==1)
  175.             yinfuchang=yinfuchang+yinfuchang/2;
  176.         if(leixing!=1)   
  177.             if(leixing==0)                       //算出普通音符的演奏長度
  178.                 if (SLen<=4)   
  179.                     LDiv1=yinfuchang-sifenyifu;
  180.                 else
  181.                     LDiv1=yinfuchang*jiepai;
  182.             else
  183.                 LDiv1=yinfuchang/2;              //算出頓音的演奏長度
  184.         else
  185.             LDiv1=yinfuchang;
  186.         if(yinfu==0) LDiv1=0;
  187.             LDiv2=yinfuchang-LDiv1;              //算出不發音的長度
  188.          if (yinfu!=0)
  189.         {
  190.             TR0=1;
  191.             for(i=LDiv1;i>0;i--)                 //發規定長度的音
  192.             {
  193.                 while(TF1==0);
  194.                 TH1=SoundTempTH1;
  195.                 TL1=SoundTempTL1;
  196.                 TF1=0;
  197.             }
  198.         }
  199.         if(LDiv2!=0)
  200.         {
  201.             TR0=0; Speaker=0;
  202.             for(i=LDiv2;i>0;i--)                //音符間的間隔
  203.             {
  204.                 while(TF1==0);
  205.                 TH1=SoundTempTH1;
  206.                 TL1=SoundTempTL1;
  207.                 TF1=0;
  208.             }
  209.         }
  210.         Point+=2;
  211.         yindiao=SoundName[Point];
  212.         length=SoundName[Point+1];
  213.     }
  214.     Speaker=1;               
  215. }
  216. //**************************************************************************
  217. unsigned char code HappyBirthday[]=
  218. {//生日歌
  219.     0x19,0x03, 0x19,0x03, 0x1A,0x02, 0x19,0x02, 0x1F,0x02,
  220.     0x1B,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x02, 0x19,0x02,
  221.     0x20,0x02, 0x1F,0x01, 0x19,0x03, 0x19,0x03, 0x23,0x02,
  222.     0x21,0x02, 0x1F,0x02, 0x1B,0x0C, 0x1A,0x15, 0x22,0x03,
  223.     0x22,0x03, 0x21,0x02, 0x1F,0x02, 0x20,0x02, 0x1F,0x15,
  224.     0x00,0x00
  225. };
  226. unsigned char code Butterfly[]=
  227. {
  228. 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,                                
  229. 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
  230.   0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,  
  231.    0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
  232.     0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
  233.     0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
  234.     0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,  
  235.     0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
  236.     0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
  237.     0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,  
  238.     0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,  
  239.     0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,  
  240.     0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
  241.     0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
  242.     0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,  
  243.     0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,  
  244.     0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,  
  245.     0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
  246.     0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
  247.     0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
  248.     0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,   
  249.     0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
  250.     0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
  251.     0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
  252.     0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
  253.     0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
  254.     0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
  255.     0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
  256.     0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
  257.     0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
  258.     0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
  259.     0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
  260.     0x10,0x03, 0x15,0x00, 0x00,0x00
  261. };
  262. /*音樂歌譜每個音符由兩個字節表示,第一個字節表示音高,第二個字節表示音長
  263. 音高由三位數字組成:個位是表示 1~7 這七個音符
  264. 十位是表示音符所在的音區:1-低音,2-中音,3-高音;百位表示這個音符是否要升半音: 0-不升,1-升半音。
  265. 音長最多由三位數字組成:
  266. 個位表示音符的時值,其對應關系是:
  267. 數值(n): |0 |1 |2 |3 | 4 | 5 | 6 |
  268. 幾分音符: |1 |2 |4 |8 |16 |32 |64   
  269. 十位表示音符的演奏效果 (0-2): 0-普通,1-連音,2-頓音 百位是符點位: 0-無符點,1-有符點


  270. 陽歷對應的陰歷數據,每年三字節,
  271. 格式第一字節BIT7-4位表示閏月月份,為0,則無閏月,BIT3-0對應陰歷第1-4月的大小,
  272. 第二字節BIT7-0對應陰歷第5-12月大小,第三字節BIT7表示陰歷第13月大小
  273. 月分對應的位為1,表示農歷月大(30天)為0表示小(29天)
  274. 第三字節BIT6-5表示春節的公歷月份,BIT4-0表示春節公歷日期
  275. */
  276. code unsigned char YearCode[597]=
  277. {
  278.     0x04,0xAe,0x53,    //1901 0
  279.     0x0A,0x57,0x48,    //1902 3
  280.     0x55,0x26,0xBd,    //1903 6
  281.     0x0d,0x26,0x50,    //1904 9
  282.     0x0d,0x95,0x44,    //1905 12
  283.     0x46,0xAA,0xB9,    //1906 15
  284.     0x05,0x6A,0x4d,    //1907 18
  285.     0x09,0xAd,0x42,    //1908 21
  286.     0x24,0xAe,0xB6,    //1909
  287.     0x04,0xAe,0x4A,    //1910
  288.     0x6A,0x4d,0xBe,    //1911
  289.     0x0A,0x4d,0x52,    //1912
  290.     0x0d,0x25,0x46,    //1913
  291.     0x5d,0x52,0xBA,    //1914
  292.     0x0B,0x54,0x4e,    //1915
  293.     0x0d,0x6A,0x43,    //1916
  294.     0x29,0x6d,0x37,    //1917
  295.     0x09,0x5B,0x4B,    //1918
  296. 0x74,0x9B,0xC1,    //1919
  297. 0x04,0x97,0x54,    //1920
  298.     0x0A,0x4B,0x48,    //1921
  299.     0x5B,0x25,0xBC,    //1922
  300.     0x06,0xA5,0x50,    //1923
  301.     0x06,0xd4,0x45,    //1924
  302.     0x4A,0xdA,0xB8,    //1925
  303.     0x02,0xB6,0x4d,    //1926
  304.     0x09,0x57,0x42,    //1927
  305.     0x24,0x97,0xB7,    //1928
  306.     0x04,0x97,0x4A,    //1929
  307.     0x66,0x4B,0x3e,    //1930
  308.     0x0d,0x4A,0x51,    //1931
  309.     0x0e,0xA5,0x46,    //1932
  310.     0x56,0xd4,0xBA,    //1933
  311.     0x05,0xAd,0x4e,    //1934
  312.     0x02,0xB6,0x44,    //1935
  313.     0x39,0x37,0x38,    //1936
  314.     0x09,0x2e,0x4B,    //1937
  315.     0x7C,0x96,0xBf,    //1938
  316.     0x0C,0x95,0x53,    //1939
  317.     0x0d,0x4A,0x48,    //1940
  318.     0x6d,0xA5,0x3B,    //1941
  319.     0x0B,0x55,0x4f,    //1942
  320.     0x05,0x6A,0x45,    //1943
  321.     0x4A,0xAd,0xB9,    //1944
  322.     0x02,0x5d,0x4d,    //1945
  323.     0x09,0x2d,0x42,    //1946
  324.     0x2C,0x95,0xB6,    //1947
  325.     0x0A,0x95,0x4A,    //1948
  326.     0x7B,0x4A,0xBd,    //1949
  327.     0x06,0xCA,0x51,    //1950
  328.     0x0B,0x55,0x46,    //1951
  329.     0x55,0x5A,0xBB,    //1952
  330.     0x04,0xdA,0x4e,    //1953
  331.     0x0A,0x5B,0x43,    //1954
  332.     0x35,0x2B,0xB8,    //1955
  333.     0x05,0x2B,0x4C,    //1956
  334.     0x8A,0x95,0x3f,    //1957
  335.     0x0e,0x95,0x52,    //1958
  336.     0x06,0xAA,0x48,    //1959
  337.     0x7A,0xd5,0x3C,    //1960
  338.     0x0A,0xB5,0x4f,    //1961
  339.     0x04,0xB6,0x45,    //1962
  340.     0x4A,0x57,0x39,    //1963
  341.     0x0A,0x57,0x4d,    //1964
  342.     0x05,0x26,0x42,    //1965
  343.     0x3e,0x93,0x35,    //1966
  344.     0x0d,0x95,0x49,    //1967
  345.     0x75,0xAA,0xBe,    //1968
  346.     0x05,0x6A,0x51,    //1969
  347.     0x09,0x6d,0x46,    //1970
  348.     0x54,0xAe,0xBB,    //1971
  349.     0x04,0xAd,0x4f,    //1972
  350.     0x0A,0x4d,0x43,    //1973
  351.     0x4d,0x26,0xB7,    //1974
  352.     0x0d,0x25,0x4B,    //1975
  353.     0x8d,0x52,0xBf,    //1976
  354.     0x0B,0x54,0x52,    //1977
  355.     0x0B,0x6A,0x47,    //1978
  356.     0x69,0x6d,0x3C,    //1979
  357.     0x09,0x5B,0x50,    //1980
  358.     0x04,0x9B,0x45,    //1981
  359.     0x4A,0x4B,0xB9,    //1982
  360.     0x0A,0x4B,0x4d,    //1983
  361.     0xAB,0x25,0xC2,    //1984
  362.     0x06,0xA5,0x54,    //1985
  363.     0x06,0xd4,0x49,    //1986
  364.     0x6A,0xdA,0x3d,    //1987
  365.     0x0A,0xB6,0x51,    //1988
  366.     0x09,0x37,0x46,    //1989
  367.     0x54,0x97,0xBB,    //1990
  368.     0x04,0x97,0x4f,    //1991
  369.     0x06,0x4B,0x44,    //1992
  370.     0x36,0xA5,0x37,    //1993
  371.     0x0e,0xA5,0x4A,    //1994
  372.     0x86,0xB2,0xBf,    //1995
  373.     0x05,0xAC,0x53,    //1996
  374.     0x0A,0xB6,0x47,    //1997
  375.     0x59,0x36,0xBC,    //1998
  376.     0x09,0x2e,0x50,    //1999 294
  377.     0x0C,0x96,0x45,    //2000 297
  378.     0x4d,0x4A,0xB8,    //2001 300
  379.     0x0d,0x4A,0x4C,    //2002 303
  380.     0x0d,0xA5,0x41,    //2003 306
  381.     0x25,0xAA,0xB6,    //2004 309
  382.     0x05,0x6A,0x49,    //2005 312
  383.     0x7A,0xAd,0xBd,    //2006 315
  384.     0x02,0x5d,0x52,    //2007 318
  385.     0x09,0x2d,0x47,    //2008 321
  386.     0x5C,0x95,0xBA,    //2009 324
  387.     0x0A,0x95,0x4e,    //2010 327
  388.     0x0B,0x4A,0x43,    //2011
  389.     0x4B,0x55,0x37,    //2012
  390.     0x0A,0xd5,0x4A,    //2013
  391.     0x95,0x5A,0xBf,    //2014
  392.     0x04,0xBA,0x53,    //2015
  393.     0x0A,0x5B,0x48,    //2016
  394.     0x65,0x2B,0xBC,    //2017
  395.     0x05,0x2B,0x50,    //2018
  396.     0x0A,0x93,0x45,    //2019
  397.     0x47,0x4A,0xB9,    //2020
  398.     0x06,0xAA,0x4C,    //2021
  399.     0x0A,0xd5,0x41,    //2022
  400.     0x24,0xdA,0xB6,    //2023
  401.     0x04,0xB6,0x4A,    //2024
  402.     0x69,0x57,0x3d,    //2025
  403.     0x0A,0x4e,0x51,    //2026
  404.     0x0d,0x26,0x46,    //2027
  405.     0x5e,0x93,0x3A,    //2028
  406.     0x0d,0x53,0x4d,    //2029
  407.     0x05,0xAA,0x43,    //2030
  408.     0x36,0xB5,0x37,    //2031
  409.     0x09,0x6d,0x4B,    //2032
  410.     0xB4,0xAe,0xBf,    //2033
  411.     0x04,0xAd,0x53,    //2034
  412.     0x0A,0x4d,0x48,    //2035
  413.     0x6d,0x25,0xBC,    //2036
  414.     0x0d,0x25,0x4f,    //2037
  415.     0x0d,0x52,0x44,    //2038
  416.     0x5d,0xAA,0x38,    //2039
  417.     0x0B,0x5A,0x4C,    //2040
  418.     0x05,0x6d,0x41,    //2041
  419.     0x24,0xAd,0xB6,    //2042
  420.     0x04,0x9B,0x4A,    //2043
  421.     0x7A,0x4B,0xBe,    //2044
  422.     0x0A,0x4B,0x51,    //2045
  423.     0x0A,0xA5,0x46,    //2046
  424.     0x5B,0x52,0xBA,    //2047
  425.     0x06,0xd2,0x4e,    //2048
  426.     0x0A,0xdA,0x42,    //2049
  427.     0x35,0x5B,0x37,    //2050
  428.     0x09,0x37,0x4B,    //2051
  429.     0x84,0x97,0xC1,    //2052
  430.     0x04,0x97,0x53,    //2053
  431.     0x06,0x4B,0x48,    //2054
  432.     0x66,0xA5,0x3C,    //2055
  433.     0x0e,0xA5,0x4f,    //2056
  434.     0x06,0xB2,0x44,    //2057
  435.     0x4A,0xB6,0x38,    //2058
  436. 0x0A,0xAe,0x4C,    //2059
  437.     0x09,0x2e,0x42,    //2060
  438.     0x3C,0x97,0x35,    //2061
  439.     0x0C,0x96,0x49,    //2062
  440.     0x7d,0x4A,0xBd,    //2063
  441.     0x0d,0x4A,0x51,    //2064
  442. 0x0d,0xA5,0x45,    //2065
  443.     0x55,0xAA,0xBA,    //2066
  444.     0x05,0x6A,0x4e,    //2067
  445.     0x0A,0x6d,0x43,    //2068
  446.     0x45,0x2e,0xB7,    //2069
  447. 0x05,0x2d,0x4B,    //2070
  448.     0x8A,0x95,0xBf,    //2071
  449.     0x0A,0x95,0x53,    //2072
  450.     0x0B,0x4A,0x47,    //2073
  451.     0x6B,0x55,0x3B,    //2074
  452.     0x0A,0xd5,0x4f,    //2075
  453.     0x05,0x5A,0x45,    //2076
  454.     0x4A,0x5d,0x38,    //2077
  455.     0x0A,0x5B,0x4C,    //2078
  456.     0x05,0x2B,0x42,    //2079
  457.     0x3A,0x93,0xB6,    //2080
  458.     0x06,0x93,0x49,    //2081
  459.     0x77,0x29,0xBd,    //2082
  460.     0x06,0xAA,0x51,    //2083
  461.     0x0A,0xd5,0x46,    //2084
  462.     0x54,0xdA,0xBA,    //2085
  463.     0x04,0xB6,0x4e,    //2086
  464.     0x0A,0x57,0x43,    //2087
  465.     0x45,0x27,0x38,    //2088
  466.     0x0d,0x26,0x4A,    //2089
  467.     0x8e,0x93,0x3e,    //2090
  468.     0x0d,0x52,0x52,    //2091
  469.     0x0d,0xAA,0x47,    //2092
  470.     0x66,0xB5,0x3B,    //2093
  471.     0x05,0x6d,0x4f,    //2094
  472.     0x04,0xAe,0x45,    //2095
  473.     0x4A,0x4e,0xB9,    //2096
  474.     0x0A,0x4d,0x4C,    //2097
  475.     0x0d,0x15,0x41,    //2098
  476.     0x2d,0x92,0xB5,    //2099
  477. };

  478. /******************忙檢測函數***************/
  479. void CheckBusy(void)
  480. {
  481. LCD_RS=0;
  482. LCD_RW=1;
  483. LCD_E=1;
  484. LCD_Data=0xff;
  485. while((LCD_Data&0x80)==0x80);
  486. LCD_E=0;
  487. }

  488. /**********************給LCD寫入數據*****************/
  489. void WriteDataLCD(unsigned char WDLCD)
  490. {
  491.   CheckBusy();               //檢測忙
  492.   LCD_RS = 1;                //RS為高電平,DB7----DB0為數據      
  493.   LCD_RW = 0;                //RW為低電平,E從高電平到低電平,則是把DB7----DB0的數據寫到DR或者IR
  494.   LCD_E = 1;
  495.   LCD_Data = WDLCD;          //傳送數據WDLCD
  496.   Delay(40);
  497.   LCD_E = 0;                 //E從 高電平 到 低電平
  498.   Delay(40);
  499. }

  500. /******************給LCD寫入指令**********************/
  501. void WriteCommandLCD(unsigned char WCLCD) //BuysC為0時忽略忙檢測
  502. {
  503.   CheckBusy();                //檢測忙
  504.   LCD_RS = 0;                 //RS為低,DB7----DB0為指令
  505.   LCD_RW = 0;                 //RW為低,E從高電平到低電平,則是把DB7----DB0的數據寫到DR或者IR
  506.   LCD_E = 1;
  507.   LCD_Data = WCLCD;           //傳送數據
  508.   Delay(40);
  509.   LCD_E = 0;                  //E從 高電平到低電平
  510.      Delay(40);
  511. }

  512. /***************LCD初始化******************/

  513. void LCDInit(void)
  514. {
  515.   WriteCommandLCD(0x30);     //顯示模式設置,開始要求每次檢測忙信號
  516.   WriteCommandLCD(0x01);     //顯示清屏
  517.   WriteCommandLCD(0x06);     // 顯示光標移動設置
  518.   WriteCommandLCD(0x0C);     // 顯示開,無游標,不反白
  519. }

  520. /********************清屏***************************/
  521. void LCDClear(void)
  522. {
  523.   WriteCommandLCD(0x01);     //顯示清屏
  524.   WriteCommandLCD(0x34);     // 顯示光標移動設置
  525.   WriteCommandLCD(0x30);     // 顯示開及光標設置
  526. }

  527. /*****************************************/
  528. void LCDSendWord(unsigned char *p)         //向LCD發送一個字符串,
  529. {
  530. while(*p>0)                            //比如void LCDSendWord('你好');就是讓LCD顯示"你好"
  531. {
  532.   WriteDataLCD(*p);
  533.   p++;
  534. }
  535. }
  536.   
  537. /************寫數據或者指令***************/
  538. void LCDTestWord(bit i,unsigned char word)
  539. {
  540. if(i==0)
  541. {
  542.   WriteCommandLCD(word);             //i=0;則寫入指令
  543. }
  544. else
  545. {
  546.   WriteDataLCD(word);                //i=1;則寫入數據  
  547. }
  548. }

  549. void DisplayYear(void)                 //往LCD上填寫 年 數據
  550. {
  551. year=ReadDs1302(0x8d);            //從1302的0X8D處讀出年數據
  552. LCDTestWord(0,0x81);               //寫指令 0X81  在第一行第二個字符位置顯示 年 數據
  553. LCDTestWord(1,(year/16)+0x30);     //寫數據
  554. LCDTestWord(1,year%16+0x30);       //寫數據
  555. LCDTestWord(0,0x82);                //寫指令  第一行第三個字符位置
  556. LCDSendWord("年");                  //顯示 年  LCD DDRAM第一行地址為80-87,第二行為90-97,第三行為88-8F,第四行為98-9F
  557. DisplayShengXiao();
  558. }

  559. void DisplayMonth(void)                //往LCD上填寫  月 數據
  560. {
  561. month=ReadDs1302(0x89);           //從1302中讀取月份數據
  562. LCDTestWord(0,0x83);               //寫命令
  563. if(month/16!=0)
  564. {
  565.   LCDTestWord(1,(month/16)+0x30);//寫數據
  566. }
  567. else
  568. {
  569.   LCDTestWord(1,0x20);            //寫數據
  570. }
  571. LCDTestWord(1,month%16+0x30);       //寫數據  
  572. LCDTestWord(0,0x84);                //寫指令
  573. LCDSendWord("月");                  //顯示 月
  574. DisplayShengXiao();
  575. }
  576.                            
  577. void DisplayWeek(void)                  //往LCD上填寫  星期  數據
  578. {
  579. week=(ReadDs1302(0x8b))%16;             //從1302中讀取星期數據  
  580. LCDTestWord(0,0x90);
  581. LCDSendWord("星期");
  582. LCDTestWord(0,0x92);
  583. if(week==7)    {LCDSendWord("日");}
  584. if(week==6)    {LCDSendWord("六");}
  585. if(week==5)    {LCDSendWord("五");}
  586. if(week==4)    {LCDSendWord("四");}
  587. if(week==3)    {LCDSendWord("三");}
  588. if(week==2)    {LCDSendWord("二");}
  589. if(week==1)    {LCDSendWord("一");} //顯示星期一到星期日
  590. }   

  591. void DisplayDay(void)                   //往LCD上填寫   日期  數據     
  592. {
  593. day=ReadDs1302(0x87);              //從1302中讀取日期數據
  594. LCDTestWord(0,0x85);
  595. if(day/16!=0)   
  596.   { LCDTestWord(1,(day/16)+0x30); }         
  597. else
  598.      { LCDTestWord(1,0x20);}
  599. LCDTestWord(1,day%16+0x30);
  600. LCDTestWord(0,0x86);
  601. LCDSendWord("日☆");
  602. DisplayShengXiao();
  603. }

  604. void DisplayHour(void)                 //往LCD上填寫  小時數據
  605. {
  606. hour=ReadDs1302(0x85);
  607. LCDTestWord(0,0x88);
  608. LCDTestWord(1,(hour/16)+0x30);
  609. LCDTestWord(1,hour%16+0x30);
  610. }

  611. void DisplayMin(void)                  //往LCD上填寫分鐘 數據   
  612. {
  613. min=ReadDs1302(0x83);
  614. LCDTestWord(0,0x89);
  615. LCDTestWord(1,0x3a);
  616. LCDTestWord(1,(min/16)+0x30);
  617. LCDTestWord(1,min%16+0x30);
  618. LCDTestWord(1,0x3a);
  619. }

  620. void DisplaySec(void)                 //住LCD上填寫  秒鐘   和溫度  數據
  621. {
  622. unsigned char i=0;
  623. unsigned int a=0,b=0,c=0;
  624. sec=ReadDs1302(0x81);
  625. LCDTestWord(0,0x8b);
  626. LCDTestWord(1,(sec/16)+0x30);
  627. LCDTestWord(1,sec%16+0x30);
  628. }
  629. void DisplayTemp(void)
  630. {
  631. unsigned int i;
  632. unsigned char a,b,c;
  633. WriteCommandLCD(0x8c);
  634. LCDTestWord(0,0x8d);
  635. TempChange();
  636. i=GetTemp();
  637. a=i/100;
  638. LCDTestWord(1,a+0x30);
  639. b=i/10-a*10;
  640. LCDTestWord(1,b+0x30);
  641. LCDTestWord(1,0x2e);
  642. c=i-a*100-b*10;
  643. LCDTestWord(1,c+0x30);
  644. LCDSendWord("℃");
  645. }

  646. /***************************寫入操作*********************/
  647. void WriteDs1302Byte(unsigned  char temp)        
  648. {
  649.     unsigned char i;
  650.     for (i=0;i<8;i++)               //循環8次 寫入數據
  651.     {
  652.         DS1302_CLK=0;
  653.         DS1302_IO=temp&0x01;      //每次傳輸低字節
  654.         temp>>=1;                //右移一位
  655.         DS1302_CLK=1;
  656.    }
  657. }  

  658. /***********************************寫入數據*****************************/
  659. void WriteDs1302( unsigned char address,unsigned char dat )     //先寫地址,再寫數據
  660. {
  661.   DS1302_RST=0;
  662. _nop_();
  663.   DS1302_CLK=0;
  664. _nop_();
  665.   DS1302_RST=1;
  666.     _nop_();                    //啟動
  667.   WriteDs1302Byte(address); //發送地址
  668.   WriteDs1302Byte(dat);  //發送數據
  669.   DS1302_RST=0;            //恢復
  670. }

  671. /****************************************************************************/
  672. unsigned char ReadDs1302(unsigned char address)        //先送地址,再讀數據
  673. {
  674.   unsigned char i,temp=0x00;
  675.   DS1302_RST=0;
  676. _nop_();
  677.   DS1302_CLK=0;
  678. _nop_();
  679.   DS1302_RST=1;
  680. _nop_();
  681.   WriteDs1302Byte(address);         //送地址函數
  682.   for (i=0;i<8;i++)               //循環8次 讀取數據
  683.   {
  684.   DS1302_CLK=1;
  685.   _nop_();
  686.    if(DS1302_IO)
  687.    temp|=0x80;               //每次傳輸低字節
  688.   DS1302_CLK=0;
  689.   temp>>=1;               //右移一位
  690. }
  691.   DS1302_RST=0;
  692. _nop_();  
  693. DS1302_CLK=1;
  694. DS1302_IO=0;
  695. return (temp);              //返回
  696. }
  697. /*****************DS1302初始化********************/
  698. void InitDS1302()                        //DS1302中秒,分,時,日期,月份,星期,年的地址分別是0x80,0x82,0x84,0x86,0x88,0x8a,0x8c
  699. {                       /*                 //初始化寫入的時間是2010年4月1日15點整,星期六
  700. WriteDs1302(0x8e,0x00);             //控制命令,WP位為0,允許寫操作  控制位地址是0x8e
  701. DelayMs(5);                           
  702. WriteDs1302(0x8c,0x18);             //寫入年份15年
  703. DelayMs(5);
  704. WriteDs1302(0x8a,0x04);             //寫入星期7
  705. DelayMs(5);
  706. WriteDs1302(0x88,0x05);             //定入月分 8月
  707. DelayMs(5);
  708. WriteDs1302(0x86,0x31);             //寫入日期 10日
  709. DelayMs(5);
  710. WriteDs1302(0x84,0x05);             //寫入小時 0點
  711. DelayMs(5);
  712. WriteDs1302(0x82,0x09);             //寫入分鐘 38分
  713. DelayMs(5);
  714. WriteDs1302(0x80,0x12);              //寫入秒  40秒
  715. DelayMs(5);                         */         
  716. WriteDs1302(0x8e,0x80);              //控制命令,WP為1,禁止寫操作
  717. }

  718. /*************************************************************************/

  719. void delayb(unsigned int count)   //delay
  720. {
  721.     unsigned char i;
  722.     while(count)
  723.     {
  724.        i=200;
  725.        while(i>0)
  726.        i--;
  727.        count--;
  728.     }
  729. }

  730. void DS18B20Init(void)          //DS18B20初始化
  731. {
  732. unsigned int i;               
  733. DS18B20=0;
  734. i=103*8;
  735. while(i>0)i--;
  736. DS18B20=1;
  737. i=103;
  738. while(i>0)i--;
  739. }

  740. bit TempReadBit(void)          // 讀一位
  741. {
  742. unsigned int i;
  743.     bit dat;
  744.     DS18B20=0;i++;             //小延時一下
  745.     DS18B20=1;i++;i++;
  746.     dat=DS18B20;
  747.     i=32;while(i>0)i--;
  748.     return (dat);
  749. }

  750. unsigned char TempRead(void)   //讀一個字節
  751. {
  752. unsigned char i,j,dat;
  753.     dat=0;
  754.     for(i=1;i<=8;i++)
  755.     {
  756.      j=TempReadBit();
  757.      dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里
  758.     }
  759.     return(dat);             //將一個字節數據返回
  760. }

  761. void TempWriteByte(unsigned char dat)  
  762. {                           //寫一個字節到DS18B20里
  763. unsigned int i;
  764.     unsigned char j;
  765.     bit testb;
  766.     for(j=1;j<=8;j++)
  767.     {
  768.      testb=dat&0x01;
  769.      dat=dat>>1;
  770.      if(testb)          // 寫1部分
  771.      {
  772.          DS18B20=0;
  773.          i++;i++;
  774.          DS18B20=1;
  775.          i=32;while(i>0)i--;
  776.         }
  777.      else
  778.      {
  779.          DS18B20=0;       //寫0部分
  780.          i=32;while(i>0)i--;
  781.          DS18B20=1;
  782.          i++;i++;
  783.         }
  784.     }
  785. }

  786. void TempChange(void)  //發送溫度轉換命令
  787. {
  788. DS18B20Init();             //初始化DS18B20
  789.     delayb(8);             //延時
  790.     TempWriteByte(0xcc);  // 跳過序列號命令
  791.     TempWriteByte(0x44);  //發送溫度轉換命令
  792. }

  793. int GetTemp()               //獲得溫度
  794. {
  795. float tt;
  796.     unsigned char a,b;
  797.     DS18B20Init();
  798.     delayb(1);
  799.     TempWriteByte(0xcc);  
  800.     TempWriteByte(0xbe);    //發送讀取數據命令
  801.     a=TempRead();           //連續讀兩個字節數據
  802.     b=TempRead();
  803.     temp=b;
  804.     temp<<=8;            
  805.     temp=temp|a;            //兩字節合成一個整型變量。
  806.     tt=temp*0.0625;         //得到真實十進制溫度值,因為DS18B20 可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度。                     
  807.     temp=tt*10+0.5;         //放大十倍,這樣做的目的將小數點后第一位 也轉換為可顯示數字,同時進行一個四舍五入操作。                          
  808.     return temp;            //返回溫度值
  809. }

  810. code unsigned char DayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  811. code unsigned int DayCode2[3]={0x111,0x130,0x14e};                           
  812. //計算公歷日離當年元旦的天數,為了減少運算,用了兩個表   DayCode1[9],DayCode2[3]
  813. //如果公歷月在九月或前,天數會少于0xff,用表DayCode1[9],在九月后,天數大于0xff,用表DayCode2[3]
  814. //如輸入公歷日為8月10日,則公歷日離元旦天數為DayCode1[8-1]+10-1,如輸入公歷日為11月10日,則公歷日離元旦天數為DayCode2[11-10]+10-1
  815. /*讀取數據表中農歷月的大月或小月,如果該月為大返回1,為小返回0*/
  816. bit GetMoonDay(unsigned char LunarMonth,unsigned int TableAddr)
  817. {
  818. unsigned char temp;
  819.     switch (LunarMonth)                       //LunarMonth指向農歷月份
  820. {
  821.         case 1:
  822.   {
  823.    temp=YearCode[TableAddr]&0x08;    //1月,對應年份表里第一字節的BIT3位,如果是1,則月大,如果是0,則月小
  824.             if (temp==0) return(0);        //為0,月小  
  825.    else  return(1);                //為1,月大
  826.   }
  827.         case 2:
  828.   {
  829.    temp=YearCode[TableAddr]&0x04;    //2月,對應年份表里第一字節的BIT2位,如果是1,則月大,如果是0,則月小
  830.             if (temp==0) return(0);        //為0,月小
  831.    else  return(1);                //為1,月大
  832.   }
  833.         case 3:
  834.   {
  835.    temp=YearCode[TableAddr]&0x02;    //3月,對應第一字節的BIT1位,如果是1,則月大,如果是0,則月小
  836.             if (temp==0) return(0);        //為0,月小
  837.    else  return(1);                //為1,月大
  838.   }
  839.         case 4:
  840.   {
  841.    temp=YearCode[TableAddr]&0x01;    //1月,對應第一字節的BIT0位,如果是1,則月大,如果是0,則月小
  842.             if (temp==0) return(0);
  843.    else return(1);
  844.   }
  845.         case 5:
  846.   {
  847.    temp=YearCode[TableAddr+1]&0x80;  //5月,對應第二字節的BIT7位,如果是1,則月大,如果是0,則月小
  848.             if (temp==0)  return(0);
  849.    else  return(1);
  850.   }
  851.         case 6:
  852.   {
  853.    temp=YearCode[TableAddr+1]&0x40;  //6月,對應第二字節的BIT6位,如果是1,則月大,如果是0,則月小
  854.             if (temp==0) return(0);
  855.    else  return(1);
  856.   }
  857.         case 7:
  858.   {
  859.    temp=YearCode[TableAddr+1]&0x20;  //7月,對應第二字節的BIT5位,如果是1,則月大,如果是0,則月小
  860.             if (temp==0) return(0);
  861.    else  return(1);
  862.   }
  863.         case 8:
  864.   {
  865.    temp=YearCode[TableAddr+1]&0x10;  //8月,對應第二字節的BIT4位,如果是1,則月大,如果是0,則月小
  866.             if (temp==0) return(0);
  867.    else  return(1);
  868.   }
  869.         case 9:
  870.   {
  871.    temp=YearCode[TableAddr+1]&0x08;  //9月,對應第二字節的BIT3位,如果是1,則月大,如果是0,則月小
  872.             if (temp==0) return(0);
  873.    else  return(1);
  874.   }
  875.         case 10:
  876.   {
  877.    temp=YearCode[TableAddr+1]&0x04;  //10月,對應第二字節的BIT2位,如果是1,則月大,如果是0,則月小
  878.             if (temp==0) return(0);
  879.    else  return(1);
  880.   }
  881.         case 11:
  882.   {
  883.    temp=YearCode[TableAddr+1]&0x02;  //11月,對應第二字節的BIT1位,如果是1,則月大,如果是0,則月小
  884.             if (temp==0) return(0);
  885.    else  return(1);
  886.   }
  887.         case 12:
  888.   {
  889.    temp=YearCode[TableAddr+1]&0x01;  //12月,對應第二字節的BIT0位,如果是1,則月大,如果是0,則月小
  890.             if (temp==0) return(0);
  891.    else  return(1);
  892.   }
  893.         case 13:
  894.   {
  895.    temp=YearCode[TableAddr+2]&0x80;  //13月,對應第三字節的BIT7位,如果是1,則月大,如果是0,則月小
  896.             if (temp==0) return(0);
  897.    else  return(1);
  898.   }
  899.     }
  900.         return        0xff;
  901. }

  902. void Conversion(bit cenbit,unsigned char year,unsigned char month,unsigned char day)
  903.                              //cenbit=0為21世紀,cenbit=1為20世紀,輸入輸出數據均為BCD數據
  904. {                        
  905.     unsigned char temp1,temp2,temp3,MonthP;//temp3,temp4分別表示春節距元旦的天數,公歷日離元旦的天數
  906.     unsigned int temp4,TableAddr;
  907.     bit flag2,flag_y;
  908.     temp1=year/16;           //BCD->hex 先把數據轉換為十六進制  高位
  909.     temp2=year%16;           //低位
  910.     year=temp1*10+temp2;     //把 年 數據 轉換成16進制
  911.     temp1=month/16;          //月份 高位
  912.     temp2=month%16;          //月份 低位
  913.     month=temp1*10+temp2;    //把 月 數據 轉換成16進制
  914.     temp1=day/16;            //日期 高位
  915.     temp2=day%16;            //日期 低位
  916.     day=temp1*10+temp2;      //把 日 數據 轉換成16進制
  917.     if(cenbit==0)                           //如果是21世紀
  918. {                  
  919.         TableAddr=(year+0x64-1)*0x03;       //定位數據表地址  year對應的年份表中的地址是(year+99)*3 如2010年 其地址是327
  920.   LCDTestWord(0,0x80);
  921.   LCDSendWord("20");
  922.     }
  923.     else                                    //如果是20世紀
  924. {
  925.         TableAddr=(year-1)*0x03;            //定位數據表地址  year對應的年份表中的地址是(year-1)*3  如1901年 其地址是3
  926.   LCDTestWord(0,0x80);
  927.   LCDSendWord("19");
  928.     }
  929.     temp1=YearCode[TableAddr+2]&0x60;       //取當年春節所在的公歷月份   年份表中第三字節BIT6-5表示春節的公歷月份
  930.     temp1=_cror_(temp1,5);                  //循環右移5位,得到 春節所在的公歷月份
  931.     temp2=YearCode[TableAddr+2]&0x1f;       //取當年春節所在的公歷日    年份表中第三字節BIT4-0表示當年春節所在的公歷日
  932.     if(temp1==0x01)                         // 計算當年春年離當年元旦的天數,春節只會在公歷1月或2月   
  933.         temp3=temp2-1;                      //假如春節在公歷1月,則元旦離春節的天數為  temp2-1 天
  934.     else
  935.         temp3=temp2+0x1f-1;                 //假如春節在公歷2月,則無理離春節的天數為  temp2+0x1f-1 天
  936.     if (month<10)
  937.         temp4=DayCode1[month-1]+day-1;      //0到8月某日距元旦的天數
  938.     else
  939.         temp4=DayCode2[month-10]+day-1;     //9月開始的某一天距元旦的天數
  940.     if ((month>0x02)&&(year%0x04==0))       //如果公歷月大于2月并且該年的2月為閏月,天數加1
  941.         temp4+=1;
  942.                                          //計算機出公歷日距元旦的天數和春節距元旦的天數,則是為了比較公歷日是在春節前還是春節后
  943.                                          //如果temp3>temp4  則 公歷日在春節之前
  944.     if (temp4>=temp3)                       //公歷日在春節后或就是春節當日使用下面代碼進行運算
  945. {   
  946.         temp4-=temp3;                       //公歷日離春節的天數  因為公歷日在春節后  所以為temp4-temp3
  947.         month=0x01;
  948.         MonthP=0x01;                        //LunarMonth為月份指向,公歷日在春節前或就是春節當日LunarMonth指向首月
  949.         flag2=GetMoonDay(MonthP,TableAddr); //檢查該農歷月為大小還是小月,大月返回1,小月返回0
  950.         flag_y=0;
  951.         if(flag2==0)                            //GetMoonDay()函數返回的是0
  952.    {temp1=0x1d;}                       //小月29天
  953.         else                                    //GetMoonDay()函數返回的是1
  954.    {temp1=0x1e;}                       //大月30天
  955.         temp2=YearCode[TableAddr]&0xf0;         //年份數據表中第1字節BIT7-4為閏月,為0則這年無閏月,如為1,表示有閏月
  956.         temp2=_cror_(temp2,4);                  //從數據表中取該年的閏月月份,如為0,則該年無閏月  BIT3-0表示陰歷1到4月的大小 1為大 0 為小
  957.         while(temp4>=temp1)
  958.   {
  959.             temp4-=temp1;
  960.             MonthP+=1;
  961.             if(month==temp2)
  962.    {
  963.              flag_y=~flag_y;
  964.              if(flag_y==0)  {month+=1;}
  965.             }
  966.             else
  967.       {
  968.     month+=1;
  969.    }
  970.             flag2=GetMoonDay(MonthP,TableAddr);
  971.             if(flag2==0)
  972.    {
  973.     temp1=0x1d;
  974.    }
  975.             else
  976.    {
  977.     temp1=0x1e;
  978.    }
  979.         }
  980.         day=temp4+1;
  981.     }
  982.     else
  983. {  //公歷日在春節前使用下面代碼進行運算
  984.         temp3-=temp4;                          //公歷日離春節的天數  因為公歷日在春節前  所以為temp3-temp4
  985.         if (year==0x00){year=0x63;cenbit=1;}
  986.         else year-=1;
  987.         TableAddr-=0x03;
  988.         month=0x0c;
  989.         temp2=YearCode[TableAddr]&0xf0;    //格式第一字節BIT7-4位表示閏月月份,為0,則無閏月,BIT3-0對應陰歷第1-4月的大小,
  990.         temp2=_cror_(temp2,4);
  991.         if (temp2==0)MonthP=0x0c;
  992.         else MonthP=0x0d; //
  993.         /* MonthP為月份指向,如果當年有閏月,一年有十三個月,月指向13,無閏月指向12*/
  994.         flag_y=0;
  995.         flag2=GetMoonDay(MonthP,TableAddr);
  996.         if(flag2==0)temp1=0x1d;
  997.         else temp1=0x1e;
  998.         while(temp3>temp1)
  999.   {
  1000.             temp3-=temp1;
  1001.             MonthP-=1;
  1002.             if(flag_y==0)month-=1;
  1003.             if(month==temp2)flag_y=~flag_y;
  1004.             flag2=GetMoonDay(MonthP,TableAddr);
  1005.             if(flag2==0)temp1=0x1d;
  1006.             else temp1=0x1e;
  1007.          }
  1008.         day=temp1-temp3+1;
  1009.     }
  1010.     c_moon=cenbit;               
  1011.     temp1=year/10;
  1012.     temp1=_crol_(temp1,4);
  1013.     temp2=year%10;
  1014.     LunarYear=temp1|temp2;

  1015.     temp1=month/10;
  1016.     temp1=_crol_(temp1,4);
  1017.     temp2=month%10;
  1018.     LunarMonth=temp1|temp2;

  1019.     temp1=day/10;
  1020.     temp1=_crol_(temp1,4);
  1021.     temp2=day%10;
  1022.     LunarDay=temp1|temp2;
  1023. }

  1024. void DisplayShengXiao(void)
  1025. {
  1026. unsigned char LunarYearD,ReYear;        //農歷年份的十進制數  和取模后的余數
  1027. if(cen==0x19)  {cenbit=1;}
  1028. if(cen==0x20)  {cenbit=0;}
  1029.   Conversion(cenbit,year,month,day);       //將公歷日期轉換成農歷
  1030. LCDTestWord(0,0x94);                     //顯示在LCD的0X94位置上
  1031. LCDTestWord(1,LunarYear/16+0x30);        //農歷年十位
  1032.   LCDTestWord(1,LunarYear%16+0x30);        //農歷年個位
  1033.   LCDTestWord(1,'-');                      //用-隔開
  1034.   LCDTestWord(1,LunarMonth/16+0x30);       //農歷月十位
  1035.   LCDTestWord(1,LunarMonth%16+0x30);       //農歷月個位  
  1036.   LCDTestWord(1,'-');
  1037.   LCDTestWord(1,LunarDay/16+0x30);         //農歷日十位
  1038.   LCDTestWord(1,LunarDay%16+0x30);         //農歷日個位
  1039.   LunarYearD=(LunarYear/16)*10+LunarYear%16;        //農歷年轉換成10進制數
  1040.   ReYear=LunarYearD%12;                             //農歷年模12,取余運算
  1041.   switch(ReYear)
  1042.   {
  1043.   case 0: LCDTestWord(0,0x9D);LCDSendWord("★龍年");break;   //余0即整除 農歷 龍年
  1044.   case 1: LCDTestWord(0,0x9D);LCDSendWord("★蛇年");break;   //蛇年
  1045.   case 2: LCDTestWord(0,0x9D);LCDSendWord("★馬年");break;
  1046.   case 3: LCDTestWord(0,0x9D);LCDSendWord("★羊年");break;
  1047.   case 4: LCDTestWord(0,0x9D);LCDSendWord("★猴年");break;
  1048.   case 5: LCDTestWord(0,0x9D);LCDSendWord("★雞年");break;
  1049.   case 6: LCDTestWord(0,0x9D);LCDSendWord("★狗年");break;
  1050.   case 7: LCDTestWord(0,0x9D);LCDSendWord("★豬年");break;
  1051.   case 8: LCDTestWord(0,0x9D);LCDSendWord("★鼠年");break;
  1052.   case 9: LCDTestWord(0,0x9D);LCDSendWord("★牛年");break;
  1053.   case 10:LCDTestWord(0,0x9D);LCDSendWord("★虎年");break;
  1054.   case 11:LCDTestWord(0,0x9D);LCDSendWord("★兔年");break;
  1055. }
  1056. }
  1057. /***************節假日提示********************/

  1058. void Holidays(void)
  1059. {
  1060. LCDTestWord(0,0x98);

  1061.      if(LunarMonth==0x01 && LunarDay==0x01)       {LCDSendWord("春節快樂!");}
  1062. else if(LunarMonth==0x01 && LunarDay==0x15)       {LCDSendWord("元宵節快樂");}
  1063. else if(LunarMonth==0x02 && LunarDay==0x26)       {LCDSendWord("俺村過會了");}
  1064. else if(LunarMonth==0x04 && LunarDay==0x01)       {LCDSendWord("小蛋蛋生日");}
  1065. else if(LunarMonth==0x05 && LunarDay==0x05)       {LCDSendWord("端午節快樂");}
  1066. else if(LunarMonth==0x05 && LunarDay==0x12)       {LCDSendWord("張宇鵬生日");}
  1067. else if(LunarMonth==0x07 && LunarDay==0x07)       {LCDSendWord("中國情人節");}
  1068. else if(LunarMonth==0x08 && LunarDay==0x15)       {LCDSendWord("中秋節快樂");}
  1069. else if(LunarMonth==0x09 && LunarDay==0x01)       {LCDSendWord("自信就成功");}
  1070. else if(LunarMonth==0x09 && LunarDay==0x09)       {LCDSendWord("今天重陽節");}
  1071. else if(LunarMonth==0x10 && LunarDay==0x01)       {LCDSendWord("今天要祭祖");}
  1072. else if(LunarMonth==0x12 && LunarDay==0x08)       {LCDSendWord("今天臘八節");}
  1073. else if(LunarMonth==0x12 && LunarDay==0x15)       {LCDSendWord("過小年啦!");}
  1074. else if(LunarMonth==0x12 && LunarDay==0x29)       {LCDSendWord("臘月二十九");}
  1075. else if(LunarMonth==0x12 && LunarDay==0x30)       {LCDSendWord("除夕夜到了");}   
  1076. //以上是農歷節日,以下是公歷節日
  1077. else if(month==0x01 && day==0x01)  {LCDSendWord("元旦節快樂");}   
  1078. else if(month==0x02 && day==0x02)  {LCDSendWord("世界濕地日");}
  1079. else if(month==0x02 && day==0x10)  {LCDSendWord("世界氣象日");}
  1080. else if(month==0x03 && day==0x08)  {LCDSendWord("國際婦女節");}
  1081. else if(month==0x03 && day==0x12)  {LCDSendWord("中國植樹節");}
  1082. else if(month==0x03 && day==0x15)  {LCDSendWord("消費者權益");}
  1083. else if(month==0x03 && day==0x22)  {LCDSendWord("世界水日了");}     
  1084. else if(month==0x04 && day==0x01)  {LCDSendWord("愚人節快樂");}
  1085. else if(month==0x04 && day==0x05)  {LCDSendWord("中國清明節");}
  1086. else if(month==0x04 && day==0x22)  {LCDSendWord("世界地球日");}
  1087. else if(month==0x05 && day==0x01)  {LCDSendWord("國際勞動節");}
  1088. else if(month==0x05 && day==0x04)  {LCDSendWord("中國青年節");}
  1089. else if(month==0x05 && day==0x12)  {LCDSendWord("世界護士節");}
  1090. else if(month==0x06 && day==0x01)  {LCDSendWord("國際兒童節");}
  1091. else if(month==0x06 && day==0x05)  {LCDSendWord("世界環境日");}
  1092. else if(month==0x06 && day==0x06)  {LCDSendWord("國際愛眼日");}
  1093. else if(month==0x06 && day==0x25)  {LCDSendWord("世界土地日");}
  1094. else if(month==0x06 && day==0x26)  {LCDSendWord("國際禁毒日");}   
  1095. else if(month==0x07 && day==0x01)  {LCDSendWord("香港回歸日");}   
  1096. else if(month==0x08 && day==0x01)  {LCDSendWord("中國建軍節");}
  1097. else if(month==0x09 && day==0x10)  {LCDSendWord("中國教師節");}
  1098. else if(month==0x09 && day==0x18)  {LCDSendWord("九一八事變");}
  1099. else if(month==0x10 && day==0x01)  {LCDSendWord("今日國慶節");}
  1100. else if(month==0x10 && day==0x04)  {LCDSendWord("世界動物日");}
  1101. else if(month==0x10 && day==0x09)  {LCDSendWord("世界郵政日");}
  1102. else if(month==0x10 && day==0x10)  {LCDSendWord("辛亥革命日");}  
  1103. else if(month==0x12 && day==0x20)  {LCDSendWord("澳門回歸日");}
  1104. else if(month==0x12 && day==0x24)  {LCDSendWord("美好的回憶");}
  1105. else if(month==0x12 && day==0x25)  {LCDSendWord("++圣誕節++");}
  1106.    else    LCDSendWord("努力賺錢");  


  1107. /*                else    if (hour==0x04 && min==0x25)    {LCDSendWord("現在是凌晨"); }
  1108.                 else        if (hour>= 0x06 && min<  0x08 ){LCDSendWord("現在是早晨"); }
  1109.                 else        if (hour>= 0x08 && min<  0x12 ){LCDSendWord("現在是上午"); }
  1110.                 else        if (hour== 0x12 )              {LCDSendWord("現在是中午"); }
  1111.                 else        if (hour>= 0x13 && min<  0x18 ){LCDSendWord("現在是下午"); }
  1112.                 else        if (hour>= 0x18 && min<  0x22 ){LCDSendWord("現在是晚上"); }
  1113.                 else        if (hour>= 0x22 && min<= 0x23 ){LCDSendWord("☆現在是夜里"); }
  1114.                 else        if (hour>= 0x00 && min<  0x04 ){LCDSendWord("現在已深夜"); }        */
  1115.                         }        

  1116.   
  1117. void UpDate(void)
  1118. {
  1119. DisplayYear();     //顯示年
  1120. DisplayMonth();    //顯示月
  1121. DisplayDay();    //顯示日
  1122. DisplayWeek();    //顯示星期
  1123. DisplayHour();    //顯示時
  1124. DisplayMin();    //顯示分
  1125. DisplaySec();    //顯示秒
  1126. DisplayShengXiao();
  1127. }

  1128. void SetTime(unsigned char count)
  1129. {
  1130. unsigned char address,item;
  1131. unsigned char max,mini;
  1132. LCDTestWord(0,0x98);
  1133. LCDSendWord("調整");
  1134. if(count==6)  {LCDSendWord("秒鐘      ");address=0x81; max=59;mini=0;}
  1135. if(count==5)  {LCDSendWord("分鐘      ");address=0x83; max=59;mini=0;}
  1136. if(count==4)  {LCDSendWord("小時      ");address=0x85; max=23;mini=0;}
  1137. if(count==3)  {LCDSendWord("星期      ");address=0x8b; max=7;mini=1;}
  1138. if(count==2)  {LCDSendWord("日期      ");address=0x87; max=31; mini=1;}
  1139. if(count==1)  {LCDSendWord("月份      ");address=0x89; max=12;mini=1;}
  1140. if(count==0)  {LCDSendWord("年份      ");address=0x8d; max=99;mini=0;}
  1141. item=ReadDs1302(address);//讀取DS1302某地址上的數值賦給item  
  1142. item=(item/16)*10+item%16;
  1143. if(PlusKey==0)       //PlusKey-加
  1144.   item++;          //數加 1
  1145. if(ReduceKey==0)     //ReduceKey-減
  1146.   item--;          //數減 1
  1147. if(item>max)
  1148.   item=mini;       //查看數值有效范圍  
  1149. if(item<mini)
  1150.   item=max;
  1151. WriteDs1302(0x8e,0x00);
  1152. item=(item/10)*16+item%10;
  1153. WriteDs1302(address-1,item); //將調整好的item值寫入DS1302
  1154.     UpDate();
  1155. }

  1156. void Key(void)
  1157. {

  1158. if (SetKey==0)           // 設置時間
  1159. {
  1160.     DelayMs(80);         //按鍵消抖   
  1161.   if(SetKey==0&&w==1)  //當是正常狀態時就進入調時狀態
  1162.   {
  1163.    w=1;          //進入調時   
  1164.    SetTime(next);   //調整   
  1165.   }
  1166.   if(SetKey==0&&w==1)  //當是調時狀態 本鍵用于調整下一項
  1167.   {
  1168.    next++;
  1169.    if(next>=7)   {next= 0;}
  1170.    SetTime(next);   //調整   
  1171.   }
  1172.      while(SetKey==0);    //等待鍵松開
  1173. }
  1174. if(SureKey==0)           // 當在調時狀態時就退出調時
  1175.     {
  1176.   DelayMs(80);         //按鍵消抖
  1177.   if(SureKey==0&&w==1)
  1178.   {
  1179.    w=0;next=0;
  1180.    Holidays();
  1181.   }
  1182.   while(SureKey==0);   //等待鍵松開
  1183. }
  1184. if (PlusKey==0)          //加調整
  1185. {
  1186.      DelayMs(80);         //按鍵消抖
  1187.      if(PlusKey==0&&w==1)
  1188.   {   
  1189.    SetTime(next);   //調整
  1190.   }
  1191.   while(PlusKey==0);       //等待鍵松開
  1192. }

  1193. if (ReduceKey==0)        //減調整
  1194. {        
  1195.      DelayMs(80);         //按鍵消抖
  1196.      if(ReduceKey==0&&w==1)
  1197.   {   
  1198.    SetTime(next);   //調整
  1199.   }  
  1200.   while(ReduceKey==0);     //等待鍵松開
  1201. }  
  1202. }

  1203. void DelayMs(unsigned int a)        //延時 1MS/次
  1204. {
  1205. unsigned char i;
  1206. while(--a!=0)
  1207. {
  1208.   for(i=0;i<125;i++)
  1209.   ;
  1210. }
  1211. }

  1212. void Delay(unsigned char num)               
  1213. {
  1214. while(num--)
  1215. ;
  1216. }

  1217. void main()
  1218. {
  1219.         P4SW = 0xff; //啟動P4接口
  1220.         P4M0 = 0xff;   //接口設置為強推
  1221. SureKey=1;
  1222. PlusKey=1;
  1223. ReduceKey=1;
  1224. // PSB=1;
  1225. next=0;
  1226. LCDInit();
  1227. LCDClear();
  1228. InitDS1302();
  1229. InitialSound();
  1230. while(1)                        
  1231. {
  1232.   DisplayYear();     //顯示年
  1233.   DisplayMonth();    //顯示月
  1234.   DisplayDay();    //顯示日
  1235.   DisplayWeek();    //顯示星期
  1236.   DisplayHour();    //顯示時
  1237.   DisplayMin();    //顯示分
  1238.   DisplaySec();    //顯示秒
  1239.   Holidays();        //顯示節日
  1240.   DisplayTemp();     //顯示溫度  
  1241.   Key();
  1242.   if(min==0&&sec==0)
  1243.   {
  1244.    if(LunarMonth==9&&LunarDay==1)
  1245.    {
  1246.    PlayMusic(HappyBirthday,0,3,300);
  1247.    }
  1248.    else
  1249.    {
  1250.     SpeakerDiDi();
  1251.    }
  1252.   }
  1253. }
  1254. }
復制代碼


回復

使用道具 舉報

ID:329253 發表于 2018-6-10 17:02 來自手機 | 顯示全部樓層
你這代碼太長了,應該把他刪減一下,再發出來
回復

使用道具 舉報

ID:349102 發表于 2018-6-10 23:17 來自手機 | 顯示全部樓層
等我先看完程序先
回復

使用道具 舉報

ID:330198 發表于 2018-6-11 12:59 | 顯示全部樓層
360截圖20180611125241835.jpg
你晶振頻率改沒改啊
回復

使用道具 舉報

ID:61140 發表于 2018-6-12 20:07 | 顯示全部樓層
zhanghyg 發表于 2018-6-11 12:59
你晶振頻率改沒改啊

這個改不改無所謂,反正我也不聽歌,走時精確就行了,現在主要是按鍵不起作用,求教大神了
回復

使用道具 舉報

ID:61140 發表于 2018-6-15 12:10 | 顯示全部樓層
有沒有大神幫我看一下啊,只是按鍵部分只要能管用就行了,
回復

使用道具 舉報

ID:61140 發表于 2019-1-7 18:42 | 顯示全部樓層

有沒有大神幫我看一下啊,只是按鍵部分只要能管用就行了,
回復

使用道具 舉報

ID:280876 發表于 2019-1-8 10:14 | 顯示全部樓層
太長了,沒時間看
回復

使用道具 舉報

ID:453974 發表于 2019-1-8 12:33 | 顯示全部樓層
按鍵延時檢測有點長,你把它減小一點然后再看看
回復

使用道具 舉報

ID:386762 發表于 2019-1-8 17:09 | 顯示全部樓層
先看看按鍵檢測電路是否有效,在看看按鍵消抖的時間是否太差導致檢測不到(可以試試長按按鍵試試是否按鍵有效)
回復

使用道具 舉報

ID:61140 發表于 2019-5-26 16:16 | 顯示全部樓層
皮條01 發表于 2018-6-10 23:17
等我先看完程序先

大神幫我一下可以么
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产黑丝在线 | 欧美视频免费 | 国产一级一级 | 久久看看 | 国产美女精品 | 欧美日韩国产在线 | 欧美另类视频 | 青春草91 | 亚洲一区二区三区在线免费 | 日韩精品在线免费观看 | 成人久久| 国产欧美一区二区在线观看 | 亚洲人成人一区二区在线观看 | 国产免费观看视频 | 国产精品高潮呻吟久久av黑人 | 99re6在线视频精品免费 | av中文字幕在线播放 | 日韩欧美亚洲 | av午夜电影 | 久久久久久亚洲精品不卡 | 午夜三区 | 亚洲3p| 亚洲欧美日韩在线不卡 | 羞羞视频在线观看免费观看 | 国产精品国产三级国产a | 精品一区二区在线观看 | 国产成人精品久久二区二区91 | 天天爽一爽 | 在线免费国产视频 | 国产区在线视频 | 成人久久久久久久久 | 九九久久精品 | 99视频精品| 中文成人无字幕乱码精品 | 欧美a区 | 亚洲精品99久久久久久 | 日韩一区二区在线视频 | 欧洲毛片| 国产精品视频网 | 北条麻妃视频在线观看 | 美女黄网|