功能:
实现软件万年历功能,并自动识别闰年,A屏每显示5秒种就自动切换到B屏,B屏再显示5秒种就自动切换到C屏,C屏再显示5秒种就自动切换到A屏,通过按键在A屏、B屏和C屏之间切换
,可通过按键手动设定和调整时间,当调整时对应调整位要有闪烁功能,有闹钟功能,可设置几点几分闹钟,当前时间等于闹钟时间时,用点亮LED指示,直到某个键(自定义)被按下时,熄灭LED灯
***************************************************/
#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缓冲区
}
}
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