|
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar sec,min,hour,day,month,year,week;
bit w;
uchar next;
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void delay(uint ms) // 延時子程序
{
uint a,b,c; //ms=1000為1.015s
for(a=2;a>0;a--)
for(b=46;b>0;b--)
for(c=ms;c>0;c--);
}
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
sbit RES = P2^1;
sbit PSB = P2^0;
sbit sclk=P1^0; //1302串行時鐘
sbit I_O=P1^1; //1302數(shù)據(jù)端口
sbit rst=P1^2; //1302復(fù)位
sbit k1=P3^4; //功能健
sbit k2=P3^5; //時間加
sbit k3=P3^6; //時間減
sbit k4=P3^7; //確定鍵
#define DataPort P0 //單片機(jī) P0<------> 液晶DB0-DB7
uchar code DayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
uint code DayCode2[3]={0x111,0x130,0x14e};
uchar LunarMonth,LunarDay,LunarYear;
bit c_moon;
uchar code YearCode[300]=
{
0x0C,0x96,0x45, //2000 297
0x4d,0x4A,0xB8, //2001 300
0x0d,0x4A,0x4C, //2002 303
0x0d,0xA5,0x41, //2003 306
0x25,0xAA,0xB6, //2004 309
0x05,0x6A,0x49, //2005 312
0x7A,0xAd,0xBd, //2006 315
0x02,0x5d,0x52, //2007 318
0x09,0x2d,0x47, //2008 321
0x5C,0x95,0xBA, //2009 324
0x0A,0x95,0x4e, //2010 327
0x0B,0x4A,0x43, //2011
0x4B,0x55,0x37, //2012
0x0A,0xd5,0x4A, //2013
0x95,0x5A,0xBf, //2014
0x04,0xBA,0x53, //2015
0x0A,0x5B,0x48, //2016
0x65,0x2B,0xBC, //2017
0x05,0x2B,0x50, //2018
0x0A,0x93,0x45, //2019
0x47,0x4A,0xB9, //2020
0x06,0xAA,0x4C, //2021
0x0A,0xd5,0x41, //2022
0x24,0xdA,0xB6, //2023
0x04,0xB6,0x4A, //2024
0x69,0x57,0x3d, //2025
0x0A,0x4e,0x51, //2026
0x0d,0x26,0x46, //2027
0x5e,0x93,0x3A, //2028
0x0d,0x53,0x4d, //2029
0x05,0xAA,0x43, //2030
0x36,0xB5,0x37, //2031
0x09,0x6d,0x4B, //2032
0xB4,0xAe,0xBf, //2033
0x04,0xAd,0x53, //2034
0x0A,0x4d,0x48, //2035
0x6d,0x25,0xBC, //2036
0x0d,0x25,0x4f, //2037
0x0d,0x52,0x44, //2038
0x5d,0xAA,0x38, //2039
0x0B,0x5A,0x4C, //2040
0x05,0x6d,0x41, //2041
0x24,0xAd,0xB6, //2042
0x04,0x9B,0x4A, //2043
0x7A,0x4B,0xBe, //2044
0x0A,0x4B,0x51, //2045
0x0A,0xA5,0x46, //2046
0x5B,0x52,0xBA, //2047
0x06,0xd2,0x4e, //2048
0x0A,0xdA,0x42, //2049
0x35,0x5B,0x37, //2050
0x09,0x37,0x4B, //2051
0x84,0x97,0xC1, //2052
0x04,0x97,0x53, //2053
0x06,0x4B,0x48, //2054
0x66,0xA5,0x3C, //2055
0x0e,0xA5,0x4f, //2056
0x06,0xB2,0x44, //2057
0x4A,0xB6,0x38, //2058
0x0A,0xAe,0x4C, //2059
0x09,0x2e,0x42, //2060
0x3C,0x97,0x35, //2061
0x0C,0x96,0x49, //2062
0x7d,0x4A,0xBd, //2063
0x0d,0x4A,0x51, //2064
0x0d,0xA5,0x45, //2065
0x55,0xAA,0xBA, //2066
0x05,0x6A,0x4e, //2067
0x0A,0x6d,0x43, //2068
0x45,0x2e,0xB7, //2069
0x05,0x2d,0x4B, //2070
0x8A,0x95,0xBf, //2071
0x0A,0x95,0x53, //2072
0x0B,0x4A,0x47, //2073
0x6B,0x55,0x3B, //2074
0x0A,0xd5,0x4f, //2075
0x05,0x5A,0x45, //2076
0x4A,0x5d,0x38, //2077
0x0A,0x5B,0x4C, //2078
0x05,0x2B,0x42, //2079
0x3A,0x93,0xB6, //2080
0x06,0x93,0x49, //2081
0x77,0x29,0xBd, //2082
0x06,0xAA,0x51, //2083
0x0A,0xd5,0x46, //2084
0x54,0xdA,0xBA, //2085
0x04,0xB6,0x4e, //2086
0x0A,0x57,0x43, //2087
0x45,0x27,0x38, //2088
0x0d,0x26,0x4A, //2089
0x8e,0x93,0x3e, //2090
0x0d,0x52,0x52, //2091
0x0d,0xAA,0x47, //2092
0x66,0xB5,0x3B, //2093
0x05,0x6d,0x4f, //2094
0x04,0xAe,0x45, //2095
0x4A,0x4e,0xB9, //2096
0x0A,0x4d,0x4C, //2097
0x0d,0x15,0x41, //2098
0x2d,0x92,0xB5, //2099
};
/***復(fù)位1302***/
void reset1302()
{
sclk=0;
rst=0;
rst=1;
}
/***向1302寫入1字節(jié)***/
void wrieteByte1302(uchar add)
{
uchar i;
for(i=0;i<8;i++)
{
I_O=0;
if(add&0x01)I_O=1;
sclk=0;
sclk=1;
add>>=1;
}
}
void writeClkBye(uchar add,uchar num)
{
reset1302();
wrieteByte1302(add);
wrieteByte1302(num);
}
/***1302初始化***/
void init1302()
{
reset1302();
writeClkBye(0x8e,0); //允許寫入
reset1302();
writeClkBye(0x90,0xaa); //慢充電
reset1302();
writeClkBye(0x80,00); //秒初值
reset1302();
writeClkBye(0x82,0x12); //分
reset1302();
writeClkBye(0x84,0x12); // 時
reset1302();
writeClkBye(0x86,0x04); // 日
reset1302();
writeClkBye(0x88,0x03); // 月
reset1302();
writeClkBye(0x8a,0x07); // 星期
reset1302();
writeClkBye(0x8c,0x12); // 年
reset1302();
}
/***檢測忙位***/
void Check_Busy()
{
RS=0;
RW=1;
E=1;
DataPort=0xff;
while((DataPort&0x80)==0x80);//忙則等待
E=0;
}
/***寫命令***/
void Write_Cmd(unsigned char Cmd)
{
Check_Busy();
RS=0;
RW=0;
E=1;
DataPort=Cmd;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/****寫數(shù)據(jù)***/
void Write_Data(unsigned char Data)
{
Check_Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/****液晶屏初始化***/
void Init_ST7920()
{
DelayMs(40); //大于40MS的延時程序
PSB=1; //設(shè)置為8BIT并口工作模式
DelayMs(1); //延時
RES=0; //復(fù)位
DelayMs(1); //延時
RES=1; //復(fù)位置高
DelayMs(10);
Write_Cmd(0x30); //選擇基本指令集
DelayUs2x(50); //延時大于100us
Write_Cmd(0x30); //選擇8bit數(shù)據(jù)流
DelayUs2x(20); //延時大于37us
Write_Cmd(0x0c); //開顯示(無游標(biāo)、不反白)
DelayUs2x(50); //延時大于100us
Write_Cmd(0x01); //清除顯示,并且設(shè)定地址指針為00H
DelayMs(15); //延時大于10ms
Write_Cmd(0x06); //指定在資料的讀取及寫入時,設(shè)定游標(biāo)的移動方向及指定顯示的移位,光標(biāo)從右向左加1位移動
DelayUs2x(50); //延時大于100us
}
/****從1302讀取***/
uchar ReadByte1302()
{
uchar i;
uchar RByte;
uchar TempByte;
RByte=0x00;
I_O=1;
for(i=0;i<8;i++)
{
sclk=1;
sclk=0;
TempByte=(uchar)I_O;
TempByte<<=7;
RByte>>=1;
RByte|=TempByte;
}
return RByte;
}
uchar read1302(uchar add)
{
uchar num;
reset1302();
wrieteByte1302(add);
ReadByte1302();
num=ReadByte1302();
return num;
}
void LCDTestWord(bit i, uchar word)
{
if(i==0)
{
Write_Cmd(word); //i=0;則寫入指令
}
else
{
Write_Data(word); //i=1;則寫入數(shù)據(jù)
}
}
/***向LCD發(fā)送一個字符串即寫漢字***/
void LCDSendWord(uchar *p)
{
while(*p>0)
{
Write_Data(*p);
p++;
}
}
/***往LCD上填寫 年 月 日 小時 分鐘 秒 星期以及它們的 數(shù)據(jù)***/
void DisplayYear()
{
year=read1302(0x8d); //從1302的0X8D處讀出年數(shù)據(jù)
LCDTestWord(0,0x81); //寫指令 在第一行第二個字符位置顯示 年
LCDTestWord(1,(year/16)+0x30); //寫數(shù)據(jù)
LCDTestWord(1,year%16+0x30); //寫數(shù)據(jù)
LCDTestWord(0,0x82); //寫指令 第一行第三個字符位置
LCDSendWord("年"); //顯示 年 LCD DDRAM第一行地址為80-87,
//第二行為90-97,第三行為88-8F,第四行為98-9F
}
void DisplayMonth()
{
month=read1302(0x89); //從1302中讀取月份數(shù)據(jù)
LCDTestWord(0,0x83); //寫命令
if(month/16!=0)
{
LCDTestWord(1,(month/16)+0x30); //寫數(shù)據(jù)
}
else
{
LCDTestWord(1,0x20); //寫數(shù)據(jù)
}
LCDTestWord(1,month%16+0x30); //寫數(shù)據(jù)
LCDTestWord(0,0x84); //寫指令
LCDSendWord("月"); //顯示 月
}
void DisplayDay()
{
day=read1302(0x87); //從1302中讀取日期數(shù)據(jù)
LCDTestWord(0,0x85);
if(day/16!=0)
{
LCDTestWord(1,(day/16)+0x30);
}
else
{
LCDTestWord(1,0x20);
}
LCDTestWord(1,day%16+0x30);
LCDTestWord(0,0x86);
LCDSendWord("日");
}
void DisplayWeek()
{
week=(read1302(0x8b))%16; //從1302中讀取星期數(shù)據(jù)
LCDTestWord(0,0x95);
LCDSendWord("星期");
LCDTestWord(0,0x97);
if(week==7) {LCDSendWord("日");}
if(week==6) {LCDSendWord("六");}
if(week==5) {LCDSendWord("五");}
if(week==4) {LCDSendWord("四");}
if(week==3) {LCDSendWord("三");}
if(week==2) {LCDSendWord("二");}
if(week==1) {LCDSendWord("一");} //顯示星期一到星期日
}
void DisplayHour()
{
hour=read1302(0x85);
LCDTestWord(0,0x90);
LCDTestWord(1,(hour/16)+0x30);
LCDTestWord(1,hour%16+0x30);
}
void DisplayMin()
{
min=read1302(0x83);
LCDTestWord(0,0x91);
LCDTestWord(1,0x3a); //寫入分割號 :
LCDTestWord(1,(min/16)+0x30);
LCDTestWord(1,min%16+0x30);
LCDTestWord(1,0x3a); //寫入分割號 :
}
void DisplaySec()
{
sec=read1302(0x81);
LCDTestWord(0,0x93);
LCDTestWord(1,(sec/16)+0x30);
LCDTestWord(1,sec%16+0x30);
}
void UpDate()
{
DisplayYear(); //顯示年
DisplayMonth(); //顯示月
DisplayDay(); //顯示日
DisplayWeek(); //顯示星期
DisplayHour(); //顯示時
DisplayMin(); //顯示分
DisplaySec(); //顯示秒
}
void SetTime(uchar count)
{
unsigned char address,item;
unsigned char max,mini;
LCDTestWord(0,0x98);
LCDSendWord("設(shè)置");
if(count==5) {LCDSendWord("秒鐘 ");address=0x81; max=59;mini=0;}
if(count==4) {LCDSendWord("分鐘 ");address=0x83; max=59;mini=0;}
if(count==3) {LCDSendWord("小時 ");address=0x85; max=23;mini=0;}
if(count==6) {LCDSendWord("星期 ");address=0x8b; max=7;mini=1;}
if(count==2) {LCDSendWord("日期 ");address=0x87; max=31; mini=1;}
if(count==1) {LCDSendWord("月份 ");address=0x89; max=12;mini=1;}
if(count==0) {LCDSendWord("年份 ");address=0x8d; max=99;mini=0;}
item=read1302(address);//讀取DS1302某地址上的數(shù)值賦給item
item=(item/16)*10+item%16;
if(k2==0) //加
item++; //數(shù)加 1
if(k3==0) //-減
item--; //數(shù)減 1
if(item>max)
item=mini; //查看數(shù)值有效范圍
if(item<mini)
item=max;
writeClkBye(0x8e,0x00);
item=(item/10)*16+item%10;
writeClkBye(address-1,item); //將調(diào)整好的item值寫入DS1302
UpDate();
}
/*鍵盤掃描*/
void keyscan ()
{
if (k1==0) // 設(shè)置時間
{
DelayMs(10); //按鍵消抖
if(k1==0&&w==0) //當(dāng)是正常狀態(tài)時就進(jìn)入調(diào)時狀態(tài)
{
w=1; //進(jìn)入調(diào)時
SetTime(next); //調(diào)整
}
if(k1==0&&w==1) //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項(xiàng)
{
next++;
if(next>=7) {next= 0;}
SetTime(next); //調(diào)整
}
while(k1==0); //等待鍵松開
}
if(k4==0) // 當(dāng)在調(diào)時狀態(tài)時就退出調(diào)時
{
DelayMs(10); //按鍵消抖
if(k4==0&&w==1)
{
w=0;next=0;
Write_Cmd(0x01); //清除LCD的顯示內(nèi)容
}
while(k4==0); //等待鍵松開
}
if (k2==0) //加調(diào)整
{
DelayMs(10); //按鍵消抖
if(k2==0&&w==1)
{
SetTime(next); //調(diào)整
}
while(k2==0); //等待鍵松開
}
if (k3==0) //減調(diào)整
{
DelayMs(10); //按鍵消抖
if(k3==0&&w==1)
{
SetTime(next); //調(diào)整
}
while(k3==0); //等待鍵松開
}
}
/***開機(jī)畫面***/
void welcome()
{
LCDTestWord(0,0x81);
LCDSendWord("萬年歷設(shè)計(jì)");
LCDTestWord(0,0x91);
LCDSendWord("指導(dǎo):…");
LCDTestWord(0,0x89);
LCDSendWord("制作:…");
LCDTestWord(0,0x99);
LCDSendWord("陽光總在風(fēng)雨后");
}
bit GetMoonDay(uchar LunarMonth,uint TableAddr)
{
uchar temp;
switch (LunarMonth) //LunarMonth指向農(nóng)歷月份
{
case 1:
{
temp=YearCode[TableAddr]&0x08; //1月,對應(yīng)年份表里第一字節(jié)的BIT3位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 2:
{
temp=YearCode[TableAddr]&0x04; //2月,對應(yīng)年份表里第一字節(jié)的BIT2位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 3:
{
temp=YearCode[TableAddr]&0x02; //3月,對應(yīng)第一字節(jié)的BIT1位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 4:
{
temp=YearCode[TableAddr]&0x01; //1月,對應(yīng)第一字節(jié)的BIT0位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 5:
{
temp=YearCode[TableAddr+1]&0x80; //5月,對應(yīng)第二字節(jié)的BIT7位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 6:
{
temp=YearCode[TableAddr+1]&0x40; //6月,對應(yīng)第二字節(jié)的BIT6位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 7:
{
temp=YearCode[TableAddr+1]&0x20; //7月,對應(yīng)第二字節(jié)的BIT5位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 8:
{
temp=YearCode[TableAddr+1]&0x10; //8月,對應(yīng)第二字節(jié)的BIT4位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 9:
{
temp=YearCode[TableAddr+1]&0x08; //9月,對應(yīng)第二字節(jié)的BIT3位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 10:
{
temp=YearCode[TableAddr+1]&0x04; //10月,對應(yīng)第二字節(jié)的BIT2位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 11:
{
temp=YearCode[TableAddr+1]&0x02; //11月,對應(yīng)第二字節(jié)的BIT1位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 12:
{
temp=YearCode[TableAddr+1]&0x01; //12月,對應(yīng)第二字節(jié)的BIT0位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
case 13:
{
temp=YearCode[TableAddr+2]&0x80; //13月,對應(yīng)第三字節(jié)的BIT7位
if (temp==0) return(0); //為0,月小
else return(1); //為1,月大
}
}
}
void Conversion(uchar year,uchar month,uchar day)
{
uchar temp1,temp2,temp3,MonthP;//temp3,temp4分別表示春節(jié)距元旦的天數(shù)
uint temp4,TableAddr; //公歷日離元旦的天數(shù)
bit flag2,flag_y;
temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制 高位
temp2=year%16; //低位
year=temp1*10+temp2; //把 年 數(shù)據(jù) 轉(zhuǎn)換成16進(jìn)制
temp1=month/16; //月份 高位
temp2=month%16; //月份 低位
month=temp1*10+temp2; //把 月 數(shù)據(jù) 轉(zhuǎn)換成16進(jìn)制
temp1=day/16; //日期 高位
temp2=day%16; //日期 低位
day=temp1*10+temp2; //把 日 數(shù)據(jù) 轉(zhuǎn)換成16進(jìn)制
TableAddr=year*0x03; //定位數(shù)據(jù)表地址
LCDTestWord(0,0x80);
LCDSendWord("20");
temp1=YearCode[TableAddr+2]&0x60; //取當(dāng)年春節(jié)所在的公歷月份 年份表中第三字節(jié)BIT6-5表示春節(jié)的公歷月份
temp1=_cror_(temp1,5); //循環(huán)右移5位,得到 春節(jié)所在的公歷月份
temp2=YearCode[TableAddr+2]&0x1f; //取當(dāng)年春節(jié)所在的公歷日 年份表中第三字節(jié)BIT4-0表示當(dāng)年春節(jié)所在的公歷日
if(temp1==0x01) // 計(jì)算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
temp3=temp2-1; //假如春節(jié)在公歷1月,則元旦離春節(jié)的天數(shù)為 temp2-1 天
else
temp3=temp2+0x1f-1; //假如春節(jié)在公歷2月,則無旦離春節(jié)的天數(shù)為 temp2+0x1f-1 天
if (month<10)
temp4=DayCode1[month-1]+day-1; //0到8月某日距元旦的天數(shù)
else
temp4=DayCode2[month-10]+day-1; //9月開始的某一天距元旦的天數(shù)
if ((month>0x02)&&(year%0x04==0)) //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
temp4+=1;
//計(jì)算機(jī)出公歷日距元旦的天數(shù)和春節(jié)距元旦的天數(shù),則是為了比較公歷日是在春節(jié)前還是春節(jié)后
//如果temp3>temp4 則 公歷日在春節(jié)之前
if (temp4>=temp3) //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進(jìn)行運(yùn)算
{
temp4-=temp3; //公歷日離春節(jié)的天數(shù) 因?yàn)楣珰v日在春節(jié)后 所以為temp4-temp3
month=0x01;
MonthP=0x01; //LunarMonth為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日LunarMonth指向首月
flag2=GetMoonDay(MonthP,TableAddr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
flag_y=0;
if(flag2==0) //GetMoonDay()函數(shù)返回的是0
{temp1=0x1d;} //小月29天
else //GetMoonDay()函數(shù)返回的是1
{temp1=0x1e;} //大月30天
temp2=YearCode[TableAddr]&0xf0; //年份數(shù)據(jù)表中第1字節(jié)BIT7-4為閏月,為0則這年無閏月,如為1,表示有閏月
temp2=_cror_(temp2,4); //從數(shù)據(jù)表中取該年的閏月月份,如為0,則該年無閏月 BIT3-0表示陰歷1到4月的大小 1為大 0 為小
while(temp4>=temp1)
{
temp4-=temp1;
MonthP+=1;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0)month+=1;
}
else month+=1;
flag2=GetMoonDay(MonthP,TableAddr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else
{ //公歷日在春節(jié)前使用下面代碼進(jìn)行運(yùn)算
temp3-=temp4; //公歷日離春節(jié)的天數(shù) 因?yàn)楣珰v日在春節(jié)前 所以為temp3-temp4
if (year==0x00){year=0x63;}
else year-=1;
TableAddr-=0x03;
month=0x0c;
temp2=YearCode[TableAddr]&0xf0; //格式第一字節(jié)BIT7-4位表示閏月月份,為0,則無閏月,BIT3-0對應(yīng)陰歷第1-4月的大小,
temp2=_cror_(temp2,4);
if (temp2==0)MonthP=0x0c;
else MonthP=0x0d; //
/* MonthP為月份指向,如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12*/
flag_y=0;
flag2=GetMoonDay(MonthP,TableAddr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
while(temp3>temp1)
{
temp3-=temp1;
MonthP-=1;
if(flag_y==0)month-=1;
if(month==temp2)flag_y=~flag_y;
flag2=GetMoonDay(MonthP,TableAddr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
c_moon=1;
temp1=year/10;
temp1=_crol_(temp1,4);
temp2=year%10;
LunarYear=temp1|temp2;
temp1=month/10;
temp1=_crol_(temp1,4);
temp2=month%10;
LunarMonth=temp1|temp2;
temp1=day/10;
temp1=_crol_(temp1,4);
temp2=day%10;
LunarDay=temp1|temp2;
}
void Displaynongli()
{
uchar LunarYearD,ReYear;
Conversion(year,month,day);
LCDTestWord(0,0x88); //顯示在LCD的0X94位置上
LCDSendWord("農(nóng)歷");
LCDTestWord(1,LunarMonth/16+0x30); //農(nóng)歷月十位
LCDTestWord(1,LunarMonth%16+0x30); //農(nóng)歷月個位
LCDSendWord("月");
LCDTestWord(1,LunarDay/16+0x30); //農(nóng)歷日十位
LCDTestWord(1,LunarDay%16+0x30); //農(nóng)歷日個位
LunarYearD=(LunarYear/16)*10+LunarYear%16; //農(nóng)歷年轉(zhuǎn)換成10進(jìn)制數(shù)
ReYear=LunarYearD%12; //農(nóng)歷年模12,取余運(yùn)算
switch(ReYear)
{
case 0: LCDTestWord(0,0x8e);LCDSendWord("龍年");break; //余0即整除 農(nóng)歷 龍年
case 1: LCDTestWord(0,0x8e);LCDSendWord("蛇年");break; //蛇年
case 2: LCDTestWord(0,0x8e);LCDSendWord("馬年");break;
case 3: LCDTestWord(0,0x8e);LCDSendWord("羊年");break;
case 4: LCDTestWord(0,0x8e);LCDSendWord("猴年");break;
case 5: LCDTestWord(0,0x8e);LCDSendWord("雞年");break;
case 6: LCDTestWord(0,0x8e);LCDSendWord("狗年");break;
case 7: LCDTestWord(0,0x8e);LCDSendWord("豬年");break;
case 8: LCDTestWord(0,0x8e);LCDSendWord("鼠年");break;
case 9: LCDTestWord(0,0x8e);LCDSendWord("牛年");break;
case 10:LCDTestWord(0,0x8e);LCDSendWord("虎年");break;
case 11:LCDTestWord(0,0x8e);LCDSendWord("兔年");break;
}
}
/***主程序***/
main()
{
k1=1;
k2=1;
k3=1;
k4=1;
Init_ST7920();
welcome();
delay(3000);
init1302();
Init_ST7920();
while(1)
{
DisplayYear(); //顯示年
DisplayMonth(); //顯示月
DisplayDay(); //顯示日
DisplayWeek(); //顯示星期
DisplayHour(); //顯示時
DisplayMin(); //顯示分
DisplaySec(); //顯示秒
Displaynongli(); //顯示農(nóng)歷
keyscan(); //鍵盤掃描
}
}
|
|