日志档案

发表于 2007-11-26 3:54:15

0

标签: 无标签

“零耗时键盘”介绍

出处: http://bbs.21ic.com/club/bbs/showEssence.asp?id=8907

零耗时键盘
hotpower 发表于 11/23/2007 12:29:15 PM 技术交流 ←返回版面 按此给该网友发送邮件 按此察看该网友的资料 按此把文章加入收藏夹

“零耗时键盘”介绍:
    “零耗时”并非不耗时。它主要是将原本需要延时消除键盘抖动的时间转化为
对定时器的计数来替代。这样就可将节约的时间用于对其他事件的处理。
    “零耗时”键盘程序的编写很简单,首先要做到:
1.用总键盘个数除消除键盘抖动的时间20mS.本例有4个键,即20mS/4=5mS.
  所以,定时器0中断时间常数应该定义为5mS.
2.设置1个压键20mS计数器数组KeyPressCount[]。用于对各键盘的压键次数计数。
  由于全部键盘扫描需要20mS,故KeyPressCount[]内的值为20mS的倍数。
3.设置1个键扫描位置计数器KeyCount,用于记录当前键扫描的位置。
  注意键扫描函数KeyScan()每次只扫描1个键(本例即为IRQ_Timer0())。
4.设置1个键扫描键值计数器数组KeyDblCount[],用于记录键值以处理双击状态。
  本例主要讲解“零耗时”键盘程序的编写,一般不主张在MCU系统下用双击键。
  多建议采用长压键来替代双击键。
特别注意:
  “零耗时”键盘程序属于“扫而不描”类型,即每次只扫描1个键而不管其他键
的状态。这样就可在一定的时间范围内“并行”地处理多个键盘事件。
   键扫描位置计数器KeyCount的值就是键盘扫描结果的键值。故也改进了经典的
键扫描函数KeyScan()需要逐次扫描的缺点
  “零耗时”键盘程序只区分键释放,单击键,双击键 和长压键4种基本事件。
区分只简单地判别KeyPressCount[]的个数即可。
1.当无键压下且KeyPressCount[]减到0时,可判别为键释放事件发生。
2.当有键压下且KeyPressCount[]=2时,可认为键已经经过20mS消抖处理,
  即单击键事件发生。
  如果需要双击键处理,则需要附加KeyDblCount[]双击键计数器数组。
3.当有键压下且KeyPressCount[]=3*50时,即3*50*20mS=3S时,认为3S长压键事件发生。
  对“零耗时键盘”的个人应用总结:
在MCU的裸奔中,“零耗时键盘”很容易构成一个基于时间片小型的操作系统。
它可以“并行地”处理多个键盘事件及任务。
它的节拍不是OS常用的10mS,而是20mS消抖时间的1/N份。
由于20mS也做为视觉暂留的时间基准,故在常用的LED+KEY系统中裸奔表现很不错。
如果每个任务都能保证在20mS/N内完成,那么后台程序可以废除,即主程序只是个
死循环。这在低功耗系统中应用很广。

零耗时键盘

 

系统分类: 单片机   |   用户分类: 菜农键盘专栏   |   来源: 原创   |   【推荐给朋友】

    阅读(523)    回复(1)  

投一票您将和博主都有获奖机会!