|

- #include<reg52.h>
- #include<intrins.h>
- #define SoundSpace 3/4
- unsigned char sec,min,hour,day,month,year,year1,cen,week; //秒,分,小時,公歷日期,月份,年份,世紀(jì),星期
- unsigned char LunarMonth,LunarDay,LunarYear; //陰歷日期,月份,年份
- bit c_moon; //大小月標(biāo)志位
- bit cenbit=0; //世紀(jì)標(biāo)志,為1,則表示20世紀(jì),為0,則表示21世紀(jì)
- bit w; //調(diào)時狀態(tài)標(biāo)志位
- unsigned char next;
- /**********定義LCD12864的數(shù)據(jù)線和相關(guān)函數(shù)*************/
- sbit LCD_RS=P2^6; //模式位,低電平輸入指令,高電平輸入數(shù)據(jù)
- sbit LCD_RW=P2^5; //讀寫位,低電平讀,高電平寫
- sbit LCD_E=P2^7; //LCD12864使能位,低電平無效,高電平使能
- sbit PSB=P3^2;
- #define Busy 0x80
- #define LCD_Data P0 //LCD12864的8位數(shù)據(jù)總線,單片機的P0端口
- void WriteDataLCD(unsigned char WDLCD); //給LCD12864寫數(shù)據(jù)
- void WriteCommandLCD(unsigned char WCLCD); //給LCD12864寫指令
- void LCDInit(void); //LCD12864初始化
- void LCDClear(void); //LCD12864清屏
- void CheckBusy(void); //忙檢測
- void LCDSendWord(unsigned char *p); //向LCD發(fā)送一個字符串
- void LCDTestWord(bit i,unsigned char word);
- void DisplaySec(void); //在LCD上顯示秒鐘
- void DisplayMin(void); //在LCD上顯示分鐘
- void DisplayHour(void); //在LCD上顯示小時
- void DisplayDay(void); //在LCD上顯示日期
- void DisplayYear(void); //在LCD上顯示年份
- void DisplayMonth(void); //在LCD上顯示月份
- void DisplayWeek(void); //在LCD上顯示星期
- void Holidays(void); //在LCD上顯示節(jié)日
- /*********定義時間芯片DS1302的數(shù)據(jù)線及相關(guān)函數(shù)***********/
- sbit DS1302_CLK=P3^6; //DS1302的時鐘信號線
- sbit DS1302_IO=P3^0; //DS1302的數(shù)據(jù)端口線
- sbit DS1302_RST=P3^5; //DS1302的片選信號線
- void WriteDs1302byte(unsigned char temp); //給DS1302寫一個字節(jié)
- void WriteDs1302(unsigned char address,unsigned char dat); //給DS1302寫入時間,先確定地址,再確定要寫入的數(shù)據(jù)
- unsigned char ReadDs1302(unsigned char address); //讀取DS1302的數(shù)據(jù)
- void InitDS1302();
- /**********定義溫度傳感器DS18B20的數(shù)據(jù)線和相關(guān)函數(shù)*************/
- sbit DS18B20=P3^7; //DS18B20的數(shù)據(jù)線
- int temp;
- void DS18B20Init(void); //DS18B20初始化函數(shù)
- int GetTemp(void);
- void TempWriteByte(unsigned char dat);
- unsigned char TempRead(void);
- bit TempReadBit(void);
- void delayb(unsigned int count);
- void TempChange(void);
- void Conversion(bit cen_m,unsigned char year,unsigned char month,unsigned char day);
- bit GetMoonDay(unsigned char month_p,unsigned int TableAddr);
- void DisplayShengXiao(void);
- void DelayMs(unsigned int a);
- void Delay(unsigned char num);
- /**********定義開關(guān)按鍵,及蜂鳴器的數(shù)據(jù)線************/
- sbit SetKey=P1^0; //按鍵功能:設(shè)置
- sbit SureKey=P1^1; //按鍵功能:確認(rèn)
- sbit PlusKey=P1^2; //按鍵功能:加
- sbit ReduceKey=P1^3; //按鍵功能:減
- void Key(void);
- #define Fosc 12000000 //定義晶振頻率12000000HZ
- #define jiepai 3/4 //定義普通音符演奏的長度分率,//每4分音符間隔
- sbit Speaker=P1^5; //定義輸出管腳
- unsigned int code FreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494}; //C調(diào)歌曲12個半音的頻率
- unsigned char code PositTab[7]={0,2,4,5,7,9,11}; //1~7在頻率表中的位置
- unsigned char code LengthTab[7]={1,2,4,8,16,32,64};
- unsigned char SoundTempTH0,SoundTempTL0; //音符定時器初值暫存
- unsigned char SoundTempTH1,SoundTempTL1; //音長定時器初值暫存
- void SpeakerDiDi(void);
- void SpeakerDiDi(void)
- {
- unsigned char i;
- for(i=0;i<3;i++)
- {
- Speaker=0;
- DelayMs(100);
- Speaker=1;
- DelayMs(100);
- }
- DelayMs(500);
- for(i=0;i<3;i++)
- {
- Speaker=0;
- DelayMs(100);
- Speaker=1;
- DelayMs(100);
- }
- DelayMs(500);
- for(i=0;i<2;i++)
- {
- Speaker=0;
- DelayMs(500);
- Speaker=1;
- DelayMs(100);
- }
- }
- void InitialSound(void)
- {
- Speaker=1;
- SoundTempTH1=(65535-(1/1200)*Fosc)/256; //計算TL1應(yīng)裝入的初值 (10ms的初裝值)
- SoundTempTL1=(65535-(1/1200)*Fosc)%256; //計算TH1應(yīng)裝入的初值
- TH1=SoundTempTH1; //裝入初值
- TL1=SoundTempTL1;
- TMOD|=0x11; //定時器1、2都工作在定時器模式,工作方式1
- ET0=1; //定時器0開中斷
- ET1=0; //定時器1關(guān)中斷
- TR0=0; //不啟動定時器
- TR1=0; //不啟動定時器
- EA=1; //開啟CPU中斷
- }
- void Speakertimer(void) interrupt 1 //音符發(fā)生中斷
- {
- Speaker=!Speaker; //取反
- TH0=SoundTempTH0; //定時器0重新裝初值
- TL0=SoundTempTL0;
- }
- void PlayMusic(unsigned char *SoundName,unsigned char diaohao,unsigned shengjiang,unsigned int Speed)
- //SoundName為演奏歌曲歌名 diaohao是指樂曲升多少個半音演奏
- //shengjiang 1:降八度, 2:不升不降, 3:升八度; Speed歌曲演奏速度
- {
- unsigned int NewFreTab[12]; //新的頻率表
- unsigned char i,j;
- unsigned int Point,yinfuchang,yipai,LDiv1,LDiv2,sifenyifu,CurrentFre,TempCounter,SoundLength;
- //Point 指針?biāo)饕?nbsp; LDiv 音符演奏的長度(多少個10ms) yipai 1分音符的長度(幾個10ms)即一個節(jié)拍
- //sifenyifu 4分音符的長度 CurrentFre 查出對應(yīng)音符的頻率 SoundLength歌曲長度 TempCounter計算計數(shù)器初值
- unsigned char yindiao,length,yinfu,shengban,gaodi,SLen,leixing,fudian;
- //yindiao音調(diào) length音長 yinfu音符 gaodi高低音 shengban是否升半 leixing音符類型(0普通1連音2頓音)
- for(i=0;i<12;i++) // 根據(jù)調(diào)號及升降八度來生成新的頻率表
- {
- j=i+diaohao;
- if(j>11)
- {
- j=j-12;
- NewFreTab[i]=FreTab[j]*2; //頻率翻倍速
- }
- else
- NewFreTab[i]=FreTab[j];
- if(shengjiang==1) NewFreTab[i]>>=2; //如果是降調(diào) 則頻率除以2
- else if(shengjiang==3) NewFreTab[i]<<=2; //如果是升調(diào) 則頻率翻倍速
- }
- SoundLength=0;
- while(SoundName[SoundLength]!=0x00) //計算歌曲長度 以0X00結(jié)尾
- {
- SoundLength+=2;
- }
- Point=0;
- yindiao=SoundName[Point]; //第一個字節(jié)為音符音調(diào)
- length=SoundName[Point+1]; //第二個字節(jié)為音符時值
- yipai=12000/Speed; //算出一個節(jié)拍的長度(單位是10ms)
- sifenyifu=yipai/4; //算出4分音符的長度
- sifenyifu=sifenyifu-sifenyifu*jiepai; //普通音最長間隔標(biāo)準(zhǔn)
- TR0=0;
- TR1=1; //啟動定時器1
- while(Point<SoundLength)
- {
- yinfu=yindiao%10; //個位,1--7七個音符
- gaodi=yindiao/10%10; //十位,高低音
- shengban=yindiao/100; //百位,是否升半
- CurrentFre=NewFreTab[PositTab[yinfu-1]+shengban]; //查出對應(yīng)音符的頻率
- if(yinfu!=0)
- {
- if (gaodi==1) CurrentFre>>=2; //低音,頻率除以2
- if (gaodi==3) CurrentFre<<=2; //高音, 頻率翻倍速
- TempCounter=65536-(50000/CurrentFre)*10/(12000000/Fosc);//計算計數(shù)器初值
- SoundTempTH0=TempCounter/256;
- SoundTempTL0=TempCounter%256;
- TH0=SoundTempTH0;
- TL0=SoundTempTL0+12; //加12是對中斷延時的補償
- }
- SLen=LengthTab[length%10]; //算出是幾分音符
- leixing=length/10%10; //算出音符類型(0普通1連音2頓音)
- fudian=length/100;
- yinfuchang=yipai/SLen; //算出連音音符演奏的長度(多少個10ms)
- if (fudian==1)
- yinfuchang=yinfuchang+yinfuchang/2;
- if(leixing!=1)
- if(leixing==0) //算出普通音符的演奏長度
- if (SLen<=4)
- LDiv1=yinfuchang-sifenyifu;
- else
- LDiv1=yinfuchang*jiepai;
- else
- LDiv1=yinfuchang/2; //算出頓音的演奏長度
- else
- LDiv1=yinfuchang;
- if(yinfu==0) LDiv1=0;
- LDiv2=yinfuchang-LDiv1; //算出不發(fā)音的長度
- if (yinfu!=0)
- {
- TR0=1;
- for(i=LDiv1;i>0;i--) //發(fā)規(guī)定長度的音
- {
- while(TF1==0);
- TH1=SoundTempTH1;
- TL1=SoundTempTL1;
- TF1=0;
- }
- }
- if(LDiv2!=0)
- {
- TR0=0; Speaker=0;
- for(i=LDiv2;i>0;i--) //音符間的間隔
- {
- while(TF1==0);
- TH1=SoundTempTH1;
- TL1=SoundTempTL1;
- TF1=0;
- }
- }
- Point+=2;
- yindiao=SoundName[Point];
- length=SoundName[Point+1];
- }
- Speaker=1;
- }
- //**************************************************************************
- unsigned char code HappyBirthday[]=
- {//生日歌
- 0x19,0x03, 0x19,0x03, 0x1A,0x02, 0x19,0x02, 0x1F,0x02,
- 0x1B,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x02, 0x19,0x02,
- 0x20,0x02, 0x1F,0x01, 0x19,0x03, 0x19,0x03, 0x23,0x02,
- 0x21,0x02, 0x1F,0x02, 0x1B,0x0C, 0x1A,0x15, 0x22,0x03,
- 0x22,0x03, 0x21,0x02, 0x1F,0x02, 0x20,0x02, 0x1F,0x15,
- 0x00,0x00
- };
- unsigned char code Butterfly[]=
- {
- 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
- 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
- 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
- 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
- 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
- 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
- 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
- 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
- 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
- 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
- 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
- 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
- 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
- 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
- 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
- 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
- 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
- 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
- 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
- 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
- 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
- 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
- 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
- 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
- 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
- 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
- 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
- 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
- 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
- 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
- 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
- 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
- 0x10,0x03, 0x15,0x00, 0x00,0x00
- };
- /*音樂歌譜每個音符由兩個字節(jié)表示,第一個字節(jié)表示音高,第二個字節(jié)表示音長
- 音高由三位數(shù)字組成:個位是表示 1~7 這七個音符
- 十位是表示音符所在的音區(qū):1-低音,2-中音,3-高音;百位表示這個音符是否要升半音: 0-不升,1-升半音。
- 音長最多由三位數(shù)字組成:
- 個位表示音符的時值,其對應(yīng)關(guān)系是:
- 數(shù)值(n): |0 |1 |2 |3 | 4 | 5 | 6 |
- 幾分音符: |1 |2 |4 |8 |16 |32 |64
- 十位表示音符的演奏效果 (0-2): 0-普通,1-連音,2-頓音 百位是符點位: 0-無符點,1-有符點
- 陽歷對應(yīng)的陰歷數(shù)據(jù),每年三字節(jié),
- 格式第一字節(jié)BIT7-4位表示閏月月份,為0,則無閏月,BIT3-0對應(yīng)陰歷第1-4月的大小,
- 第二字節(jié)BIT7-0對應(yīng)陰歷第5-12月大小,第三字節(jié)BIT7表示陰歷第13月大小
- 月分對應(yīng)的位為1,表示農(nóng)歷月大(30天)為0表示小(29天)
- 第三字節(jié)BIT6-5表示春節(jié)的公歷月份,BIT4-0表示春節(jié)公歷日期
- */
- code unsigned char YearCode[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 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
- };
- /******************忙檢測函數(shù)***************/
- void CheckBusy(void)
- {
- LCD_RS=0;
- LCD_RW=1;
- LCD_E=1;
- LCD_Data=0xff;
- while((LCD_Data&0x80)==0x80);
- LCD_E=0;
- }
- /**********************給LCD寫入數(shù)據(jù)*****************/
- void WriteDataLCD(unsigned char WDLCD)
- {
- CheckBusy(); //檢測忙
- LCD_RS = 1; //RS為高電平,DB7----DB0為數(shù)據(jù)
- LCD_RW = 0; //RW為低電平,E從高電平到低電平,則是把DB7----DB0的數(shù)據(jù)寫到DR或者IR
- LCD_E = 1;
- LCD_Data = WDLCD; //傳送數(shù)據(jù)WDLCD
- Delay(5);
- LCD_E = 0; //E從 高電平 到 低電平
- Delay(5);
- }
- /******************給LCD寫入指令**********************/
- void WriteCommandLCD(unsigned char WCLCD) //BuysC為0時忽略忙檢測
- {
- CheckBusy(); //檢測忙
- LCD_RS = 0; //RS為低,DB7----DB0為指令
- LCD_RW = 0; //RW為低,E從高電平到低電平,則是把DB7----DB0的數(shù)據(jù)寫到DR或者IR
- LCD_E = 1;
- LCD_Data = WCLCD; //傳送數(shù)據(jù)
- Delay(5);
- LCD_E = 0; //E從 高電平到低電平
- Delay(5);
- }
- /***************LCD初始化******************/
- void LCDInit(void)
- {
- WriteCommandLCD(0x30); //顯示模式設(shè)置,開始要求每次檢測忙信號
- WriteCommandLCD(0x01); //顯示清屏
- WriteCommandLCD(0x06); // 顯示光標(biāo)移動設(shè)置
- WriteCommandLCD(0x0C); // 顯示開,無游標(biāo),不反白
- }
- /********************清屏***************************/
- void LCDClear(void)
- {
- WriteCommandLCD(0x01); //顯示清屏
- WriteCommandLCD(0x34); // 顯示光標(biāo)移動設(shè)置
- WriteCommandLCD(0x30); // 顯示開及光標(biāo)設(shè)置
- }
- /*****************************************/
- void LCDSendWord(unsigned char *p) //向LCD發(fā)送一個字符串,
- {
- while(*p>0) //比如void LCDSendWord('你好');就是讓LCD顯示"你好"
- {
- WriteDataLCD(*p);
- p++;
- }
- }
-
- /************寫數(shù)據(jù)或者指令***************/
- void LCDTestWord(bit i,unsigned char word)
- {
- if(i==0)
- {
- WriteCommandLCD(word); //i=0;則寫入指令
- }
- else
- {
- WriteDataLCD(word); //i=1;則寫入數(shù)據(jù)
- }
- }
- void DisplayYear(void) //往LCD上填寫 年 數(shù)據(jù)
- {
- year=ReadDs1302(0x8d); //從1302的0X8D處讀出年數(shù)據(jù)
- LCDTestWord(0,0x81); //寫指令 0X81 在第一行第二個字符位置顯示 年 數(shù)據(jù)
- 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
- DisplayShengXiao();
- }
- void DisplayMonth(void) //往LCD上填寫 月 數(shù)據(jù)
- {
- month=ReadDs1302(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("月"); //顯示 月
- DisplayShengXiao();
- }
-
- void DisplayWeek(void) //往LCD上填寫 星期 數(shù)據(jù)
- {
- week=(ReadDs1302(0x8b))%16; //從1302中讀取星期數(shù)據(jù)
- LCDTestWord(0,0x90);
- LCDSendWord("星期");
- LCDTestWord(0,0x92);
- 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 DisplayDay(void) //往LCD上填寫 日期 數(shù)據(jù)
- {
- day=ReadDs1302(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("日");
- DisplayShengXiao();
- }
- void DisplayHour(void) //往LCD上填寫 小時數(shù)據(jù)
- {
- hour=ReadDs1302(0x85);
- LCDTestWord(0,0x88);
- LCDTestWord(1,(hour/16)+0x30);
- LCDTestWord(1,hour%16+0x30);
- }
- void DisplayMin(void) //往LCD上填寫分鐘 數(shù)據(jù)
- {
- min=ReadDs1302(0x83);
- LCDTestWord(0,0x89);
- LCDTestWord(1,0x3a);
- LCDTestWord(1,(min/16)+0x30);
- LCDTestWord(1,min%16+0x30);
- LCDTestWord(1,0x3a);
- }
- void DisplaySec(void) //住LCD上填寫 秒鐘 和溫度 數(shù)據(jù)
- {
- unsigned char i=0;
- unsigned int a=0,b=0,c=0;
- sec=ReadDs1302(0x81);
- LCDTestWord(0,0x8b);
- LCDTestWord(1,(sec/16)+0x30);
- LCDTestWord(1,sec%16+0x30);
- }
- void DisplayTemp(void)
- {
- unsigned int i;
- unsigned char a,b,c;
- WriteCommandLCD(0x8c);
- LCDTestWord(0,0x8d);
- TempChange();
- i=GetTemp();
- a=i/100;
- LCDTestWord(1,a+0x30);
- b=i/10-a*10;
- LCDTestWord(1,b+0x30);
- LCDTestWord(1,0x2e);
- c=i-a*100-b*10;
- LCDTestWord(1,c+0x30);
- LCDSendWord("℃");
- }
- /***************************寫入操作*********************/
- void WriteDs1302Byte(unsigned char temp)
- {
- unsigned char i;
- for (i=0;i<8;i++) //循環(huán)8次 寫入數(shù)據(jù)
- {
- DS1302_CLK=0;
- DS1302_IO=temp&0x01; //每次傳輸?shù)妥止?jié)
- temp>>=1; //右移一位
- DS1302_CLK=1;
- }
- }
- /***********************************寫入數(shù)據(jù)*****************************/
- void WriteDs1302( unsigned char address,unsigned char dat ) //先寫地址,再寫數(shù)據(jù)
- {
- DS1302_RST=0;
- _nop_();
- DS1302_CLK=0;
- _nop_();
- DS1302_RST=1;
- _nop_(); //啟動
- WriteDs1302Byte(address); //發(fā)送地址
- WriteDs1302Byte(dat); //發(fā)送數(shù)據(jù)
- DS1302_RST=0; //恢復(fù)
- }
- /****************************************************************************/
- unsigned char ReadDs1302(unsigned char address) //先送地址,再讀數(shù)據(jù)
- {
- unsigned char i,temp=0x00;
- DS1302_RST=0;
- _nop_();
- DS1302_CLK=0;
- _nop_();
- DS1302_RST=1;
- _nop_();
- WriteDs1302Byte(address); //送地址函數(shù)
- for (i=0;i<8;i++) //循環(huán)8次 讀取數(shù)據(jù)
- {
- DS1302_CLK=1;
- _nop_();
- if(DS1302_IO)
- temp|=0x80; //每次傳輸?shù)妥止?jié)
- DS1302_CLK=0;
- temp>>=1; //右移一位
- }
- DS1302_RST=0;
- _nop_();
- DS1302_CLK=1;
- DS1302_IO=0;
- return (temp); //返回
- }
- /*****************DS1302初始化********************/
- void InitDS1302() //DS1302中秒,分,時,日期,月份,星期,年的地址分別是0x80,0x82,0x84,0x86,0x88,0x8a,0x8c
- { //初始化寫入的時間是2010年4月1日15點整,星期六
- WriteDs1302(0x8e,0x00); //控制命令,WP位為0,允許寫操作 控制位地址是0x8e
- DelayMs(5);
- WriteDs1302(0x8c,0x10); //寫入年份10年
- DelayMs(5);
- WriteDs1302(0x8a,0x04); //寫入星期6
- DelayMs(5);
- WriteDs1302(0x88,0x05); //定入月分 5月
- DelayMs(5);
- WriteDs1302(0x86,0x01); //寫入日期 1日
- DelayMs(5);
- WriteDs1302(0x84,0x09); //寫入小時 9點
- DelayMs(5);
- WriteDs1302(0x82,0x59); //寫入分鐘 59分
- DelayMs(5);
- WriteDs1302(0x80,0x30); //寫入秒 30秒
- DelayMs(5);
- WriteDs1302(0x8e,0x80); //控制命令,WP為1,禁止寫操作
- }
- /*************************************************************************/
- void delayb(unsigned int count) //delay
- {
- unsigned char i;
- while(count)
- {
- i=200;
- while(i>0)
- i--;
- count--;
- }
- }
- void DS18B20Init(void) //DS18B20初始化
- {
- unsigned int i;
- DS18B20=0;
- i=103;
- while(i>0)i--;
- DS18B20=1;
- i=4;
- while(i>0)i--;
- }
- bit TempReadBit(void) // 讀一位
- {
- unsigned int i;
- bit dat;
- DS18B20=0;i++; //小延時一下
- DS18B20=1;i++;i++;
- dat=DS18B20;
- i=8;while(i>0)i--;
- return (dat);
- }
- unsigned char TempRead(void) //讀一個字節(jié)
- {
- unsigned char i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=TempReadBit();
- dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里
- }
- return(dat); //將一個字節(jié)數(shù)據(jù)返回
- }
- void TempWriteByte(unsigned char dat)
- { //寫一個字節(jié)到DS18B20里
- unsigned int i;
- unsigned char j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) // 寫1部分
- {
- DS18B20=0;
- i++;i++;
- DS18B20=1;
- i=8;while(i>0)i--;
- }
- else
- {
- DS18B20=0; //寫0部分
- i=8;while(i>0)i--;
- DS18B20=1;
- i++;i++;
- }
- }
- }
- void TempChange(void) //發(fā)送溫度轉(zhuǎn)換命令
- {
- DS18B20Init(); //初始化DS18B20
- delayb(1); //延時
- TempWriteByte(0xcc); // 跳過序列號命令
- TempWriteByte(0x44); //發(fā)送溫度轉(zhuǎn)換命令
- }
- int GetTemp() //獲得溫度
- {
- float tt;
- unsigned char a,b;
- DS18B20Init();
- delayb(1);
- TempWriteByte(0xcc);
- TempWriteByte(0xbe); //發(fā)送讀取數(shù)據(jù)命令
- a=TempRead(); //連續(xù)讀兩個字節(jié)數(shù)據(jù)
- b=TempRead();
- temp=b;
- temp<<=8;
- temp=temp|a; //兩字節(jié)合成一個整型變量。
- tt=temp*0.0625; //得到真實十進制溫度值,因為DS18B20 可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是0.0625度。
- temp=tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點后第一位 也轉(zhuǎn)換為可顯示數(shù)字,同時進行一個四舍五入操作。
- return temp; //返回溫度值
- }
- code unsigned char DayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
- code unsigned int DayCode2[3]={0x111,0x130,0x14e};
- //計算公歷日離當(dāng)年元旦的天數(shù),為了減少運算,用了兩個表 DayCode1[9],DayCode2[3]
- //如果公歷月在九月或前,天數(shù)會少于0xff,用表DayCode1[9],在九月后,天數(shù)大于0xff,用表DayCode2[3]
- //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為DayCode1[8-1]+10-1,如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為DayCode2[11-10]+10-1
- /*讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0*/
- bit GetMoonDay(unsigned char LunarMonth,unsigned int TableAddr)
- {
- unsigned char temp;
- switch (LunarMonth) //LunarMonth指向農(nóng)歷月份
- {
- case 1:
- {
- temp=YearCode[TableAddr]&0x08; //1月,對應(yīng)年份表里第一字節(jié)的BIT3位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0); //為0,月小
- else return(1); //為1,月大
- }
- case 2:
- {
- temp=YearCode[TableAddr]&0x04; //2月,對應(yīng)年份表里第一字節(jié)的BIT2位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0); //為0,月小
- else return(1); //為1,月大
- }
- case 3:
- {
- temp=YearCode[TableAddr]&0x02; //3月,對應(yīng)第一字節(jié)的BIT1位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0); //為0,月小
- else return(1); //為1,月大
- }
- case 4:
- {
- temp=YearCode[TableAddr]&0x01; //1月,對應(yīng)第一字節(jié)的BIT0位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 5:
- {
- temp=YearCode[TableAddr+1]&0x80; //5月,對應(yīng)第二字節(jié)的BIT7位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 6:
- {
- temp=YearCode[TableAddr+1]&0x40; //6月,對應(yīng)第二字節(jié)的BIT6位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 7:
- {
- temp=YearCode[TableAddr+1]&0x20; //7月,對應(yīng)第二字節(jié)的BIT5位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 8:
- {
- temp=YearCode[TableAddr+1]&0x10; //8月,對應(yīng)第二字節(jié)的BIT4位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 9:
- {
- temp=YearCode[TableAddr+1]&0x08; //9月,對應(yīng)第二字節(jié)的BIT3位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 10:
- {
- temp=YearCode[TableAddr+1]&0x04; //10月,對應(yīng)第二字節(jié)的BIT2位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 11:
- {
- temp=YearCode[TableAddr+1]&0x02; //11月,對應(yīng)第二字節(jié)的BIT1位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 12:
- {
- temp=YearCode[TableAddr+1]&0x01; //12月,對應(yīng)第二字節(jié)的BIT0位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- case 13:
- {
- temp=YearCode[TableAddr+2]&0x80; //13月,對應(yīng)第三字節(jié)的BIT7位,如果是1,則月大,如果是0,則月小
- if (temp==0) return(0);
- else return(1);
- }
- }
- }
- void Conversion(bit cenbit,unsigned char year,unsigned char month,unsigned char day)
- //cenbit=0為21世紀(jì),cenbit=1為20世紀(jì),輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
- {
- unsigned char temp1,temp2,temp3,MonthP;//temp3,temp4分別表示春節(jié)距元旦的天數(shù),公歷日離元旦的天數(shù)
- unsigned int temp4,TableAddr;
- bit flag2,flag_y;
- temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進制 高位
- temp2=year%16; //低位
- year=temp1*10+temp2; //把 年 數(shù)據(jù) 轉(zhuǎn)換成16進制
- temp1=month/16; //月份 高位
- temp2=month%16; //月份 低位
- month=temp1*10+temp2; //把 月 數(shù)據(jù) 轉(zhuǎn)換成16進制
- temp1=day/16; //日期 高位
- temp2=day%16; //日期 低位
- day=temp1*10+temp2; //把 日 數(shù)據(jù) 轉(zhuǎn)換成16進制
- if(cenbit==0) //如果是21世紀(jì)
- {
- TableAddr=(year+0x64-1)*0x03; //定位數(shù)據(jù)表地址 year對應(yīng)的年份表中的地址是(year+99)*3 如2010年 其地址是327
- LCDTestWord(0,0x80);
- LCDSendWord("20");
- }
- else //如果是20世紀(jì)
- {
- TableAddr=(year-1)*0x03; //定位數(shù)據(jù)表地址 year對應(yīng)的年份表中的地址是(year-1)*3 如1901年 其地址是3
- LCDTestWord(0,0x80);
- LCDSendWord("19");
- }
- 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) // 計算當(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;
- //計算機出公歷日距元旦的天數(shù)和春節(jié)距元旦的天數(shù),則是為了比較公歷日是在春節(jié)前還是春節(jié)后
- //如果temp3>temp4 則 公歷日在春節(jié)之前
- if (temp4>=temp3) //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進行運算
- {
- temp4-=temp3; //公歷日離春節(jié)的天數(shù) 因為公歷日在春節(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é)前使用下面代碼進行運算
- temp3-=temp4; //公歷日離春節(jié)的天數(shù) 因為公歷日在春節(jié)前 所以為temp3-temp4
- if (year==0x00){year=0x63;cenbit=1;}
- 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=cenbit;
- 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 DisplayShengXiao(void)
- {
- unsigned char LunarYearD,ReYear; //農(nóng)歷年份的十進制數(shù) 和取模后的余數(shù)
- if(cen==0x19) {cenbit=1;}
- if(cen==0x20) {cenbit=0;}
- Conversion(cenbit,year,month,day); //將公歷日期轉(zhuǎn)換成農(nóng)歷
- LCDTestWord(0,0x94); //顯示在LCD的0X94位置上
- LCDTestWord(1,LunarYear/16+0x30); //農(nóng)歷年十位
- LCDTestWord(1,LunarYear%16+0x30); //農(nóng)歷年個位
- LCDTestWord(1,'-'); //用-隔開
- LCDTestWord(1,LunarMonth/16+0x30); //農(nóng)歷月十位
- LCDTestWord(1,LunarMonth%16+0x30); //農(nóng)歷月個位
- LCDTestWord(1,'-');
- 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進制數(shù)
- ReYear=LunarYearD%12; //農(nóng)歷年模12,取余運算
- switch(ReYear)
- {
- case 0: LCDTestWord(0,0x93);LCDSendWord("龍");break; //余0即整除 農(nóng)歷 龍年
- case 1: LCDTestWord(0,0x93);LCDSendWord("蛇");break; //蛇年
- case 2: LCDTestWord(0,0x93);LCDSendWord("馬");break;
- case 3: LCDTestWord(0,0x93);LCDSendWord("羊");break;
- case 4: LCDTestWord(0,0x93);LCDSendWord("猴");break;
- case 5: LCDTestWord(0,0x93);LCDSendWord("雞");break;
- case 6: LCDTestWord(0,0x93);LCDSendWord("狗");break;
- case 7: LCDTestWord(0,0x93);LCDSendWord("豬");break;
- case 8: LCDTestWord(0,0x93);LCDSendWord("鼠");break;
- case 9: LCDTestWord(0,0x93);LCDSendWord("牛");break;
- case 10:LCDTestWord(0,0x93);LCDSendWord("虎");break;
- case 11:LCDTestWord(0,0x93);LCDSendWord("兔");break;
- }
- }
- /***************節(jié)假日提示********************/
- void Holidays(void)
- {
- LCDTestWord(0,0x98);
-
- if(LunarMonth==0x01 && LunarDay==0x01) {LCDSendWord("春節(jié)快樂 ");}
- if(LunarMonth==0x01 && LunarDay==0x05) {LCDSendWord("姐姐的生日 ");}
- if(LunarMonth==0x01 && LunarDay==0x15) {LCDSendWord("元宵節(jié)快樂 ");}
- if(LunarMonth==0x05 && LunarDay==0x05) {LCDSendWord("端午節(jié)快樂 ");}
- if(LunarMonth==0x06 && LunarDay==0x26) {LCDSendWord("佳燕的生日 ");}
- if(LunarMonth==0x07 && LunarDay==0x07) {LCDSendWord("中國情人節(jié) ");}
- if(LunarMonth==0x08 && LunarDay==0x15) {LCDSendWord("中秋節(jié)快樂 ");}
- if(LunarMonth==0x09 && LunarDay==0x01) {LCDSendWord("嘿嘿,又長大了 ");}
- if(LunarMonth==0x09 && LunarDay==0x03) {LCDSendWord("侄子的生日 ");}
- if(LunarMonth==0x09 && LunarDay==0x09) {LCDSendWord("重陽節(jié) ");}
- if(LunarMonth==0x09 && LunarDay==0x30) {LCDSendWord("媽媽的生日 ");}
- if(LunarMonth==0x12 && LunarDay==0x08) {LCDSendWord("臘八節(jié) ");}
- if(LunarMonth==0x12 && LunarDay==0x15) {LCDSendWord("過小年啦 ");}
- if(LunarMonth==0x12 && LunarDay==0x27) {LCDSendWord("爸爸的生日 ");}
- if(LunarMonth==0x12 && LunarDay==0x29) {LCDSendWord("臘月二十九 ");}
- if(LunarMonth==0x12 && LunarDay==0x30) {LCDSendWord("除夕夜到了 ");} //以上是農(nóng)歷節(jié)日,以下是公歷節(jié)日
- if(month==0x01 && day==0x01) {LCDSendWord("元旦節(jié)快樂 ");}
- if(month==0x02 && day==0x02) {LCDSendWord("世界濕地日 ");}
- if(month==0x02 && day==0x10) {LCDSendWord("世界氣象日 ");}
- if(month==0x03 && day==0x08) {LCDSendWord("國際婦女節(jié) ");}
- if(month==0x03 && day==0x12) {LCDSendWord("中國植樹節(jié) ");}
- if(month==0x03 && day==0x15) {LCDSendWord("消費者權(quán)益日 ");}
- if(month==0x03 && day==0x22) {LCDSendWord("世界水日 ");}
- if(month==0x04 && day==0x01) {LCDSendWord("愚人節(jié)快樂 ");}
- if(month==0x04 && day==0x05) {LCDSendWord("中國清明節(jié) ");}
- if(month==0x04 && day==0x22) {LCDSendWord("世界地球日 ");}
- if(month==0x05 && day==0x01) {LCDSendWord("國際勞動節(jié) ");}
- if(month==0x05 && day==0x04) {LCDSendWord("中國青年節(jié) ");}
- if(month==0x05 && day==0x12) {LCDSendWord("世界護士節(jié) ");}
- if(month==0x06 && day==0x01) {LCDSendWord("國際兒童節(jié) ");}
- if(month==0x06 && day==0x05) {LCDSendWord("世界環(huán)境日 ");}
- if(month==0x06 && day==0x06) {LCDSendWord("國際愛眼日 ");}
- if(month==0x06 && day==0x25) {LCDSendWord("世界土地日 ");}
- if(month==0x06 && day==0x26) {LCDSendWord("國際禁毒日 ");}
- if(month==0x07 && day==0x01) {LCDSendWord("香港回歸日 ");}
- if(month==0x08 && day==0x01) {LCDSendWord("中國建軍節(jié) ");}
- if(month==0x09 && day==0x10) {LCDSendWord("中國老師節(jié) ");}
- if(month==0x09 && day==0x18) {LCDSendWord("九一八事件紀(jì)念日");}
- if(month==0x10 && day==0x01) {LCDSendWord("中國國慶節(jié) ");}
- if(month==0x10 && day==0x04) {LCDSendWord("世界動物日 ");}
- if(month==0x10 && day==0x09) {LCDSendWord("世界郵政日 ");}
- if(month==0x10 && day==0x10) {LCDSendWord("辛亥革命紀(jì)念日 ");}
- if(month==0x12 && day==0x20) {LCDSendWord("澳門回歸紀(jì)念日 ");}
- if(month==0x12 && day==0x24) {LCDSendWord("平安夜 ");}
- if(month==0x12 && day==0x25) {LCDSendWord("圣誕節(jié) ");}
- else LCDSendWord("入云龍小白");
- }
- void UpDate(void)
- {
- DisplayYear(); //顯示年
- DisplayMonth(); //顯示月
- DisplayDay(); //顯示日
- DisplayWeek(); //顯示星期
- DisplayHour(); //顯示時
- DisplayMin(); //顯示分
- DisplaySec(); //顯示秒
- DisplayShengXiao();
- }
- void SetTime(unsigned char count)
- {
- unsigned char address,item;
- unsigned char max,mini;
- LCDTestWord(0,0x98);
- LCDSendWord("調(diào)整");
- if(count==6) {LCDSendWord("秒鐘 ");address=0x81; max=59;mini=0;}
- if(count==5) {LCDSendWord("分鐘 ");address=0x83; max=59;mini=0;}
- if(count==4) {LCDSendWord("小時 ");address=0x85; max=23;mini=0;}
- if(count==3) {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=ReadDs1302(address);//讀取DS1302某地址上的數(shù)值賦給item
- item=(item/16)*10+item%16;
- if(PlusKey==0) //PlusKey-加
- item++; //數(shù)加 1
- if(ReduceKey==0) //ReduceKey-減
- item--; //數(shù)減 1
- if(item>max)
- item=mini; //查看數(shù)值有效范圍
- if(item<mini)
- item=max;
- WriteDs1302(0x8e,0x00);
- item=(item/10)*16+item%10;
- WriteDs1302(address-1,item); //將調(diào)整好的item值寫入DS1302
- UpDate();
- }
- void Key(void)
- {
-
- if (SetKey==0) // 設(shè)置時間
- {
- DelayMs(10); //按鍵消抖
- if(SetKey==0&&w==0) //當(dāng)是正常狀態(tài)時就進入調(diào)時狀態(tài)
- {
- w=1; //進入調(diào)時
- SetTime(next); //調(diào)整
- }
- if(SetKey==0&&w==1) //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項
- {
- next++;
- if(next>=7) {next= 0;}
- SetTime(next); //調(diào)整
- }
- while(SetKey==0); //等待鍵松開
- }
- if(SureKey==0) // 當(dāng)在調(diào)時狀態(tài)時就退出調(diào)時
- {
- DelayMs(10); //按鍵消抖
- if(SureKey==0&&w==1)
- {
- w=0;next=0;
- Holidays();
- }
- while(SureKey==0); //等待鍵松開
- }
- if (PlusKey==0) //加調(diào)整
- {
- DelayMs(10); //按鍵消抖
- if(PlusKey==0&&w==1)
- {
- SetTime(next); //調(diào)整
- }
- while(PlusKey==0); //等待鍵松開
- }
-
- if (ReduceKey==0) //減調(diào)整
- {
- DelayMs(10); //按鍵消抖
- if(ReduceKey==0&&w==1)
- {
- SetTime(next); //調(diào)整
- }
- while(ReduceKey==0); //等待鍵松開
- }
- }
- void DelayMs(unsigned int a) //延時 1MS/次
- {
- unsigned char i;
- while(--a!=0)
- {
- for(i=0;i<125;i++)
- ;
- }
- }
- void Delay(unsigned char num)
- {
- while(num--)
- ;
- }
- void main()
- {
- SetKey=1;
- SureKey=1;
- PlusKey=1;
- ReduceKey=1;
- PSB=1;
- next=0;
- LCDInit();
- LCDClear();
- //InitDS1302();
- InitialSound();
- while(1)
- {
- if(w==0)
- {
- DisplayYear(); //顯示年
- DisplayMonth(); //顯示月
- DisplayDay(); //顯示日
- DisplayWeek(); //顯示星期
- DisplayHour(); //顯示時
- DisplayMin(); //顯示分
- DisplaySec(); //顯示秒
- Holidays(); //顯示節(jié)日
- DisplayTemp(); //顯示溫度
- }
- Key();
- if(min==0&&sec==0)
- {
-
- if(LunarMonth==9&&LunarDay==1)
- {
- PlayMusic(HappyBirthday,0,3,300);
- }
- else
- {
- SpeakerDiDi();
- }
- }
- }
- }
復(fù)制代碼
|
|