微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机按键消抖程序

单片机按键消抖程序

时间:11-19 来源:互联网 点击:
单片机执行时间,而是转化成了一种按键状态判定而非按键过程判定,我们只对当前按键的连续 16ms 的 8 次状态进行判断,而不再关心它在这 16ms 内都做了什么事情,那么下面就按照这种思路用程序实现出来,同样只以K4 为例。

纯文本新窗口

  1. #include
  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. sbit KEY1 = P2^4;
  8. sbit KEY2 = P2^5;
  9. sbit KEY3 = P2^6;
  10. sbit KEY4 = P2^7;
  11. unsigned char code LedChar[] = { //数码管显示字符转换表
  12. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  13. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  14. };
  15. bit KeySta = 1; //当前按键状态
  16. void main(){
  17. bit backup = 1; //按键值备份,保存前一次的扫描值
  18. unsigned char cnt = 0; //按键计数,记录按键按下的次数
  19. EA = 1; //使能总中断
  20. ENLED = 0; //选择数码管 DS1 进行显示
  21. ADDR3 = 1;
  22. ADDR2 = 0;
  23. ADDR1 = 0;
  24. ADDR0 = 0;
  25. TMOD = 0x01; //设置 T0 为模式 1
  26. TH0 = 0xF8; //为 T0 赋初值 0xF8CD,定时 2ms
  27. TL0 = 0xCD;
  28. ET0 = 1; //使能 T0 中断
  29. TR0 = 1; //启动 T0
  30. P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平
  31. P0 = LedChar[cnt]; //显示按键次数初值
  32. while (1){
  33. //KeySta = KEY4; //把当前扫描值暂存
  34. if (KeySta != backup){ //当前值与前次值不相等说明此时按键有动作
  35. if (backup == 0){ //如果前次值为 0,则说明当前是弹起动作
  36. cnt++; //按键次数+1
  37. if (cnt >= 10){ //只用 1 个数码管显示,所以加到 10 就清零重新开始
  38. cnt = 0;
  39. }
  40. P0 = LedChar[cnt]; //计数值显示到数码管上
  41. }
  42. //更新备份为当前值,以备进行下次比较
  43. backup = KeySta;
  44. }
  45. }
  46. }
  47. /* T0 中断服务函数,用于按键状态的扫描并消抖 */
  48. void InterruptTimer0() interrupt 1{
  49. //扫描缓冲区,保存一段时间内的扫描值
  50. static unsigned char keybuf = 0xFF;
  51. TH0 = 0xF8; //重新加载初值
  52. TL0 = 0xCD;
  53. //缓冲区左移一位,并将当前扫描值移入最低位
  54. keybuf = (keybuf<1) | KEY4;
  55. //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下
  56. if (keybuf == 0x00){
  57. KeySta = 0;
  58. //连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起
  59. }else if (keybuf == 0xFF){
  60. KeySta = 1;
  61. }
  62. else{
  63. //其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新
  64. }
  65. }

这个算法是我们在实际工程中经常使用按键所总结的一个比较好的方法,介绍给大家,今后都可以用这种方法消抖了。当然,按键消抖也还有其它的方法,程序实现更是多种多样,大家也可以再多考虑下其它的算法,拓展下思路。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top