极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13969|回复: 4

3线 7键, 二进制键盘, 程序超级简单, 没用中断,是缺憾!!!

[复制链接]
发表于 2016-5-27 22:47:00 | 显示全部楼层 |阅读模式
本帖最后由 迷你强 于 2016-5-30 09:52 编辑

2016-2-20 日 发表了一个帖子,  见: 键盘输入新方法,突发奇想
http://www.geek-workshop.com/thread-26146-1-1.html







现在把程序奉上:


  1. /************************************************************************************************
  2. * 实验 二进制 键盘
  3. *
  4. * 使用 1. Arduino 328P ,   2.自己做的 二进制键盘.
  5. *
  6. * 程序功能:  用 D13 脚的 LED 灯显示按键的 健值,
  7. *          1   平时  LED 灯亮 0.1 秒,熄灭 0.1 秒,无限循环.
  8. *          2   当有按键按下时,健值是多少,就长亮(1秒间隔)几下.
  9. *  
  10. * 一个三位二进制数可以表述 0 - 8 的十进制数, 也就是说有 8 个状态,应用于键盘时要去掉一个常态,
  11. * 我把 0 作为常态,剩下数字 1 - 7 就可以刚好对应 1 - 7 号数字键, 方便了编程,节省了程序空间,
  12. * 程序运行速度也快,但是需要轮询键盘. 如果想用 中断 响应键盘也很方便,
  13. *
  14. * 下面是按 Arduino C 方式编的程序,如果直接操作 寄存器, 程序更干练.
  15. **********************************************************************************************/

  16. void setup() {
  17.   
  18.   pinMode(13, OUTPUT);        //  D13 引脚的 LED , 键盘 按 几号键 就长闪(1秒间隔)几下,  然后快闪 .等待键盘响应.

  19.   //***************  定义 键盘 接口 ***************************
  20.   pinMode(9, INPUT);          // 安排了键盘的位 0 ,  
  21.   pinMode(10, INPUT);         // 安排了键盘的位 1 ,  
  22.   pinMode(11, INPUT);         // 安排了键盘的位 2 ,  

  23.    }


  24. void loop() {
  25.   
  26. //********** 下面是 检测键盘 ****************
  27.   int Key_Val ;                                                             // 缓存,二进制键盘的健值,      
  28.   Key_Val =  digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4);      // 读取键盘,就这一句,不需要键盘驱动库
  29.   //Key_Val =  digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4);    // 再读一次 权当延时,这一句不要也不会出错

  30. //********* 根据键盘的值是几,  就 闪几下( 间隔 1 秒 长闪) LED ,  ***************

  31. for(  Key_Val; Key_Val>0; Key_Val--)       // key_Val  是键盘的值
  32. {
  33.   digitalWrite(13, HIGH);                          // LED 点亮
  34.   delay(1000);                  
  35.   digitalWrite(13, LOW);                          // LED 熄灭
  36.   delay(1000);                  
  37. }

  38. //**********   主程序,这里是快闪 *****************
  39.   digitalWrite(13, HIGH);       // LED 点亮
  40.   delay(100);                  
  41.   digitalWrite(13, LOW);        // LED 熄灭
  42.   delay(100);   
  43.   
  44. }

复制代码




这个程序是检验 键盘工作是否正常,  但是这个程序是有缺憾的,  原因是 主程序与键盘是需要轮询检测的,当主程序没有执行完时,
MCU 是没有时间 检测键盘的,所以键盘不是实时的,下面的程序予以验证.



  1. /************************************************************************************************
  2. * 实验 二进制 键盘
  3. *
  4. * 使用 1. Arduino 328P ,   2.自己做的 二进制键盘.
  5. *
  6. * 程序功能:  用 D13 脚的 LED 灯显示按键的 健值,
  7. *          1   平时  LED 灯亮 0.1 秒,熄灭 0.1 秒,无限循环.
  8. *          2   当有按键按下时,健值是多少,就长亮(1秒)几下.
  9. *  
  10. * 一个三位二进制数可以表述 0 - 8 的十进制数, 也就是说有 8 个状态,应用于键盘时要去掉一个常态,
  11. * 我把 0 作为常态,剩下数字 1 - 7 就可以刚好对应 1 - 7 号数字键, 方便了编程,节省了程序空间,
  12. * 程序运行速度也快,因为不需要轮询键盘. 如果想用 中断 响应键盘也很方便,
  13. *
  14. * 下面是按 Arduino C 方式编的程序,如果直接操作 寄存器, 程序更干练.
  15. **********************************************************************************************/

  16. void setup() {
  17.   
  18.   pinMode(13, OUTPUT);        //  D13 引脚的 LED , 键盘 按 几号键 就长闪(1秒间隔)几下,  然后快闪 .等待键盘响应.

  19.   //***************  定义 键盘 接口 ***************************
  20.   pinMode(9, INPUT);          // 安排了键盘的位 0 ,  
  21.   pinMode(10, INPUT);         // 安排了键盘的位 1 ,  
  22.   pinMode(11, INPUT);         // 安排了键盘的位 2 ,  

  23.    }


  24. void loop() {
  25.   
  26. //********** 下面是 检测键盘 ****************
  27.   int Key_Val ;                                                             // 缓存,二进制键盘的健值,      
  28.   Key_Val =  digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4);      // 读取键盘,就这一句,不需要键盘驱动库
  29.   //Key_Val =  digitalRead(9) + (digitalRead(10)*2)+(digitalRead(11)*4);    // 再读一次 权当延时,这一句不要也不会出错

  30. //********* 根据键盘的值 闪几下( 间隔 1 秒 长闪) LED ,  ***************

  31. for(  Key_Val; Key_Val>0; Key_Val--)
  32. {
  33.   digitalWrite(13, HIGH);       // LED 点亮
  34.   delay(1000);                  
  35.   digitalWrite(13, LOW);        // LED 熄灭
  36.   delay(1000);                    
  37. }

  38. //**********   主程序,这里是快闪 *****************
  39.   
  40. for( int i=0;i<=100;i++) {       //  [color=Red]这里加了个 FOR 循环,   让他多闪 一段时间[/color],在此期间,是不响应键盘的.
  41.   digitalWrite(13, HIGH);           // LED 点亮
  42.   delay(100);                  
  43.   digitalWrite(13, LOW);           // LED 熄灭
  44.   delay(100);   
  45.   
  46.   }
  47. }
复制代码


如果不用中断响应键盘, 一般都会有这个问题.



下次 再讲 中断,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-5-28 08:31:37 | 显示全部楼层
想法不错。可是有木有见过跟简单的,用AD来做的,不同的按键对应不同的阻值电压。一个AD的口就解决啦。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-28 17:56:24 | 显示全部楼层
PINKWALKMAN 发表于 2016-5-28 08:31
想法不错。可是有木有见过跟简单的,用AD来做的,不同的按键对应不同的阻值电压。一个AD的口就解决啦。

看我的 另外一帖,       键盘输入,我只用一个端口
http://www.geek-workshop.com/thread-15272-1-1.html

也有新意
回复 支持 反对

使用道具 举报

发表于 2016-5-29 17:09:57 | 显示全部楼层
老来疯 发表于 2016-5-28 17:56
看我的 另外一帖,       键盘输入,我只用一个端口
http://www.geek-workshop.com/thread-15272-1-1.htm ...

按键达人!
回复 支持 反对

使用道具 举报

发表于 2016-5-29 21:22:43 | 显示全部楼层
学习学习学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 07:29 , Processed in 0.052959 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表