功用:完成软件万年历功用,并主动识别闰年,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
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;//闹钟小时清零
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/257760.html