孔宪青
摘要:介绍了一种C51下的按键检测方式,并给出了程序的运行方法。
关键词:节拍控制;按键检测
中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2014)34-8154-02
用C语言在Keil软件上进行单片机程序的编辑是常用的,其中按键检测是必须的。传统的最简单的按键检测就是使用延时去抖动,而去抖动的10ms左右时间是必须要通过指令来执行的。通过一个定时器能实现的单片机节拍控制是无操作系统下最简单的任务管理模式,如果按键检测也使用这个节拍,可以使这10ms的时间也节省出来,可提高了CPU的运行效率,缩短了总线周期。
1 节拍控制实现对程序的事件处理和并行时序分配
通过状态机检测按键,必须使用节拍控制。状态机不是连续的时间单位,它是以事件为中心的编程思想。因此必须把检测按键变成事件来处理,而节拍控制是单片机实现多任务处理最好的方式,因此按键检测就可以融合到节拍控制中。Main.c文件内部while(1){……}采用一个定时中断来产生节拍,例如AT89S52的16位定时器T2,设置T2为自动重装,然后每5ms产生一个节拍。这样在程序前台[1]有一个节拍来控制任务的执行。见下面程序:
1) 定义节拍 char beat[3]=0; //全局节拍的个数由并行模块的数量决定
2) 设置节拍
3) 中断方式激活节拍
4) 控制并行模块while(1)
节拍控制要占用一个定时器产生节拍,定时器设置为低级。通过节拍的并行模式不是一个真正的并行结构。单片机指令执行是串行的,但宏观上节拍的引入,使事件或任务的发生仅仅出现在时间轴的点上,任务就类似并行序列。
2 按键的检测
传统按键检测就是加延时去掉抖动。类似这样的:if(kex){ delay(xxx);if(key){……}}。状态机检测按键是要求利用节拍来检测,节拍如果5ms一次。那么当检测到按键的第一次数值进行保存,当第二次节拍到来时候,再去检测。比较前后两次的键值,如果相同则进入任务执行。因为这时候的去抖动是靠节拍的间隔来是实现的,中间这段时间别空闲给CPU利用。对于按键来说,是通过状态机方式来运行的状态机检测方式,具体运行模式见状态机结构图1:
3 结束语
按键检测是智能仪表最常用的,在快速响应的场合按键的检测需要浪费10~20ms的时间,如果按键很多,势必造成大量无用的延时。该文从状态机编程思想出发,介绍在节拍控制下如何组织和检测按键,使用了并行程序设计中的状态机思想。其中要点是建立状态机函数,这种组织形式为类似的程序处理也提供了参考。
参考文献:
[1] 侯殿有. 基于八位单片机的C语言程序设计[M]. 北京:北京大学出版社,2012.endprint
摘要:介绍了一种C51下的按键检测方式,并给出了程序的运行方法。
关键词:节拍控制;按键检测
中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2014)34-8154-02
用C语言在Keil软件上进行单片机程序的编辑是常用的,其中按键检测是必须的。传统的最简单的按键检测就是使用延时去抖动,而去抖动的10ms左右时间是必须要通过指令来执行的。通过一个定时器能实现的单片机节拍控制是无操作系统下最简单的任务管理模式,如果按键检测也使用这个节拍,可以使这10ms的时间也节省出来,可提高了CPU的运行效率,缩短了总线周期。
1 节拍控制实现对程序的事件处理和并行时序分配
通过状态机检测按键,必须使用节拍控制。状态机不是连续的时间单位,它是以事件为中心的编程思想。因此必须把检测按键变成事件来处理,而节拍控制是单片机实现多任务处理最好的方式,因此按键检测就可以融合到节拍控制中。Main.c文件内部while(1){……}采用一个定时中断来产生节拍,例如AT89S52的16位定时器T2,设置T2为自动重装,然后每5ms产生一个节拍。这样在程序前台[1]有一个节拍来控制任务的执行。见下面程序:
1) 定义节拍 char beat[3]=0; //全局节拍的个数由并行模块的数量决定
2) 设置节拍
3) 中断方式激活节拍
4) 控制并行模块while(1)
节拍控制要占用一个定时器产生节拍,定时器设置为低级。通过节拍的并行模式不是一个真正的并行结构。单片机指令执行是串行的,但宏观上节拍的引入,使事件或任务的发生仅仅出现在时间轴的点上,任务就类似并行序列。
2 按键的检测
传统按键检测就是加延时去掉抖动。类似这样的:if(kex){ delay(xxx);if(key){……}}。状态机检测按键是要求利用节拍来检测,节拍如果5ms一次。那么当检测到按键的第一次数值进行保存,当第二次节拍到来时候,再去检测。比较前后两次的键值,如果相同则进入任务执行。因为这时候的去抖动是靠节拍的间隔来是实现的,中间这段时间别空闲给CPU利用。对于按键来说,是通过状态机方式来运行的状态机检测方式,具体运行模式见状态机结构图1:
3 结束语
按键检测是智能仪表最常用的,在快速响应的场合按键的检测需要浪费10~20ms的时间,如果按键很多,势必造成大量无用的延时。该文从状态机编程思想出发,介绍在节拍控制下如何组织和检测按键,使用了并行程序设计中的状态机思想。其中要点是建立状态机函数,这种组织形式为类似的程序处理也提供了参考。
参考文献:
[1] 侯殿有. 基于八位单片机的C语言程序设计[M]. 北京:北京大学出版社,2012.endprint
摘要:介绍了一种C51下的按键检测方式,并给出了程序的运行方法。
关键词:节拍控制;按键检测
中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2014)34-8154-02
用C语言在Keil软件上进行单片机程序的编辑是常用的,其中按键检测是必须的。传统的最简单的按键检测就是使用延时去抖动,而去抖动的10ms左右时间是必须要通过指令来执行的。通过一个定时器能实现的单片机节拍控制是无操作系统下最简单的任务管理模式,如果按键检测也使用这个节拍,可以使这10ms的时间也节省出来,可提高了CPU的运行效率,缩短了总线周期。
1 节拍控制实现对程序的事件处理和并行时序分配
通过状态机检测按键,必须使用节拍控制。状态机不是连续的时间单位,它是以事件为中心的编程思想。因此必须把检测按键变成事件来处理,而节拍控制是单片机实现多任务处理最好的方式,因此按键检测就可以融合到节拍控制中。Main.c文件内部while(1){……}采用一个定时中断来产生节拍,例如AT89S52的16位定时器T2,设置T2为自动重装,然后每5ms产生一个节拍。这样在程序前台[1]有一个节拍来控制任务的执行。见下面程序:
1) 定义节拍 char beat[3]=0; //全局节拍的个数由并行模块的数量决定
2) 设置节拍
3) 中断方式激活节拍
4) 控制并行模块while(1)
节拍控制要占用一个定时器产生节拍,定时器设置为低级。通过节拍的并行模式不是一个真正的并行结构。单片机指令执行是串行的,但宏观上节拍的引入,使事件或任务的发生仅仅出现在时间轴的点上,任务就类似并行序列。
2 按键的检测
传统按键检测就是加延时去掉抖动。类似这样的:if(kex){ delay(xxx);if(key){……}}。状态机检测按键是要求利用节拍来检测,节拍如果5ms一次。那么当检测到按键的第一次数值进行保存,当第二次节拍到来时候,再去检测。比较前后两次的键值,如果相同则进入任务执行。因为这时候的去抖动是靠节拍的间隔来是实现的,中间这段时间别空闲给CPU利用。对于按键来说,是通过状态机方式来运行的状态机检测方式,具体运行模式见状态机结构图1:
3 结束语
按键检测是智能仪表最常用的,在快速响应的场合按键的检测需要浪费10~20ms的时间,如果按键很多,势必造成大量无用的延时。该文从状态机编程思想出发,介绍在节拍控制下如何组织和检测按键,使用了并行程序设计中的状态机思想。其中要点是建立状态机函数,这种组织形式为类似的程序处理也提供了参考。
参考文献:
[1] 侯殿有. 基于八位单片机的C语言程序设计[M]. 北京:北京大学出版社,2012.endprint