2298|9

530

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

【TI首届低功耗设计大赛】+时钟调整 [复制链接]

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

时钟调整主函数.doc

9.96 KB, 下载次数: 7

最新回复

很详细的帖子,很有参考价值呢  详情 回复 发表于 2014-12-18 13:29

赞赏

1

查看全部赞赏

 
点赞 关注

回复
举报

530

帖子

4

TA的资源

一粒金砂(高级)

沙发
 
哎,帖子写的不好,都没人评论。自己加油了,努力,努力,向前去
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

板凳
 
写得很认真!加油
 
个人签名    懒得很
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

4
 
谢谢鼓励,努力学习
 
 
 

回复

2057

帖子

0

TA的资源

五彩晶圆(初级)

5
 
做的不错,弄点图片或者视频那就改好了
 
 
 

回复

1706

帖子

4

TA的资源

纯净的硅(初级)

6
 
楼主还是用心学了了的,RTC可以直接用了,哈哈哈,我去试试
 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

7
 
IC爬虫 发表于 2014-12-17 19:31
做的不错,弄点图片或者视频那就改好了
有视频的,时间延长了,我准备在完善一下,重新录一个好一点的视频。
 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

8
 
DavidZH 发表于 2014-12-17 22:19
楼主还是用心学了了的,RTC可以直接用了,哈哈哈,我去试试
这个模块很好用的。。。
 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

9
 
11 这个单片机开发板上 自带了时钟晶振,挺准的
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

10
 
很详细的帖子,很有参考价值呢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表