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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3447|回復: 2
打印 上一主題 下一主題
收起左側

關于51單片機程序修改

[復制鏈接]
跳轉到指定樓層
樓主
1500黑幣
大神們新年快樂
哪位大神有時間幫忙把附件所示的程序修改成iic 無字庫 oled顯示的(注釋一下怎么調節亮度和添加顯示字符)
這幾天都在研究了,從2018到2019搞了一年還是失敗了,只能求助了
基于51單片機的12864液晶顯示的萬年歷.zip (2.82 MB, 下載次數: 8)
PS:能在關鍵部分都注釋下的話就完更美了
謝謝啦







#include<reg52.h> #include<intrins.h>
#define LCD_Data P0 #define uchar unsigned char unsigned char sec,min,hour,day,month,year,cen,week, next,aa,bb,cc,dd,mm,temp0,LunarMonth, LunarDay,LunarYear; int temp; uchar tt=1; bit c_moon; bit cenbit=1; bit w; sbit LCD_RS=P2^0; sbit LCD_RW=P2^1; sbit LCD_E=P2^2; sbit PSB=P2^3; sbit DS1302_CLK=P3^7; sbit DS1302_IO=P3^6; sbit DS1302_RST=P3^5; sbit DS18B20=P2^5; sbit speak=P2^7; sbit SetKey=P1^4; //按鍵功 能:設置 sbit SureKey=P1^5; //按鍵功 能:確認 sbit PlusKey=P1^6; //按鍵功 能:加 sbit ReduceKey=P1^7; //按鍵功 能:減
sbit scl=P1^1; sbit sda=P1^0; void DisplayShengXiao(void); void delay(unsigned int a) //延時 1MS/次 { unsigned char i; while(--a) { for(i=0;i<125;i++) ; } } void delayb(unsigned int count) { while(count--); } void delays() { ; ;} void start() { sda=1; scl=1; delays(); sda=0; delays(); } void stop() { sda=0; scl=1; delays();
sda=1; delays();
} void response() { uchar i; while((sda==1)&&i<255)i++; // 給應答信號 sda=0;錯誤(while( (sda==0) |i<255)i++;)程序進入 while 死循環 scl=1; delays(); scl=0; //沒有這一步出錯,如果 沒有 sda 將保持 0 狀態,一直處于應答中。 程序停止。 delays(); } void write24c02(uchar date) { uchar temp,i; temp=date; for(i=0;i<8;i++) { scl=0; sda=temp&0x80; delays(); scl=1; delays(); temp=temp<<1; } scl=0; delays(); sda=1; delays(); } uchar read24c02() { uchar k,i; scl=0; delays(); sda=1;//僅僅是釋放數據線,可有 可無 for(i=0;i<8;i++) { scl=1;
delays(); k=k<<1; if(sda) k++; scl=0; delays();
} return k;
} void write_24c02add(uchar address,uchar date) { start(); write24c02(0xa0); response(); write24c02(address); response(); write24c02(date); response(); stop(); } uchar read_24c02add(uchar address) { uchar a; start(); write24c02(0xa0); response(); write24c02(address); response(); start(); write24c02(0xa1); response(); a=read24c02(); stop(); return a; }
unsigned char DS18B20Init() { unsigned char x; DS18B20=1; delayb(2); DS18B20=0; delayb(80); DS18B20=1;
delayb(5); x=DS18B20; delayb(20); return x;
} unsigned char TempRead(void) { unsigned char i,dat; DS18B20=1; delayb(1);
for(i=0;i<8;i++) { DS18B20=0; dat=dat>>1; DS18B20=1; if(DS18B20) dat=dat|0x80; delayb(4);
} return dat;
} void TempWriteByte(unsigned char dat) { unsigned int i; DS18B20=1; delayb(2); for(i=0;i<8;i++) { DS18B20=0; DS18B20=dat&0x01; delayb(8); DS18B20=1; dat=dat>>1; delayb(2); }
} int GetTemp() {
float tt; unsigned char a,b; DS18B20Init(); TempWriteByte(0xcc); TempWriteByte(0x44); delayb(100); DS18B20Init(); TempWriteByte(0xcc); TempWriteByte(0xbe); delayb(200); a=TempRead(); b=TempRead(); temp=b; temp<<=8; temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp;
} void WriteDs1302Byte(unsigned char temp) { unsigned char i; for (i=8;i>0;i--) {
DS1302_IO=temp&0x01; DS1302_CLK=0; DS1302_CLK=1; temp>>=1;
}
} void WriteDs1302( unsigned char address,unsigned char dat ) { DS1302_RST=0; DS1302_CLK=0; DS1302_RST=1; delay(1); WriteDs1302Byte(address); WriteDs1302Byte(dat); DS1302_RST=0; } unsigned char read_byte()
{ unsigned char i; for(i=8;i>0;i--) { if(DS1302_IO) temp0=temp0|0x80; DS1302_CLK=1; DS1302_CLK=0; temp0=temp0>>1;
} return temp0; }
unsigned char ReadDs1302(unsigned char address) { unsigned char temp; DS1302_RST=0; DS1302_CLK=0; DS1302_RST=1; WriteDs1302Byte(address); temp=read_byte(); DS1302_RST=0; DS1302_CLK=1; return temp; } void InitDS1302() { // unsigned char Second=ReadDs1302(0x80); // if(Second&0x80) { WriteDs1302(0x8e,0x00); delay(5); WriteDs1302(0x8c,0x10); //寫入年份 10 年 delay(5); WriteDs1302(0x8a,0x06); //寫入星期 6 delay(5); WriteDs1302(0x88,0x11); //定入月分 11 月 delay(5); WriteDs1302(0x86,0x6);
//寫入日期 6 日 delay(5); WriteDs1302(0x84,0x17); //寫入小時 17 點 delay(5); WriteDs1302(0x82,0x43); delay(5); WriteDs1302(0x80,0x00); //寫入秒 30 秒 delay(5); WriteDs1302(0x8e,0x80); //控制命令,WP 為 1,禁止寫操作 }
}
/*陽歷對應的陰歷數據,每年三字節, 格式第一字節BIT7-4位表示閏月月份, 為 0,則無閏月,BIT3-0 對應陰歷第 1-4 月 的大小, 第二字節BIT7-0 對應陰歷第5-12月大 小,第三字節 BIT7 表示陰歷第 13 月大小 月分對應的位為 1,表示農歷月大(30 天)為 0 表示小(29 天) 第三字節BIT6-5表示春節的公歷月份, BIT4-0 表示春節公歷日期 */ 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
};
void WriteDataLCD(unsigned char dat) { LCD_RS=1; LCD_RW=0; LCD_E=0; delay(2); LCD_Data=dat; delay(2); LCD_E=1; delay(5); LCD_E=0; delay(5); }
void WriteCommandLCD(unsigned char udat) { LCD_RS=0; LCD_RW=0; LCD_E=0; delay(2); LCD_Data=udat; delay(2); LCD_E=1; delay(5); LCD_E=0; delay(5);}
void LCDInit(void) { WriteCommandLCD(0x30);
WriteCommandLCD(0x01); WriteCommandLCD(0x06); WriteCommandLCD(0x0C);
}
void LCDClear(void) { WriteCommandLCD(0x01); WriteCommandLCD(0x34); WriteCommandLCD(0x30); }
void LCDSendWord(unsigned char *p) { while(*p>0) { WriteDataLCD(*p); p++; } }
void LCDTestWord(bit i,unsigned char word) { if(i==0) { WriteCommandLCD(word); } else { WriteDataLCD(word); } }
void DisplayYear(void) { year=ReadDs1302(0x8d); LCDTestWord(0,0x81); LCDTestWord(1,(year/16)+0x30); LCDTestWord(1,year%16+0x30); LCDTestWord(0,0x82); LCDSendWord("年"); DisplayShengXiao(); }
void DisplayMonth(void) { month=ReadDs1302(0x89); LCDTestWord(0,0x83); if(month/16!=0) { LCDTestWord(1,(month/16)+0x30); } else { LCDTestWord(1,0x20); } LCDTestWord(1,month%16+0x30); LCDTestWord(0,0x84); LCDSendWord("月"); DisplayShengXiao(); }
void DisplayWeek(void) { week=ReadDs1302(0x8b); LCDTestWord(0,0x90); LCDSendWord("星期"); LCDTestWord(0,0x92); // LCDTestWord(1,week+0x30); 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) {
day=ReadDs1302(0x87); 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) { hour=ReadDs1302(0x85); LCDTestWord(0,0x88); LCDTestWord(1,(hour/16)+0x30); LCDTestWord(1,hour%16+0x30); }
void DisplayMin(void) { min=ReadDs1302(0x83); LCDTestWord(0,0x89); // LCDTestWord(1,0x3a); LCDSendWord("點"); LCDTestWord(1,(min/16)+0x30); LCDTestWord(1,min%16+0x30); LCDSendWord("分"); }
void DisplaySec(void) { unsigned char i=0; unsigned int a=0,b=0,c=0; sec=ReadDs1302(0x81); LCDTestWord(0,0x8c); 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); LCDSendWord(" "); i=GetTemp(); a=i/100; LCDTestWord(1,a+0x30); b=i%100/10; LCDTestWord(1,b+0x30); LCDTestWord(1,0x2e); c=i-a*100-b*10; LCDTestWord(1,c+0x30); LCDSendWord("C");
} code unsigned char DayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78, 0x97,0xb5,0xd4,0xf3}; code unsigned int DayCode2[3]={0x111,0x130,0x14e}; //計算公歷日離當年元旦的天數,為了 減少運算,用了兩個表 DayCode1[9],DayCode2[3] //如果公歷月在九月或前,天數會少于 0xff,用表 DayCode1[9],在九月后,天數大 于 0xff,用表 DayCode2[3] //如輸入公歷日為8 月10日,則公歷日 離元旦天數為 DayCode1[8-1]+10-1,如輸入 公歷日為 11 月 10 日,則公歷日離元旦天數 為 DayCode2[11-10]+10-1 /*讀取數據表中農歷月的大月或小月, 如果該月為大返回 1,為小返回 0*/ bit GetMoonDay(unsigned char LunarMonth,unsigned int TableAddr) { unsigned char temp; switch (LunarMonth) //LunarMonth 指向農歷月份 { case 1: { temp=YearCode[TableAddr]&0x08; //1 月,對應年份表里第一字節的 BIT3 位, 如果是 1,則月大,如果是 0,則月小 if (temp==0) return(0);
//為 0,月小 else return(1); //為 1,月大 } case 2: {
temp=YearCode[TableAddr]&0x04; //2 月,對應年份表里第一字節的 BIT2 位,如 果是 1,則月大,如果是 0,則月小 if (temp==0) return(0); //為 0,月小 else return(1); //為 1,月大 } case 3: {
temp=YearCode[TableAddr]&0x02; //3 月,對應第一字節的 BIT1 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); //為 0,月小 else return(1); //為 1,月大 } case 4: {
temp=YearCode[TableAddr]&0x01; //1 月,對應第一字節的 BIT0 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 5: {
temp=YearCode[TableAddr+1]&0x80; //5 月,對應第二字節的 BIT7 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); else return(1); }
case 6:
{
temp=YearCode[TableAddr+1]&0x40; //6 月,對應第二字節的 BIT6 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 7: {
temp=YearCode[TableAddr+1]&0x20; //7 月,對應第二字節的 BIT5 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 8: {
temp=YearCode[TableAddr+1]&0x10; //8 月,對應第二字節的 BIT4 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 9: {
temp=YearCode[TableAddr+1]&0x08; //9 月,對應第二字節的 BIT3 位,如果是 1,則 月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 10: {
temp=YearCode[TableAddr+1]&0x04; //10 月,對應第二字節的 BIT2 位,如果是 1,則月大,如果是 0,則月小 if (temp==0) return(0); else return(1);
}
case 11:
{
temp=YearCode[TableAddr+1]&0x02; //11 月,對應第二字節的 BIT1 位,如果是 1,則月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 12: {
temp=YearCode[TableAddr+1]&0x01; //12 月,對應第二字節的 BIT0 位,如果是 1,則月大,如果是 0,則月小 if (temp==0) return(0); else return(1); } case 13: {
temp=YearCode[TableAddr+2]&0x80; //13 月,對應第三字節的 BIT7 位,如果是 1,則月大,如果是 0,則月小 if (temp==0) return(0); else return(1); }
}
}
void Conversion(bit cenbit,unsigned char year,unsigned char month,unsigned char day)
{
unsigned char temp1,temp2,temp3,MonthP;//temp3,temp 4 分別表示春節距元旦的天數,公歷日離元 旦的天數 unsigned int temp4,TableAddr; bit flag2,flag_y; temp1=year/16;
//BCD->hex 先把數據轉換為十六進制 高 位 temp2=year%16; //低 位 year=temp1*10+temp2; //把 年 數據 轉換成 10 進制 temp1=month/16; //月 份 高位 temp2=month%16; //月 份 低位 month=temp1*10+temp2; //把 月 數據 轉換成 10 進制 temp1=day/16; //日 期 高位 temp2=day%16; //日 期 低位 day=temp1*10+temp2; //把 日 數據 轉換成 16 進制 //如果 是 21 世紀 TableAddr=(year+0x64-1)*0x03; //定位數據表地址 year 對應的年份表中 的地址是(year+99)*3 如2010年 其地址是 327 LCDTestWord(0,0x80); LCDSendWord("20");
temp1=YearCode[TableAddr+2]&0x60; //取當年春節所在的公歷月份 年份表中 第三字節 BIT6-5 表示春節的公歷月份 temp1=_cror_(temp1,5); //循環右移 5 位,得到 春節所在的公歷月 份
temp2=YearCode[TableAddr+2]&0x1f; //取當年春節所在的公歷日 年份表中 第三字節 BIT4-0 表示當年春節所在的公歷 日 if(temp1==0x01) // 計算當年春年離當年元旦的天數,春節 只會在公歷 1 月或 2 月 temp3=temp2-1; //假如春節在公歷 1 月,則元旦離春節的天 數為 temp2-1 天
節前 所以為 temp3-temp4 if (year==0x00){year=0x63;cenbit=1;} else year-=1; TableAddr-=0x03; month=0x0c;
temp2=YearCode[TableAddr]&0xf0; // 格式第一字節 BIT7-4 位表示閏月月份,為 0, 則無閏月,BIT3-0 對應陰歷第 1-4 月的大 小, temp2=_cror_(temp2,4); if (temp2==0)MonthP=0x0c; else MonthP=0x0d; // /* MonthP 為月份指向,如果 當年有閏月,一年有十三個月,月指向 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; //農歷年份的十進制數 和取模后的余數 if(cen==0x19) {cenbit=1;} if(cen==0x20) {cenbit=0;}
Conversion(cenbit,year,month,day); //將公歷日期轉換成農歷 LCDTestWord(0,0x94); //顯示在 LCD 的 0X94 位置上
LCDTestWord(1,LunarYear/16+0x30); //農歷年十位
LCDTestWord(1,LunarYear%16+0x30); //農歷年個位 LCDTestWord(1,'-'); //用-隔開
LCDTestWord(1,LunarMonth/16+0x30); //農歷月十位
LCDTestWord(1,LunarMonth%16+0x30); //農歷月個位 LCDTestWord(1,'-'); LCDTestWord(1,LunarDay/16+0x30); //農歷日十位 LCDTestWord(1,LunarDay%16+0x30); //農歷日個位
LunarYearD=(LunarYear/16)*10+LunarYea r%16; //農歷年轉換成 10 進制數 ReYear=LunarYearD%12; //農歷年模 12,取余運算
switch(ReYear) { case 0: LCDTestWord(0,0x93);LCDSendWord("龍 ");break; //余 0 即整除 農歷 龍年 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; } } /***************節假日提示 ********************/
void Holidays(void)
{
LCDTestWord(0,0x98); if(next==0){
if(LunarMonth==0x01&&LunarDay==0x01) {LCDSendWord(" 春節快樂! ");}
if(LunarMonth==0x01&&LunarDay==0x15) {LCDSendWord(" 元宵節快樂! ");}
if(LunarMonth==0x04&&LunarDay==0x18) {LCDSendWord(" 爸爸的生日! ");}
if(LunarMonth==0x05&&LunarDay==0x05) {LCDSendWord(" 端午節快樂! ");}
if(LunarMonth==0x07&&LunarDay==0x07) {LCDSendWord("中國情人節快樂!");}
if(LunarMonth==0x08&&LunarDay==0x15) {LCDSendWord(" 中秋節快樂! ");}
if(LunarMonth==0x08&&LunarDay==0x25) {LCDSendWord("嘿嘿,我又長大了");}
if(LunarMonth==0x09&&LunarDay==0x09) {LCDSendWord(" 重陽節快樂! ");}
if(LunarMonth==0x09&&LunarDay==0x30) {LCDSendWord(" 媽媽的生日! ");}
if(LunarMonth==0x12&&LunarDay==0x08) {LCDSendWord(" 臘八節! ");}
if(LunarMonth==0x12&&LunarDay==0x15) {LCDSendWord(" 過小年啦! ");}
if(LunarMonth==0x12&&LunarDay==0x29) {LCDSendWord("還有一天新年啦!");}
if(LunarMonth==0x12&&LunarDay==0x30) {LCDSendWord("今天就到新年夜了");} //以上是農歷節日,以下是公歷節日 if(month==0x01&&day==0x01)
{LCDSendWord(" 元旦節快樂! ");} if(month==0x02&&day==0x10) {LCDSendWord(" 世界氣象日! ");} if(month==0x02&&day==0x14) {LCDSendWord(" 情人節快樂! ");} if(month==0x03&&day==0x12) {LCDSendWord(" 中國植樹節! ");} if(month==0x04&&day==0x01) {LCDSendWord(" 愚人節快樂! ");} if(month==0x04&&day==0x05) {LCDSendWord(" 中國清明節! ");} if(month==0x04&&day==0x22) {LCDSendWord(" 世界地球日! ");} if(month==0x05&&day==0x01) {LCDSendWord(" 國際勞動節! ");} if(month==0x05&&day==0x04) {LCDSendWord(" 中國青年節! ");} if(month==0x05&&day==0x12) {LCDSendWord(" 世界護士節! ");} if(month==0x06&&day==0x01) {LCDSendWord(" 國際兒童節! ");} if(month==0x06&&day==0x05) {LCDSendWord(" 世界環境日! ");} 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(" 中國建軍節! ");} if(month==0x09&&day==0x10) {LCDSendWord("中國教師節快樂!");} if(month==0x09&&day==0x18) {LCDSendWord("九一八事件紀念日");} if(month==0x09&&day==0x19) {LCDSendWord("西北民族大學校慶");} if(month==0x10&&day==0x01) {LCDSendWord(" 中國國慶節! ");}
if(month==0x10&&day==0x09) {LCDSendWord(" 世界郵政日! ");}
if(month==0x10&&day==0x10) {LCDSendWord("辛亥革命紀念日!");} if(month==0x12&&day==0x20) {LCDSendWord("澳門回歸紀念日!");} if(month==0x12&&day==0x24) {LCDSendWord(" 平安夜快樂! ");} if(month==0x12&&day==0x25) {LCDSendWord(" 圣誕節快樂! ");} else { if(((temp-0.5)/10)>2&((temp-0.5)/ 10)<34){
if(SetKey==1&&SureKey==1&&PlusKey==1& &ReduceKey==1) {
if((hour/16*10+hour%16)>=6&&(hour/16* 10+hour%16)<22)
{ if((hour/16*10+hour%16)>12&&(hour/16 *10+hour%16)<14) LCDSendWord(" 午休時間(^@^)~~"); else LCDSendWord(" 快樂每一天^_^‘’"); }
if((hour/16*10+hour%16)>21||(hour/16* 10+hour%16)<=5) LCDSendWord("夜 深了注意休息喔"); } } if(((temp-0.5)/10)<=2) LCDSendWord("天氣寒冷注意 保暖"); else LCDSendWord("天氣炎熱注意 防暑"); } } } void UpDate(void)
{
DisplayYear(); DisplayMonth(); DisplayDay(); DisplayWeek(); DisplayHour(); DisplayMin(); DisplaySec(); DisplayShengXiao();
} void SetTime(unsigned char count) { char address,item; unsigned char max,mini; if(count<8){ LCDTestWord(0,0x98); LCDSendWord("調整"); if(count==7) {LCDSendWord("秒鐘 請按+ - "); address=0x81; max=59;mini=0;} if(count==2) {LCDSendWord("分鐘 請按+ - "); address=0x83; max=59;mini=0;} if(count==1) {LCDSendWord("小時 請按+ - ");address=0x85; max=23;mini=0;} if(count==5) {LCDSendWord("星期 請按+ - "); address=0x8b; max=7;mini=1;} if(count==3) {LCDSendWord("日期 請按+ - ");address=0x87; max=31; mini=1;} if(count==4) {LCDSendWord("月份 請按+ - "); address=0x89; max=12;mini=1;} if(count==6) {LCDSendWord("年份 請按+ - "); address=0x8d; max=99;mini=0;} item=ReadDs1302(address);//讀取 DS1302 某地址上的數值賦給 item item=(item/16)*10+item%16; if(PlusKey==0) //PlusKey加 { item++; } //數加 1
if(ReduceKey==0) //ReduceKey-減 {item--; } //數減 1 if(item>max) item=mini; //查看數值有效 范圍 if(item<mini) item=max; WriteDs1302(0x8e,0x00); item=(item/10)*16+item%10; WriteDs1302(address-1,item); //將 調整好的 item 值寫入 DS1302 UpDate(); } else{ if(count==8){
LCDTestWord(0,0x01); WriteCommandLCD(0x0c); aa=read_24c02add(30); if(PlusKey==0) //PlusKey

aa++; //數加 1 if(ReduceKey==0) //ReduceKey-減 aa--; write_24c02add(30,aa); LCDTestWord(0,0x80); LCDSendWord("請輸入溫度報警上 "); LCDTestWord(0,0x90); LCDSendWord("限:"); LCDTestWord(0,0x92); LCDTestWord(1,aa/10+0x30); LCDTestWord(1,aa%10+0x30); LCDSendWord("度"); } if(count==9) { bb=read_24c02add(31); WriteCommandLCD(0x0c); if(PlusKey==0) //PlusKey加 bb++; //數加 1 if(ReduceKey==0)
//ReduceKey-減 bb--; write_24c02add(31,bb); LCDTestWord(0,0x88); LCDSendWord("請輸入溫度報警下 限:"); LCDTestWord(0,0x98); LCDSendWord("限:"); LCDTestWord(0,0x9a); LCDTestWord(1,bb/10+0x30); LCDTestWord(1,bb%10+0x30); LCDSendWord("度"); } if(count==10){ cc=read_24c02add(32); LCDTestWord(0,0x01); WriteCommandLCD(0x0c); LCDTestWord(0,0x92); if(PlusKey==0) //PlusKey加 cc++; //數加 1 if(ReduceKey==0) //ReduceKey-減 cc--; write_24c02add(32,cc);
LCDTestWord(0,0x80); LCDSendWord("請設置鬧鐘 1"); LCDTestWord(0,0x93); LCDSendWord("點"); LCDTestWord(0,0x95); LCDSendWord("分"); LCDTestWord(0,0x92); LCDTestWord(1,cc/10+0x30); LCDTestWord(1,cc%10+0x30); LCDTestWord(0,0x94); LCDTestWord(1,dd/10+0x30); LCDTestWord(1,dd%10+0x30); LCDTestWord(0,0x88); LCDSendWord("鬧鐘:"); LCDTestWord(0,0x98); LCDSendWord("設置鬧鐘小時位"); } if(count==11)
{ dd=read_24c02add(33); if(PlusKey==0) //PlusKey

dd++; //數加 1 if(ReduceKey==0) //ReduceKey-減 dd--; write_24c02add(33,dd);
LCDTestWord(0,0x94); LCDTestWord(1,dd/10+0x30); LCDTestWord(1,dd%10+0x30); LCDTestWord(0,0x98); LCDSendWord("設置鬧鐘分鐘位");
} if(count==12) { LCDTestWord(0,0x98); LCDSendWord("設置鬧鐘狀態");
if(PlusKey==0) //PlusKey

mm=1;
if(ReduceKey==0) //ReduceKey-減 mm=0; write_24c02add(34,mm); if(mm==1)
{LCDTestWord(0,0x8b);LCDSendWord("開 ");} if(mm==0)
{LCDTestWord(0,0x8b);LCDSendWord("關 ");} } } }
void Key(void) {
if (SetKey==0) // 設置
時間
{
delay(10); //按鍵消抖 if(SetKey==0&&w==0) //當是正常 狀態時就進入調時狀態 { w=1; //進入調時 SetTime(next); //調整 } if(SetKey==0&&w==1) //當是調時 狀態 本鍵用于調整下一項 { next++; if(next==15) {next= 0;WriteCommandLCD(0x0c);} SetTime(next); //調整 } while(SetKey==0); //等待 鍵松開 }
switch(next) {
case 1: WriteCommandLCD(0x0f); LCDTestWord(0,0x88);break; case 2: WriteCommandLCD(0x0f); LCDTestWord(0,0x8a);break; case 3: WriteCommandLCD(0x0f); LCDTestWord(0,0x85);break; case 4: WriteCommandLCD(0x0f); LCDTestWord(0,0x83);break; case 5: WriteCommandLCD(0x0f); LCDTestWord(0,0x92);break; case 6: WriteCommandLCD(0x0f); LCDTestWord(0,0x81);break; case 7: WriteCommandLCD(0x0f); LCDTestWord(0,0x8c);break; case 8: WriteCommandLCD(0x0f); LCDTestWord(0,0x92);break; case 9: WriteCommandLCD(0x0f); LCDTestWord(0,0x9a);break;
case 10: WriteCommandLCD(0x0f); LCDTestWord(0,0x92);break; case 11: WriteCommandLCD(0x0f); LCDTestWord(0,0x94);break; case 12: WriteCommandLCD(0x0f); LCDTestWord(0,0x8b);break;
} if(SureKey==0) // 當在 調時狀態時就退出調時 { delay(10); //按鍵消抖 if(SureKey==0&&w==1) { w=0; next=0; Holidays(); } while(SureKey==0); //等待鍵松 開 } if (PlusKey==0) //加調整 { delay(10); //按鍵消 抖 if(PlusKey==0&&w==1) { SetTime(next); //調整 } while(PlusKey==0); //等待 鍵松開 }
if (ReduceKey==0) //減調整 { delay(10); //按鍵消

if(ReduceKey==0&&w==1)
{
SetTime(next); //調整
}
while(ReduceKey==0); //等 待鍵松開
}
} void beep() { int i;
uchar hour1,min1,high,low; hour1=read_24c02add(32); min1=read_24c02add(33); high=read_24c02add(30); low=read_24c02add(31); mm=read_24c02add(34); hour=ReadDs1302(0x85)/16*10+ReadD s1302(0x85)%16; min=ReadDs1302(0x83)/16*10+ReadDs 1302(0x83)%16; i=GetTemp()/10.0; //tt=1;
if(mm==1) { LCDTestWord(0,0x87);WriteDataLCD( 0x0e);WriteDataLCD(0x0e); } if(mm==0) {LCDTestWord(0,0x87); WriteDataLCD(0x01);WriteDataLCD(0x01); }
if(((hour>6&&hour<23)&&sec==0&&min==0) &&mm==1) { speak=0; delay(20); speak=1; delay(10); }
if((hour==hour1&&min==min1)&&mm==
1)
{
speak=0; delay(20); speak=1;
delay(10); }
if((i+1>high||i<low)&&mm==1) { speak=0; delay(150); speak=1; delay(50);
}
}
void main() {
SetKey=1; SureKey=1; PlusKey=1; ReduceKey=1; PSB=1; next=0; delayb(100); LCDInit();
LCDClear(); InitDS1302();
while(1) { while(!next){ Key();
WriteCommandLCD(0x0c); DisplayYear(); //顯示年 DisplayMonth(); //顯示月 DisplayDay(); //顯示日 DisplayWeek(); //顯示星期 DisplayHour(); //顯示時 DisplayMin(); //顯示分 DisplaySec(); //顯示秒 Holidays(); //顯示節日 DisplayTemp(); //顯示溫度 beep();
} Key();
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:460043 發表于 2019-1-12 10:11 來自手機 | 只看該作者
感謝各位瀏覽此貼,經過查閱各種資料,已經搞定OK了
回復

使用道具 舉報

板凳
ID:554025 發表于 2019-6-3 19:10 | 只看該作者
溯行 發表于 2019-1-12 10:11
感謝各位瀏覽此貼,經過查閱各種資料,已經搞定OK了

能幫忙修改一個大學論文的51單片機程序嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本五月婷婷 | 国产亚洲精品精品国产亚洲综合 | 免费在线观看一级毛片 | 欧美精品一区二区三区蜜桃视频 | 亚洲视频一区二区三区 | 一本在线 | 成人亚洲 | av毛片| 美女久久久久久久久 | 国产精品7777777 | 九色一区| 中文字幕免费在线 | 日韩有码在线播放 | 欧美一级黄色免费看 | 欧美激情一区二区三区 | 日本一区二区三区免费观看 | 超碰国产在线 | 国产不卡一区 | 日韩a| 蜜桃精品视频在线 | 三级国产三级在线 | 亚洲精色 | 亚洲欧美一区二区三区视频 | 中文福利视频 | 日韩在线一区二区 | 伊人久久精品一区二区三区 | 九九久久精品视频 | 国产毛片久久久 | 国产一区| 国产成人精品一区二区 | 亚洲欧美成人影院 | 午夜视频在线 | 欧美日韩在线电影 | 久久久精品网 | 亚洲一区二区三区在线播放 | 日韩av在线一区二区三区 | 亚洲美女天堂网 | 中文字幕av亚洲精品一部二部 | 亚洲一级av毛片 | 欧美美女爱爱视频 | 九色国产 |