[经验] 【TI首届低功耗设计大赛】+时钟调整

传媒学子   2014-12-17 17:57 楼主
今天分享一下我的程序时钟设定部分。我用的是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给出的底层驱动库时,我才领会到官方开发人员的良苦用心,感谢你们提供的底层库,极大的简化了我们的设计流程。
欢迎大家讨论。

回复评论 (9)

哎,帖子写的不好,都没人评论。自己加油了,努力,努力,向前去
点赞  2014-12-17 18:08
写得很认真!加油
    懒得很
点赞  2014-12-17 18:16
引用: zca123 发表于 2014-12-17 18:16
写得很认真!
谢谢鼓励,努力学习
点赞  2014-12-17 18:45
做的不错,弄点图片或者视频那就改好了
点赞  2014-12-17 19:31
楼主还是用心学了了的,RTC可以直接用了,哈哈哈,我去试试
点赞  2014-12-17 22:19
引用: IC爬虫 发表于 2014-12-17 19:31
做的不错,弄点图片或者视频那就改好了
有视频的,时间延长了,我准备在完善一下,重新录一个好一点的视频。
点赞  2014-12-18 12:36
引用: DavidZH 发表于 2014-12-17 22:19
楼主还是用心学了了的,RTC可以直接用了,哈哈哈,我去试试
这个模块很好用的。。。
点赞  2014-12-18 12:37
引用: ruitairt 发表于 2014-12-18 11:36
我们有时钟晶振
11 这个单片机开发板上 自带了时钟晶振,挺准的
点赞  2014-12-18 12:38
很详细的帖子,很有参考价值呢
点赞  2014-12-18 13:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复