打印
[MSP430]

问下关于键盘检测与定时的问题

[复制链接]
3248|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
wangch_sh| | 2014-9-5 08:39 | 只看该作者
要用定时器

使用特权

评论回复
板凳
ningling_21| | 2014-9-5 08:55 | 只看该作者
不用定时器也可以,时间不太准确...

使用特权

评论回复
地板
zyt2014|  楼主 | 2014-9-5 09:07 | 只看该作者
ningling_21 发表于 2014-9-5 08:55
不用定时器也可以,时间不太准确...

键盘扫描用死循环,不能用delay延时函数,所以只能用中断方式了

使用特权

评论回复
5
旭日东起| | 2014-9-5 09:24 | 只看该作者

要用定时器的

使用特权

评论回复
6
bluesky001| | 2014-9-5 09:30 | 只看该作者
我一直很纳闷,基于时间片的任务调度系统(可以认为比较简单的一个操作系统),既方便也好用,为什么论坛上很少人提起和使用。
对于定时精度不高或者不严格的情况下,可以使用“软件定时器”来实现。下面是一个简化的基于时间片的任务调度系统的实现。
(1)用一个通用定时器产生一个1ms的定时中断,在中断函数中设置标志量,如 Timer0Flag = 1;
(2)主函数中实现一个如下结构,假设
main(void)
{
  if(1 == Timer0Flag)
  {
    Timer0Flag = 0;
    ExecuteTask();
  }
}
在 ExecuteTask();中一般需要对不同时间片的任务进行判断和调度,比如 Task_1ms(), Task_2ms() ; Task_5ms(); Task_10ms()等。
这里简化,就认为只有一个1ms的任务,任务就是扫描键盘 Scan_KeyPad();
ExecuteTask(vodi)
{
     Scan_KeyPad();
}
(3) 所谓的软件定时器,就是在系统已经有1ms中断的定时的情况下,如果你的任务是1ms的,则声明一个变量u16KeyPadTimer,每次任务执行加1,这个变量丢等效于一个定时器
(4)当你监测到第一个键盘按下时,该变量u16KeyPadTimer = 0;每次执行Scan_KeyPad();的时候就监测一次按键,同时判断u16KeyPadTimer是不是小与某个你设定的超时值 KEY_PAD_TIMEOUT_VALUE(这个你可以宏定义一下)。
(5)基本思路就这样了,你自己发挥一下吧。

使用特权

评论回复
7
bluesky001| | 2014-9-5 09:33 | 只看该作者
在main里面刚才漏了一个无限循环
main(void)
{
  for(;;) //不用while(1),否则静态代码检测MISRA C会报警告信息
  {
      if(1 == Timer0Flag)
      {
         Timer0Flag = 0;
         ExecuteTask();
      }
   }
}
其实这种软件定时还有一个最大的好处,就是程序不会一直停在那边,检测完后就可以执行后续的任务,以前很多人等delay(),会把其他的任务就被迫等待了。

使用特权

评论回复
8
zyt2014|  楼主 | 2014-9-5 09:58 | 只看该作者
bluesky001 发表于 2014-9-5 09:30
我一直很纳闷,基于时间片的任务调度系统(可以认为比较简单的一个操作系统),既方便也好用,为什么论坛上 ...

说的很好,谢谢啦

使用特权

评论回复
9
叶伤| | 2014-9-5 11:22 | 只看该作者
bluesky001 发表于 2014-9-5 09:30
我一直很纳闷,基于时间片的任务调度系统(可以认为比较简单的一个操作系统),既方便也好用,为什么论坛上 ...

不是很少人使用。会用基于时间片的都不会再问这种问题。会的人不问这种问题,你自然就觉得很少人使用。论坛那么多人,也就那么几个使用死延迟键扫,但架不住这些人问题多。嘿嘿,有时候表面看到的往往是不真实的。

使用特权

评论回复
10
bluesky001| | 2014-9-5 11:35 | 只看该作者
叶伤 发表于 2014-9-5 11:22
不是很少人使用。会用基于时间片的都不会再问这种问题。会的人不问这种问题,你自然就觉得很少人使用。论 ...

有道理。

使用特权

评论回复
11
falder21| | 2014-9-5 14:26 | 只看该作者
虚拟定时器,推荐Ms3或者MsOS

使用特权

评论回复
12
zyt2014|  楼主 | 2014-9-5 14:45 | 只看该作者
叶伤 发表于 2014-9-5 11:22
不是很少人使用。会用基于时间片的都不会再问这种问题。会的人不问这种问题,你自然就觉得很少人使用。论 ...

STM32的有用时间片,,,430,pic,51这些就不大适合用时间片了吧,人家速度慢没办法

使用特权

评论回复
13
zqjqq88| | 2014-9-5 14:47 | 只看该作者
bluesky001 发表于 2014-9-5 09:30
我一直很纳闷,基于时间片的任务调度系统(可以认为比较简单的一个操作系统),既方便也好用,为什么论坛上 ...

不用肯定是有其中的道理的:
这样会增加按键检测和1ms定时器的耦合度,模块之间应该尽量减少耦合,否则1ms定时器异常按键怎么用?虽然概率比较小。当然如你所说好处也不少的~

使用特权

评论回复
14
ayb_ice| | 2014-9-5 15:01 | 只看该作者
不说不等于没有用,你那个时间标志根本没有必要立马清除
if(1 == Timer0Flag)
  {
    Timer0Flag = 0;
    ExecuteTask();
  }
放在循环最后清除更合理,这样其它任务也可以判断这个标志,甚至可以放在函数内部隐藏起来

这里很多高手是潜水的

使用特权

评论回复
15
xjjspace| | 2014-9-5 15:26 | 只看该作者
ayb_ice 发表于 2014-9-5 15:01
不说不等于没有用,你那个时间标志根本没有必要立马清除
if(1 == Timer0Flag)
  {

有哪个帖子详细讲时间片的任务调度的嘛,我最近在试着用这种思想写代码,总感觉不太对。

使用特权

评论回复
16
ayb_ice| | 2014-9-5 15:44 | 只看该作者
xjjspace 发表于 2014-9-5 15:26
有哪个帖子详细讲时间片的任务调度的嘛,我最近在试着用这种思想写代码,总感觉不太对。 ...

每隔一定时间(滴答)调用函数即可

然后做成可配置的(任务可配置,滴答次数可配置等)一般就可以了

可以在主循环中完成,也可在定时中断完成,各有公优缺点

至于资料有几本书讲这些的

《匠人手记》,《》

使用特权

评论回复
17
ayb_ice| | 2014-9-5 15:44 | 只看该作者
RT:

未命名.jpg (23.27 KB )

未命名.jpg

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xjjspace + 1 赞一个!
18
xjjspace| | 2014-9-5 15:56 | 只看该作者
ayb_ice 发表于 2014-9-5 15:44
RT:

我想起来了,前几天有人发过这本书,单片机入门学习最好的书,没有之一。

使用特权

评论回复
19
tuzihog| | 2014-9-5 16:00 | 只看该作者
关注下

使用特权

评论回复
20
m564522634| | 2014-9-5 16:14 | 只看该作者
bluesky001 发表于 2014-9-5 09:30
我一直很纳闷,基于时间片的任务调度系统(可以认为比较简单的一个操作系统),既方便也好用,为什么论坛上 ...

这样怎么感觉你在定时器里执行了函数,不是怎么好。我觉得还不如建一个任务管理的table表,每个任务分配一个确定的时间了。有任务时间到了table表里置位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

65

帖子

0

粉丝