今天分享一下我的程序时钟设定部分。我用的是TI官方给予的底层驱动。IAR版本。
大家都知道msp430FR5969launchpad板子上有两个按键。
分别是S1-P4.5,
S2-P1.0。
通过两个按键可以实现时钟的,秒、分、时、周、月、年份的简单设定。
首先我们应该画出简单的流程图,这里楼主我就省略了。
时钟设定规划:
一.按键读取
分为:1.按键端口初始化 2.按键消抖 3.按键读取。三个部分。
1.按键端口初始化
S1-P4.5,S2-P1.0
首先,到GPIO.H中找到程序驱动,然后仿照参数如下:
参考程序: 设定上拉电阻形式的输入。
//Set P1.1andP4.5to input direction with PullUpresistor
GPIO_setAsInputPinWithPullUpresistor(GPIO_PORT_P1,
GPIO_PIN1);
GPIO_setAsInputPinWithPullUpresistor(GPIO_PORT_P4,
GPIO_PIN5);
2.按键消抖
说到按键消抖,本人采用的是51单片机延续下来的delay(),延时程序。
所以大家要保证自己的CPU处于运行状态。及此时不能处于LPM3等关闭CPU的低功耗模式下。
参考程序如下:
void delay(int t)
{
while(t--);
}
主函数中应该这样写:
if (!GPIO_getInputPinValue( GPIO_PORT_P1, GPIO_PIN1))
{
delay(30000);
if (!GPIO_getInputPinValue( GPIO_PORT_P1, GPIO_PIN1))
{
//处理的任务
}
}
3.按键读取
读者可以自行在GPIO.H中查找。
GPIO_getInputPinValue( GPIO_PORT_P1, GPIO_PIN1);
GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5);
二.调整策略
直接上主函数,不知道大家能读懂吗。
S1作为显示界面切换的指针。S2起着调节时钟的作用。
while(1)
{
if (!GPIO_getInputPinValue( GPIO_PORT_P1, GPIO_PIN1)) //S1按键读取
{
delay(30000);
if (!GPIO_getInputPinValue( GPIO_PORT_P1, GPIO_PIN1))
{
GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);//P1.0的led灯作为按键有效按下的提示
display+=1;
if(display==7)display=0;//0 显示,1调秒。2调分。。6调年,//共设定7个显示界面,分别调整
lcd_pos(4,2);
Disp_SZ(display);
}
}
else
{
//if P1.4 set, set P1.0 ,P1.0的led灯作为按键未有效按下的提示
GPIO_setOutputLowOnPin(
GPIO_PORT_P1,
GPIO_PIN0
);
}
switch(display)//由此时display的状态,来进行相应的调节
{
case 0:break;
case 1:if (!GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5))
{ delay(20000);//这个延时决定着调节的快慢
if (!GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5))
{
currentTime.Seconds+=1;
if(currentTime.Seconds>=0x59)currentTime.Seconds=0; //改变秒
RTC_B_calendarInit(RTC_B_BASE,currentTime, RTC_B_FORMAT_BCD); //设定新的秒
newTime = RTC_B_getCalendarTime(RTC_B_BASE);
currentTime=newTime;//加上这句话,时钟就在走的地方开始调,不会出现跳跃。
lcd_pos(3,2);
Disp_SZ(newTime.Hours/16);
Disp_SZ(newTime.Hours%16);
Send(1,'-');
Disp_SZ(newTime.Minutes/16);
Disp_SZ(newTime.Minutes%16);
Send(1,'-');
Disp_SZ(newTime.Seconds/16);
Disp_SZ(newTime.Seconds%16);
}
}
break;
case 2:if (!GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5))
{ delay(20000);
if (!GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5))
{
currentTime.Minutes+=1;
if(currentTime.Minutes>=0x59)currentTime.Minutes=0; //改变分
RTC_B_calendarInit(RTC_B_BASE, currentTime,RTC_B_FORMAT_BCD); //设定新的分
newTime = RTC_B_getCalendarTime(RTC_B_BASE);
currentTime=newTime;//加上这句话,时钟就在走的地方开始调,不会出现跳跃。
lcd_pos(3,2);
Disp_SZ(newTime.Hours/16);
Disp_SZ(newTime.Hours%16);
Send(1,'-');
Disp_SZ(newTime.Minutes/16);
Disp_SZ(newTime.Minutes%16);
Send(1,'-');
Disp_SZ(newTime.Seconds/16);
Disp_SZ(newTime.Seconds%16);
}
}break;
case 3:if (!GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5))
{ delay(20000);
if (!GPIO_getInputPinValue( GPIO_PORT_P4, GPIO_PIN5))
{
currentTime.Hours+=1;
if(currentTime.Hours>=0x24)currentTime.Hours=0;
RTC_B_calendarInit(RTC_B_BASE,
currentTime,
RTC_B_FORMAT_BCD);
newTime = RTC_B_getCalendarTime(RTC_B_BASE);
currentTime=newTime;//加上这句话,时钟就在走的地方开始调,不会出现跳跃。
lcd_pos(3,2);
Disp_SZ(newTime.Hours/16);
Disp_SZ(newTime.Hours%16);
Send(1,'-');
Disp_SZ(newTime.Minutes/16);
Disp_SZ(newTime.Minutes%16);
Send(1,'-');
Disp_SZ(newTime.Seconds/16);
Disp_SZ(newTime.Seconds%16);
}
}break;
case 4:break;
case 5:break;
case 6:break;
default: break;
}
}
看似一个简单的时钟程序,也总会出现很多的故障,不断的调试,不断的学习,是成功的保障。
当我慢慢熟悉TI给出的底层驱动库时,我才领会到官方开发人员的良苦用心,感谢你们提供的底层库,极大的简化了我们的设计流程。
欢迎大家讨论。