功能:實現軟件萬年歷功能,并自動識別閏年,A屏每顯示5秒種就自動切換到B屏,B屏再顯示5秒種就自動切換到C屏,C屏再顯示5秒種就自動切換到A屏,通過按鍵在A屏、B屏和C屏之間切換,可通過按鍵手動設定和調整時間,當調整時對應調整位要有閃爍功能,有鬧鐘功能,可設置幾點幾分鬧鐘,當前時間等于鬧鐘時間時,用點亮LED指示,直到某個鍵(自定義)被按下時,熄滅LED燈***************************************************/
本文引用地址:http://butianyuan.cn/article/201611/322546.htm#include
unsignedcharcnt;//計數器
unsignedchartian;//天寄存器
unsignedcharkey_code;//按鍵值
unsignedcharflag;//換屏標志位
unsignedchartwinkle_num;//閃爍標志位
unsignedcharfunction_flag;//加減功能標志位
unsignedcharfunction_ping1,function_ping2,function_ping3;//每屏閃爍位
unsignedcharchange_num;//閃屏時間定時
unsignedcharchange_ping;//三屏計數位
unsignedcharclock_flag;//鬧鐘標志位
unsignedcharping_flag;//按鍵跟蹤閃屏標志位
unsignedcharnum_flag;//按鍵計數閃屏標志位
unsignedchartian_flag;//天判斷標志位
unsignedcharrun_flag;//閏年判斷標志位
unsignedintkey_num=150;//按鍵消逗延時時間
unsignedintyear=2008;//年
unsignedcharmonth=2;//月
unsignedcharday=28;//日
unsignedcharhour=23;//小時
unsignedcharmin=59;//分
unsignedcharsec=57;//秒
unsignedcharnao_hour=0;//鬧鐘時
unsignedcharnao_min=0;//鬧鐘分
unsignedcharnao_sec=0;//鬧鐘秒
constunsignedchartianshu[13]=
{0,31,28,31,30,31,30,31,31,30,31,30,31};//每月天數表
chardigit[12]=//液晶顯示段碼表
{
0x7b,
0x12,
0x4f,
0x1f,
0x36,
0x3d,
0x7d,
0x13,
0x7f,
0x3F,
0x00
};
voidinit_clk(void);//初始化時鐘
voidkey_scan(void);//按鍵掃描
voidkey_value(void);//按鍵值確定
voidrtc(void);//時鐘掃描函數
voidrtc_show(void);//rtc掃描函數
voidleap_year(void);//閏年判定函數
voidmain(void)
{
init_clk();//時鐘初始化
while(1)
{
key_scan();//按鍵掃描
key_value();//鍵值確定
rtc_show();//RTC顯示
leap_year();//閏年判定
if((sec==nao_sec)&&(min==nao_min)&&(hour==nao_hour))//鬧鐘判定
{
clock_flag=1;//鬧鐘標志位置一
}
}
}
voidinit_clk(void)
{
unsignedchari;
WDTCTL=WDTPW+WDTHOLD;//關閉看門狗
FLL_CTL0|=XCAP14PF;//選擇14PF電容
IE2|=BTIE;//開啟基本定時器中斷
BTCTL=BT_ADLY_250+BTFRFQ1;//250ms16分頻
LCDCTL=LCDON+LCD4MUX+LCDP2;//STKLCD4Mux,S0-S14
P5SEL=0xFC;//選擇P5口第二功能
P1DIR|=0x01;//P1.0選擇輸出
_EINT();//開總中斷
for(i=0;i<19;i++)
{
LCDMEM[i]=0;//清LCD緩沖區(qū)
}
}
voidkey_scan(void)
{
staticunsignedintnum;//按鍵消抖計數器
if((P1IN&0x0e)!=0x0e)//如果不等于表示有鍵按下
{
num++;//消逗計數器加
key_code=0;//鍵值清零
}
else
{
num=0;//按鍵抖動,鍵值清零
key_code=0;//鍵值清零
}
if(num==key_num)//鍵值確定
{
num=0;//消逗寄存器清零
twinkle_num=0;//閃爍清零
key_code=((P1IN&0x0e)>>1)^0x07;//鍵值轉換
}
}
voidkey_value(void)
{
if(key_code==0x01)//第一個鍵被按下
{
function_flag=1;//功能鍵標志位置一
clock_flag=2;//關閉鬧鐘
if(change_ping==0)//第一屏
{
function_ping1++;//數值閃爍加
if(function_ping1==4)//閃爍到第三位
{
if(tian_flag==1)
{
function_ping1=1;//
}
else
{
function_ping1=0;//清零
function_flag=0;//功能鍵清零
}
}
change_num=0;//換屏計數器
}
if(change_ping==1)//第二屏
{
function_ping2++;//數值閃爍加
if(function_ping2==4)
{
function_ping2=0;
function_flag=0;//清零//功能標志位清零
}
change_num=20;//換屏時間計數器
}
if(change_ping==2)//第三屏
{
function_ping3++;//數值閃爍加
if(function_ping3==4)
{
function_ping3=0;//清零
function_flag=0;//功能標志位清零
}
change_num=40;//換屏計數器
}
}
if((key_code==0x02)&&(function_flag==1))//加法
{
clock_flag=2;//關閉鬧鐘
if(function_ping2==1)//秒閃爍
{
sec++;//秒加
if(sec==60)//秒是否等于60
sec=0;//秒數清零
}
if(function_ping2==2)//分閃爍
{
min++;//分加
if(min==60)//分是否等于60
min=0;//分清零
}
if(function_ping2==3)//小時閃爍
{
hour++;//小時加
if(hour==24)//小時是否等于24
hour=0;//小時清零
}
if(function_ping1==1)//日閃爍
{
day++;//日加加
if(day>tian)//日是否大于天
day=1;//日等于1
}
if(function_ping1==2)//月閃爍
{
month++;//月加加
tian=tianshu[month];
if(day>tian)
{
tian_flag=1;
}
else
tian_flag=0;
if(month==13)//月是否等于13
month=1;//月等于1
}
if(function_ping1==3)//年閃爍
{
year++;//年加加
if((year%4!=0)||(year0!=0)||(year@0==0))
{
tian=tianshu[month];
if(day>tian)
{
tian_flag=1;
}
else
tian_flag=0;
}
if(year==2100)//年是否等于2100
year=2000;//年到2000
}
if(function_ping3==1)//鬧鐘秒閃爍
{
nao_sec++;//鬧鐘秒加加
if(nao_sec==60)//鬧鐘秒是否等于60
nao_sec=0;//鬧鐘秒清零
}
if(function_ping3==2)//鬧鐘分閃爍
{
nao_min++;//鬧鐘分加加
if(nao_min==60)//鬧鐘分是否等于60
nao_min=0;//鬧鐘分清零
}
if(function_ping3==3)//鬧鐘小時閃爍
{
nao_hour++;//鬧鐘小時加加
if(nao_hour==24)//鬧鐘小時是否等于24
nao_hour=0;//鬧鐘小時清零
}
}
評論