微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSP430F449单片机RTC时钟C语言程序(带闹钟)

MSP430F449单片机RTC时钟C语言程序(带闹钟)

时间:11-27 来源:互联网 点击:
功能:实现软件万年历功能,并自动识别闰年,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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top