极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15231|回复: 6

键盘输入,我只用一个端口

[复制链接]
发表于 2015-6-11 03:33:12 | 显示全部楼层 |阅读模式
本帖最后由 老来疯 于 2015-6-11 03:37 编辑

一直想做一个小玩意,Arduino 最好学,可是我需要的端口他不够,郁闷很长时间,终于有了想发,

看图说话。

/*
使用一个端口(如: A0,得到 11 个键
2015.06.
*/

void setup()
{
  Serial.begin(9600);     //在监视器看看结果
}
void loop()
{
  delay(500);

  int V1 = analogRead(A0);
  float vol = V1 * (5.0 / 1023.0);    //我们将 V1 的值换算成实际电压值存入浮点型变量 vol
  if ( V1 > 0) {         //  如果 A0 端口大于 0,认为有键按下

    //  ******* 在这做点文章 也许更好 *******
    int m = ( V1 - V1 % 100) / 100;
    // 能加一个 四舍五入的函数,电路就简单,我太菜。
    // 能加一个 map() 函数,就能映射更多的键。
    // A0 端口的值减去他除以100的模,得到整百数,再除以100 得到一位整数,
    // ************
    switch (m) {                     // m 值对应所按的键
      case 0:
        // 对应键值 0 的 程序, 下面可以检查 按键值 和 对应的 电压值
        Serial.print( m );           //  输出 0 键值到 PC ,
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);        //  输出 0 键值的电压值到 PC ,
        break;
      case 1:                         //
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 2:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 3:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 4:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 5:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 6:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 7:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 8:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 9:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;
      case 10:
        Serial.print( m );
        Serial.print("  Pin ;     vol  "  )  ;
        Serial.println(vol);
        break;

    }  // end  switch

  }  // end if

}  // end loop


对不起,图片中有错, R12 应该去掉

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2015-6-11 08:23:19 | 显示全部楼层
有点启发,按照楼主的思路,可以弄一个“按键式的电位器”,上面可以有1024个键,第一个键的值是1,第二个2.。。。。一直到1023,这样也只用得了一个接口,但似乎就用不了组合键了,就算把ctrl,atl等键单独用其他接口来实现,也无法监听同时按下多个字母键的情况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-11 12:57:10 | 显示全部楼层
liyoubin37 发表于 2015-6-11 08:23
有点启发,按照楼主的思路,可以弄一个“按键式的电位器”,上面可以有1024个键,第一个键的值是1,第二个2 ...

我想使用“与”运算即可实现组合键输入,能不能实现1024个键,没有测试过,不过,既然是计算机,用软件的方法应该能解决。但是,硬件的 ADC 分辨率只有 10 比特,再有就是电路的精度和稳定度是最大的障碍。
所以,从实用的角度上来说,应该选择其他方案。学了 Arduino ,不要指望他什么都能干。
回复 支持 反对

使用道具 举报

发表于 2015-6-11 13:08:16 | 显示全部楼层
输入口不够用74HC165扩展,ADC键盘是山寨MP3的做法。太不稳定,按键磨损容易改变阻值出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-11 14:01:40 | 显示全部楼层
Ansifa 发表于 2015-6-11 13:08
输入口不够用74HC165扩展,ADC键盘是山寨MP3的做法。太不稳定,按键磨损容易改变阻值出错

扩展输入口,不如换其他 板, 站在别人的肩膀上去攀登更高的高峰,不太稳定的话,看看是否有办法解决,
应该有解决办法。
回复 支持 反对

使用道具 举报

发表于 2015-6-12 15:09:42 | 显示全部楼层
用久了是会不准的,电阻也有温飘,所以不能弄1024个键那么多。键值读取,也得有一定的容错范围。我弄了个25键的键盘,和楼主的思路差不多。
回复 支持 反对

使用道具 举报

发表于 2015-9-17 22:20:52 | 显示全部楼层
本帖最后由 pumpitup 于 2015-9-17 23:12 编辑

没有电阻的意思是断开还是短接?如果是断开的话感觉不会有电压的样子,如果是连接的话那电容也没用了吧
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 11:15 , Processed in 0.043050 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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