微控技术论坛原创主贴 作者:hwdz
大多电子产品中都需要使用到按键作为操作的界面,无论是电子消费品还是专业设备,几乎都不可避免的需要使用键盘。而键盘的实现有很多种方案,这里就目前常用的几种键盘方案进行一下对比。
就笔者所知,常用的方案有:IO键、阵列键、ADC键、触控键、遥控键以及专用接口键盘等。
IO键,就是一个IO口上通过上拉或下拉的方式实现的按键(如图1A所示),这种按键使用相当广泛,优点是程序处理简单,还可以支持直接中断,多键时还可以实现复键功能,但缺点为键数受IO数量的限制,并且由于所占用的IO需要有中断功能,键数还受到支持中断的IO口数量的限制。若有其它外设也需要使用IO中断,将进一步减少可用的IO键数量。最主要的一点,这种方式的IO利用率{zd1},使得IO资源浪费大,成本较高。所以,IO键适合于在键数不多且要求有独立的中断功能,特别是低功耗应用中使用,当然也可以和其它方案混合使用,比如IO键用于电源开关,而其它方案的键作为开机后的控制键。
阵列键,是通过一组IO口通过对XY两个方向的若干条线的交叉点进行扫描实现的按键方案。例如6个IO可以通过3*3的组合实现9键(如图1B所示),8个IO更可以达到4*4共16个键,键数超过了占用IO的数量,使有限的IO可以支持更多的键数。另外,阵列键也可以支持中断方式工作,不必持续扫描,也可以用在低功耗方案中。在图中我们可见,只有Y轴4条线拥有中断能力即可实现整个键盘的中断控制,而无须像IO键那样每个键都必须可以中断,这样可以省下可中断的IO资源给其它外设。
阵列键的实现有多种不同的形式,最简单的方式中,只要在XY轴的线交叉点上加按钮就可以实现了,但是这种方式的缺点是会有误判,而且很多的阵列键处理程序多采用优先编码的方案,更会导致按羊头出狗肉的结果。原因不仅分析,为了简单的理解这个错误的产生,可以看图1B的结构来分析一下,假设该图中的键依先行后列,先上后下,先左后右的次顺依次为K1-K9,当X1与Y1交点的键按下后,X1与Y1相连,当扫到Y1列时,X1对应IO的电平改变,可以得到K1按下的结论,但当K1、K2同时按下时,Y1和Y2都与X1相连,而K4此时若也按下的话,X2与Y1相连,这样,X2通过Y1连接到X1,再通过X1连接到Y2,成了X2与Y2也导通,这时K5按与不按就没有区别了。为了防止这种情形的出现,我们通常会在键上串联一个1N4148类的开关二极管(见图1C),以防止上述现象的发生,在这种电路中,对角的二极管与检测导通所需的极性刚好相反,所以不会产生误判。
当然阵列键也有很高级的实现方法,一种经典的方法可以用4个IO实现16个键(见图2C),但是由于这种方法需要轮换的交替扫描上下两个三角矩阵,所以无论是否有键按下,都需要定时对键盘进行扫描,而无法使用中断方式实现,但是如果IO很紧张,需要在开机后使用较多键的应用还是可以采取这种方案的。
ADC键,是通过ADC实现的模拟键盘,通过一个ADC输入端口上接入不同电阻分压时产生的ADC值不同来区别按下的键(见图2A)。这种方式实现的时候,只要电阻值设计巧妙,两个甚至N个键同时按下也不会与其它任意键或组合所产生的电阻值相同的话,理论上就可以支持复键功能。但由于阻值小的键与阻值大的键同时按下时,大电阻对小电阻阻值的影响太小,所以并不能很容易实现所有键的复键,只能对部分键实现复键功能。另外,参考电压的稳定性甚至潮湿都将影响ADC对键的识别,所以ADC键需要一个容差的问题,即在预定值的正负一个区间内都认为是这个键,否则将很难触发。ADC键的优点是引出线很少,以至于只需要ADC端和地两条线这么简单,适合于键与主机板分离的方案,若是机器的IO很紧张但有空余ADC资源的场合。不过缺点也是显而易见的,ADC要在不停的扫描中,耗电略大,理想的使用方式就是在不用时将它关闭,所以还需要配合至少一个IO键以实现开关控制,当然如果耗电不列为考虑之中,比如设备是交流供电的,那么ADC键是一种很好的省下IO的方法。一般ADC键在不复键的情况下,每路ADC可以达到5、6个键,而其它方案都无法使用单线达到这么多个键。
手机或MP3上广泛使用的触摸屏可以归为触摸键,其实它是一种ADC键的变形,实际上触摸屏就是两张电阻膜,分别有XY两个电阻轴,当笔或手指触到屏幕上的时候,相当于同时在XY两个电阻上产生一个电阻值的变化,分别处理XY两轴的电阻数据,就可以得到触屏上被触区域的座标值了。所以说,触摸屏也可以看作是2维的ADC键。
触摸键,一般是指电容式的指触键,上边提到过,电阻压感式的通常可以归为ADC键。触摸键是通过检测极板上电容量的变化来实现是否有指触来实现的,所以它可以通过非机械的方式实现按键功能。TI的典型做法是对极片充电,然后通过电阻放电并计时来测定容量的变化(见图2B)。从机械性能上来说,电容指触键是机械寿命最长的一种,就连触摸屏都有粘连和碎裂造成报废的危险,而指触键只要铜皮上的覆盖层不被磨掉,理论上可以不受机械损坏的困扰。但是触摸键由于它所使用的键其实只是一片很小的PCB上的铜皮,电容量很小,所以要求器件的输入阻抗很高,这样对器件的ESD能力要求很高,一旦有静电感应,很有可能烧掉触摸键控制器,在强干扰的场可能也会因为高阻抗接收干扰更强而无法正常工作。另外还有一点缺点,与ADC键一样,由于电容键需要不停的对键的电容量进行检测,所以也无法实现像IO键那样高程度的低功耗,在低功耗产品中,仍需配合IO键使用。
但是也只有触摸屏和触摸键可以实现其它键不能支持的一个高级特性——滑动控制。这两种方案都可以根据用户手指的移动位置、速度变化而实时控制程序中相关参数的变化,比如音量控制,如果使用VOL-和VOL+两个键实现,那么希望快速的改变音量几乎是不可能的,而触摸方式则可以通过手指快速的滑动使音量几乎是立即达到希望到达的强度上,这是其它键控方案无{jd1}无法做到的。
遥控键,就是通过遥控接收解码实现的按键模拟,通常像红外遥控或PT2262的单片机模拟解码都是属于这一类的,收到的信息解码后可以映射到机身上其它方案的键,或是设计的产品只通过遥控来控制的就直接使用遥控解码出来信息进行控制。它与专用接口键盘是类似的,都是遵从一个协议实现的。像PC机上的PS/2键盘,如果用于产品中的话,也可以通过对协议解码实现按键的识别。这一类属于较高级的应用,可以实现更多的键,但占用的IO量都很少,并且有相对好的键控制能力,比如PS/2键盘已经有键盘缓冲区,并且有键的按下和释放消息,也有键的冲突控制,可以省去程序中大量的键处理代码,只要对键的消息进行处理即可。缺点是都无法在键盘部分实现低功耗,只能在不用的时候关闭。
通过以上对比,我们可以看出,不同的按键方案有各自的特色,需求不同的时候,选择也不同。我们可以根据对代码的精简要求、对低功耗的需求、对IO口占用数量的要求、对键盘引出线数的要求、对滑动操作的需求、机械寿命、抗干扰能力等多个方面综合考虑选择哪种键盘,或选择综合利用不同的键盘作为产品的控制方案。