久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
12864-ds1302-ds18b20-單片機(jī)萬年歷程序
[打印本頁]
作者:
51hei人人
時間:
2016-3-12 21:21
標(biāo)題:
12864-ds1302-ds18b20-單片機(jī)萬年歷程序
#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ù)總線,單片機(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是對中斷延時的補(bǔ)償
}
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-頓音 百位是符點(diǎn)位: 0-無符點(diǎn),1-有符點(diǎn)
陽歷對應(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點(diǎn)整,星期六
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點(diǎn)
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; //得到真實(shí)十進(jìn)制溫度值,因?yàn)镈S18B20 可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是0.0625度。
temp=tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點(diǎn)后第一位 也轉(zhuǎn)換為可顯示數(shù)字,同時進(jìn)行一個四舍五入操作。
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ù),為了減少運(yùn)算,用了兩個表 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)換為十六進(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)制
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;
//計算機(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;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)歷年份的十進(jìn)制數(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進(jìn)制數(shù)
ReYear=LunarYearD%12; //農(nóng)歷年模12,取余運(yùn)算
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("消費(fèi)者權(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("世界護(hù)士節(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)時就進(jìn)入調(diào)時狀態(tài)
{
w=1; //進(jìn)入調(diào)時
SetTime(next); //調(diào)整
}
if(SetKey==0&&w==1) //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項(xiàng)
{
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ù)制代碼
作者:
1433633039
時間:
2016-3-19 17:42
可有仿真圖?
作者:
whengfu
時間:
2016-3-31 14:38
謝謝樓主開源,這么完整的萬年歷代碼,我等學(xué)習(xí)了
作者:
D_anJF00
時間:
2016-12-22 20:23
可有仿真圖
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲午夜av久久乱码
|
日本午夜在线视频
|
视频一区在线观看
|
精品成人在线
|
黄视频国产
|
国产在线精品一区二区三区
|
国产成人精品免费视频大全最热
|
色黄视频在线
|
日本免费在线观看视频
|
亚洲国产成人精品久久久国产成人一区
|
一级黄色片毛片
|
一级做a爰片久久毛片
|
久久久久久久久久久久亚洲
|
精品一区二区三区在线视频
|
国产精品高
|
成人精品一区二区
|
国产精品 欧美精品
|
91久久精品一区二区二区
|
欧美一级免费看
|
日本一区二区视频
|
国产免费一区
|
久久69精品久久久久久久电影好
|
国产精品久久久99
|
蜜桃久久
|
91p在线观看
|
午夜成人免费视频
|
国产精品一区二区三区久久久
|
日韩在线免费
|
久久久性色精品国产免费观看
|
国产精品久久久久久久久免费桃花
|
久久亚洲综合
|
国产一区二区三区在线免费
|
国产精品区二区三区日本
|
日韩在线高清
|
亚洲天堂一区二区
|
中国美女撒尿txxxxx视频
|
美女黄网站视频免费
|
欧美中文字幕一区二区三区
|
色毛片
|
一级毛片免费
|
欧美一区二区视频
|