定时器扫描按键

定时器每隔20毫秒扫描一次按键

问题:在之前写的按键检测函数中,要在按键按下后用Delay函数进行软件消抖,还要用while(P3_1==0)来判断是否松手,如果长期不松手,则CPU会 卡在该死循环里,不能执行其他代码,造成某些功能代码失效,这次用定时器扫描按键的方法解决该问题

key.c函数

#include <REGX52.H>
unsigned char key_keyNumber;
/*** @brief按键检测,之前要在按键按下后用Delay函数进行软件消抖,还要用while(P3_1==0)来判断是否松手,如果长期不松手,则CPU会   卡在该死循环里,不能执行其他代码* @param无* @retval返回被按下按键的值*/
unsigned char Key_GetState()
{unsigned char keynum = 0;if(P3_1==0){keynum=1;}    //一有按键被按下,标志位keynum立即置位并返回,给key_loop函数处理if(P3_0==0){keynum=2;}if(P3_2==0){keynum=3;}if(P3_3==0){keynum=4;}return keynum;
}
/*** @brief用于返回按键标志位,main函数中调用* @param无* @retval按键标志位*/
unsigned char key_return()
{unsigned char temp = 0;temp = key_keyNumber;key_keyNumber = 0;return temp;
}
/*** @brief每隔20毫秒执行一次该函数,对按键状态进行扫描* @param无* @retval无*/
void key_loop()
{static unsigned char before_state,now_state;before_state = now_state;now_state = Key_GetState();     //获取按键标志位/*1.一开始没按键按下时before_state = 0,now_state = 02.当按键1按下没松开时,now_state = 1,此时before_state = 0,不满足下面任何的判断3.20ms后该函数再次被调用,before_state = now_state = 14.按键1松开,now_state = 0,此时before_state = 1,满足下面第一条if判断,key_keyNumber置1*///上一个状态有按键按下,现在状态没有按键按下,说明处于按下后松手阶段//若if(before_state == 0 && now_state == 1),则是按键按下瞬间为真,标志位置1,不用等    if(before_state == 1 && now_state == 0) {key_keyNumber = 1;    //全局变量key_keyNumber置1,使用key_return函数返回给main函数使用}if(before_state == 2 && now_state == 0)  {key_keyNumber = 2;}if(before_state == 3 && now_state == 0)    {key_keyNumber = 3;}if(before_state == 4 && now_state == 0)    {key_keyNumber = 4;}
}

Timer0.h函数

/*** @brief定时器0初始化函数* @param无* @retval无*/
void Timer0Init()       //1毫秒@11.0592MHz
{TMOD &= 0xF0;     //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0x66;       //设置定时初值TH0 = 0xFC;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时EA = 1;ET0 = 1;
}

main.c函数

#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
unsigned char keyNumber,key_temp;void main()
{Timer0Init();  //初始化定时器while(1){keyNumber = key_return();     //接收按键状态if(keyNumber){key_temp = keyNumber;}NixieTube(1,key_temp); //数码管显示按键对应数值}
}
/*** @brief中断处理函数,每隔20毫秒执行key_loop函数* @param无* @retval无*/
void Timer0() interrupt 1
{static unsigned int count = 0;TL0 = 0x66;TH0 = 0xFC;count++;if(count>20)   //每隔20毫秒调用按键扫描函数{key_loop();count = 0;}
}

优化后的结果:按键按下不放时,数码管数字不会改变,当按键松开时才会变化,这期间CPU并没有卡在死循环里,可以运行其他功能

注意点:中断处理函数中的key_loop函数的实现中不能有Delay函数延时,会打乱原本的中断定时,直译的意思是每隔20毫秒延时x毫秒,显然这是不对的,此外key_loop函数的执行时间也不要大于定时器的时间,不然这一次的函数还没处理完,下一次的中断又来了

51单片机定时器扫描按键相关推荐

  1. 51单片机定时器中断按键消抖(无延时)

    单片机入门学习记录(二) 在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理.按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应 ...

  2. 基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间

    基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间 Proteus仿真 实例代码 #include "at89x52.h" /**74hc595引脚定义 ...

  3. 【51MCU】51单片机定时器中断写MIDI音乐(按键可切换音乐)

    Author: Manba Cople 专业:IOT 说明:记录和输出学习内容 文章目录 前言 定时器 音乐播放 音乐库 总结和展望 前言 程序思路:该程序是利用51单片机的定时器中断,另外根据音符的 ...

  4. 51单片机:独立按键控制数码管计数

    //按键动作的前沿和后沿会都有大约10ms的抖动,人在按下按键到松开至少需要50ms以上(待考证).此代码实现的功能为给按键计数,并给按键消抖 //欢迎邮箱交流:bglei@foxmail.com 作 ...

  5. 51单片机定时器频率计算

    频率是周期的倒数 51单片机定时器中TH与TL可以改变周期来改变频率. 举例如下 3000us=3ms=0.003s   T=0.003s频率=333HZ    2000us=2ms=0.002s   ...

  6. 51单片机定时器及其应用(1)(时钟功能)

    51单片机定时器及其应用(1)(时钟功能)   STC89C51单片机有2个定时器,叫做定时器0和定时器1,可以用作普通定时器,计数器.普通定时器可以用来进行中断定时,波特率发生等,计数器可以用来对脉 ...

  7. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  8. 51单片机定时器(T0/T1)的使用与配置流程

    第一步:配置工作方式寄存器-TMOD TMOD寄存器的字节地址为89H,不能位寻址.一般采用整体赋值的方式进行配置:如:TMOD=0x01 // 0000 0001 GATE=0,定时器仅受TCON寄 ...

  9. 51单片机 玩转按键加减切换+数码管+Proteus仿真

    51单片机 玩转按键加减切换+数码管+Proteus仿真 实例代码 /* 实验说明:实验接线:1,动态数码管模块-->单片机管脚2,独立按键模块-->单片机管脚 K1-->P10K2 ...

最新文章

  1. Python--编码的疑惑
  2. [How TO]-openjrok维护手册
  3. windows 安装 php memcached,Windows安装配置php+memcached的方法
  4. 上海市计算机一级客观题,2012年上海市高校计算机等级考试(一级)模拟卷客观题...
  5. delphi和python比较_Python For Delphi---更好地协同
  6. Apache ActiveMQ教程
  7. 头文件相互包含问题的解决办法
  8. Zabbix 结合 bat 脚本实现多个应用程序状态监控
  9. MongoDB Database Profiling
  10. Android --- GreenDao的实现(ORM框架)
  11. 管网平差c语言编程,给水管网平差计算步骤
  12. 别让孩子遭受“爱的伤害”
  13. SAP CO TCode
  14. linux开热点软件,Debian开WI-FI热点
  15. 在局域网内主动封堵BT下载使用
  16. Unity隐藏目录和隐藏文件
  17. 八佰(800)低代码精耕行业细分领域数字化转型
  18. C++ 内存管理 —— 第一講:C++ 內存構件
  19. ZOU YI BU
  20. 苹果发布iOS 12.5.1,以修复旧设备上的COVID-19暴露通知

热门文章

  1. iOS-国际化脚本工具
  2. 我的世界手机版javaui材质包_我的世界:感受国外顶级3D材质包CreatorCraft
  3. lombok构造模式
  4. FDTD学习之FDTD背景简介及mesh
  5. windows子系统ubuntu远程桌面连接
  6. css+div布局----典型布局基本框架
  7. Rime输入法之五笔自动上屏
  8. 笔记本内存条怎么选?DDR3?DDR3L?
  9. win7 aero效果选项为灰色的处理方法
  10. CC2017常用快捷键整理