如何设计一个节约单片机端口资源的键盘电路

新型键盘电路
键盘电路是单片机应用系统最常用的人机接口,往往要占用较多的i/o端口,利用本文介绍的电路,可以最大限度地减少键盘电路对i/o端口的点用。本电路特别适合一些引脚少、结构紧凑的单片机,可为其节省宝贵的i/o资源。
这里以3根i/o线为例,普通接法只能接3个键,即使是采用改进后的组合接法[1],最多也只能接7个链,本文介绍的电路是在组合接法的基础上增加了3个二极管,并采用了新的接法。其软件处理使用了端口访问和扫描检测两种方法,从而使按键数可达到16个,同时由于采用了组合逻辑来直接对端口进行读取,因此极大地简经了程序的处理过程,同时也节省了宝贵的存储器和cpu运算资源。图1是该电路的电路原理图。
2 软件过程和程序
该电路在程序处理时,由处理器首先向i/o1~i/o3写高电平,然后读入。如果非全“1”,说明,k0~k6中有键按下,此时可根据读入的端口状态判断键的状态,如果读入的结果为全“1”,则i/o1~i/o3轮流输出低电平,再读入,这样就可根据另外两根i/o线的状态来判别是k7~k15中的哪一个键被按下。重复调用键盘处理子程序可将读取的键值与上次的值进行比较,甚至两次读数相同为止,这样即可消除按键抖动所造成的误读。该电路选用的单片机为 at89c2051,用c51语言编写的按键电路处理程序如下:
#include《c:eg51.h》
#define uchar unsigned char
uchar getkey(void);
uchar keyvol;
void main(void)
{
keyvol=getkey(); /*调用键处理函数,返回的数据等于16表示同有键按下,0至15对应k0至k15*/
}
以下为键盘处理子程序:
uchar getkey(void)
{
uchar x
p1=p1|0x07; /*i/o1至i/o3写“1”*/
xp1&0x07; /*读入i/o1至i/o3并屏蔽其它位*/
if(x= =10)
{
p1=p1|0x07;
p1=p1&0xfd; /*i/o2写“0”*/
x=p1&0x07;
x=(x+1)/2+10; /*屏蔽i/o2并转换k10至k12的键值*/
if(x = =13)
{
p1=p1|0x07;
p1=p1&0xfb; /*i/o3写“0”*/
x=p1&0x07;
x=x+13; /*屏蔽i/o3并转换k13至k15的键值*/
}
}
}
return x;
}
利用该键盘电路并根据逻辑组合原理可推断开n条i/o线可组合的按键数n为:
n=(2n-1)+(2 n-1 -1)n
表1给出了2至4条i/o线可组合的按键数。
表1 2~4条i/o线可组合的按键数
i/o线 可组合按键
2 5
3 16
4 43
3 结束语
这种新型键盘电路在使用时非常稳定可靠,节省大量的i/o端口,而且程序处理也很简洁,速率比4×4的扫描式电路还要快,因此,该电路特别适合一些引脚较少的单片机,如pic12c508、z86e03以及at89c2051等。

物联网在智能家居中都有哪些应用场景?
EPS电源割接的基础原则是怎样的
小米6发布会直播预告:小米6发布会直播地址、平台、亮点提前知道,小米6你值得等待
机器人对于儿童安全的教育与防护来说有很大的发展空间
基于体积图像数据剖面密度自动搜索路线的主动漫游
如何设计一个节约单片机端口资源的键盘电路
喷墨打印机打印头撞击故障的处理
带嵌入式MCU的8通道12位AD转换器ADuC812及其应用
农村为什么要发展光伏发电,有哪些优势?
大学毕业设计一席谈之四十八 词频统计(1)
变频无线发射机系统电路设计详解 —电路图天天读(188)
Synaptics拓展语音生态系统,支持微软Cortana集成
TMC2160大功率步进电机驱动板-CAN总线
如何处理中性点接地电阻柜漏电现象
PS2键盘编码Verilog源程序分享
科学家成功开发出自旋转移矩-磁性随机存储器
FANUC系统的数控机床过热故障如何检修
北斗+人工智能,打造极致出行体验
示波器实现高速全方位分析
如何做好一名高级维修工