查看: 654|回复: 0
打印 上一主题 下一主题

香蕉派一个IO口12个按键

[复制链接] qrcode

29

主题

37

帖子

109

积分

注册会员

Rank: 2

积分
109
楼主
跳转到指定楼层
发表于 2014-10-21 08:42 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

提到按键,大家都很熟悉,随便找个IO口,设置为输入,外面再接个普通按键就行了,最多加上上拉电阻,没有什么新鲜的。没错,这是最简单最保险也是最常用的方法,不过如果我想外接很多个按键,比如十几二十多个怎么办呢?找几十个IO口,引几十根线出来?还是再外接个芯片串行控制?当然可以,可是还要准备外围电路,增加了时间增加了成本。还有没有别的办法呢?有,先看一下自制的神器:


还是按键,呵呵。不过有一点不一样,看到接口了吗?只有3个。除去VCC和GND,那么就剩下一个口了,这一个口可以接收到这么多的按键信号?
确定这个可行之前,还是来看一下A20的手册吧。翻到LRADC章节,有这样一个说明:

虽然很简单的几句话,但是基本上描述清楚了。也就是说,LRADC可以实现这个按键输入的功能。

以前提到过,LRADC是一种低分辨率的模数转换器,精度很低,不过用在按键检测上还是可以的,而且A20也是准备这样来用的。并且它可以支持的中断有:


1.数据变化;
2.Key Down;
3.Key Hold;
4.Already Hold;
5.Key Up;
看到这些,更能够证明LRADC可以用来实现按键的检测。

好了,既然确定可以实现,那就动手准备所需要的东西吧。
1.按键若干,根据自己的需要;
2.万用板一张,大小形状也是根据自己的需要;
3.杜邦线3根,只要3根就够了;
4.香蕉派一块,必须的。

其实原理很简单,就是电阻分压的方式来得到不同的电压,从而判断出不同按键的按下。先来看一下原理图:


这是借用别人的原理图,他的是16个按键,为了保证可用,我减去了4个,原因后面说明。

在输入电压的两遍分别接了若干个电阻,每个电阻对应不同的按键。当有某个按键按下时,根据它前后电阻的阻值不同,来得到这个按键应该产生的电压,输入到LRADC口中检测,用程序来判断它的状态,并告诉系统按下抬起的事件。

原理很简单,但是也有一些需要考虑到的地方:
1.A20 的LRADC最大可检测的电压为2V,所以要保证分压后的电压不能超过2V;
2.A20 的LRADC只有6位,即从0~63共64个数据。2V / 64 = 0.03125V,也就是说,LRADC最小能够检测到的电压变化为0.03V,每个按键按下后的电压差必须要大于0.03V,否则程序没有办法判断出是哪个按键了;
3.香蕉派输出的电压最低的为3.3V,所以要基于3.3V来选择适配的电阻。

为了保证这三点要求,我做了小小的修改:


整个程序的流程就是配置好LRADC相关的寄存器,开始采样后,响应设定的中断,然后才开始读取数据,再根据数据的范围来判断是哪个键按下。不过在试验的时候发现,HOLD和AlrdyHOLD中断不能响应,只有Data、KeyDown、KeyUp可以捕获到。不过已经足够了。如果想判断长按的状态,还是自己加计时吧。

前些日子已经完成了这个程序,结果刚刚没找到,又重新写了个简单的,没有加入过滤,所以出现了重复显示,就当是个展示吧。其实只要响应中断后及时清理就没有问题。当达到最大值时证明是按键抬起,记录上一次按下的按键就可以完全分辨出状态了。

原来做的那个键盘,没有注意到有一个按键是坏的,手感没问题就是连不通,坑爹啊。一怒之下干脆做了个新的,又增加了光感和PWM,同时把走线图放出来供大家参考吧。


做成的效果,包括ADC按键、ADC光感、PWM灯,并且加了个切换开关,可以当作24个键使用。

背面


万用板的走线图,最上面LED旁边少了一个元件,没有找到封装图就空着了,是个8550,直接把三个脚连上就可以。


代码在这里:


链接: http://pan.baidu.com/s/1dDgWRU5 

密码: 8tpr


本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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