10.5 单片机长短按键的应用

本文档展示了如何使用单片机实现矩阵按键的扫描与处理,包括按键映射表、状态检测及消抖处理。同时,文中还涉及到数码管显示和倒计时功能,详细介绍了倒计时的启动、停止、计数器递减以及声光报警的实现。
摘要由CSDN通过智能技术生成
在单片机系统中应用按键的时候,如果只需要按下一次按键加 1 或减 1,那用第 8 章学到的知识就可以完成了,但如果想连续加很多数字的时候,要一次次按下这个按键确实有点不方便,这时我们会希望一直按住按键,数字就自动持续增加或减小,这就是所谓的长短按键应用。

当检测到一个按键产生按下动作后,马上执行一次相应的操作,同时在程序里记录按键按下的持续时间,该时间超过 1 秒后(主要是为了区别短按和长按这两个动作,因短按的时间通常都达到几百 ms),每隔 200ms(如果你需要更快那就用更短的时间,反之亦然)就自动再执行一次该按键对应的操作,这就是一个典型的长按键效果。

对此,我们做了一个模拟定时炸弹效果的实例,提供给大家作为参考。打开开关后,数码管显示数字 0,按向上的按键数字加 1,按向下的按键数字减 1,长按向上按键 1 秒后,数字会持续增加,长按向下按键 1 秒后,数字会持续减小。设定好数字后,按下回车按键,时间就会进行倒计时,当倒计时到 0 的时候,用蜂鸣器和板子上的 8 个 LED 小灯做炸弹效果,蜂鸣器持续响,LED 小灯全亮。
   
   
   
  1. #include <reg52.h>
  2. sbit BUZZ = P1^6;
  3. sbit ADDR3 = P1^3;
  4. sbit ENLED = P1^4;
  5. sbit KEY_IN_1 = P2^4;
  6. sbit KEY_IN_2 = P2^5;
  7. sbit KEY_IN_3 = P2^6;
  8. sbit KEY_IN_4 = P2^7;
  9. sbit KEY_OUT_1 = P2^3;
  10. sbit KEY_OUT_2 = P2^2;
  11. sbit KEY_OUT_3 = P2^1;
  12. sbit KEY_OUT_4 = P2^0;
  13. unsigned char code LedChar[] = { //数码管显示字符转换表
  14. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  15. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  16. };
  17. unsigned char LedBuff[7] = { //数码管+独立 LED 显示缓冲区
  18. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  19. };
  20. unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表
  21. { 0x31, 0x32, 0x33, 0x26 }, //数字键 1、数字键 2、数字键 3、向上键
  22. { 0x34, 0x35, 0x36, 0x25 }, //数字键 4、数字键 5、数字键 6、向左键
  23. { 0x37, 0x38, 0x39, 0x28 }, //数字键 7、数字键 8、数字键 9、向下键
  24. { 0x30, 0x1B, 0x0D, 0x27 } //数字键 0、ESC 键、 回车键、 向右键
  25. };
  26. unsigned char KeySta[4][4] = { //全部矩阵按键的当前状态
  27. { 1, 1, 1, 1}, { 1, 1, 1, 1}, { 1, 1, 1, 1}, { 1, 1, 1, 1}
  28. };
  29. unsigned long pdata KeyDownTime[4][4] = { //每个按键按下的持续时间,单位 ms
  30. { 0, 0, 0, 0}, { 0,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值