单片机按键连接方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
------------------- 看磊诫呎 ....... ....... .....
单片机按键连接方法总结(五种按键扩展方案详细介绍)
单片机在各种领域运用相当广泛,而作为人机交流的按键设计也有很多种。
不同的设 计方法,有着不同的优缺点。
而又由于单片机 I/O 资源有限,如何用最少的 I/O 口扩展更多
的按键是我所研究的问题。
接下来我给大家展示几种自己觉得比较好的按键扩展方案,
大家
可以在以后的单片机电路设计中灵活运用。
1)、第一种是最为常见的,也就是一个 I/O 口对应一个按钮开关。
GND
这种方案是一对一的, 一个I/O 口对应一个按键。
这里P00到P04,都外接了一个上拉 电阻,在没
有开关按下的时候,是高电平,一旦有按键按下,就被拉成低电平。
这种方案优 点是电路简单可靠,程序设计也很简单。
缺点是占用 I/O 资源多。
如果单片机资源够多,不
紧缺,推荐使用这种方案。
2)、第二种方案也比较常见,但是比第一种的资源利用率要高,硬件电路也不复杂。
P0.0
P0-1
P0.2
P0,3
o
■0 0
S2
O O
这是一种矩阵式键盘,用 8个I/O 控制了 16个按钮开关,优点显而易见。
当然这种电路的
程序设计相对也还是很简单的。
由
P00到P03循环输出低电平,然后检测
P04到P07的状
态。
比方说这里 P00到P03 口输出1000,然后检测P04到P07,如果P04为1则说明按下 的键为si ,如果P05为1则说明按下的是s2等等。
为了电路的可靠,也可以和第一种方案 一样加上上拉电阻。
3)、第三种是我自己搞的一种方案,可以使用
4个I/O 控制8个按键,电路多了一些
二极管,稍微复杂了一点。
POO
S1
S2
'
S3
―■—
■
1 ------------ O --------------------------- -------- o
d ------------
------- &
o ------------
S4
< ----- -
56
S10
S8
S12
o o-
S16
PQ O
S7
S5
POI
o
811
P02
□
P03
P04
------------------- 磊册时——... .... .... ..
这个电路的原理很简单,就是利用二极管的单向导电性。
也是和上面的方案一样,程序需要
采用轮训的方法。
比方说,先置P00到P03都为低电平,然后把P00置为高电平,接着查
询P02和P03的状态,如果P02为高则说明按下的是S5,若P03为高则说明按下的是S6, 然后再让P00为低,P01为高,同样检测P02和P03的状态。
接下来分别让P02和P03为高,其他为低,分别检测P00和P01的状态,然后再做判断。
这种方案的程序其实也不难。
4)这是我在一本书上看到的,感觉设计的非常巧妙,同样它也用到了二极管,不过比
我的上一种方案的I/O利用率更高,他用4个I/O 口控制了12个按键。
我相信你了解了之后也会惊奇的。
S13
bl □ g, sin a- c OITI-
cn/iob ?
首先好好品味一下这个方案吧,想想怎么来识别按键呢!
首先,我们让P00到P03全输出高电平。
如果这个时候从P00到P03的任意一个端口
检测到低电平,很容易知道是按下了那个键,肯定是S13到S16的其中一个。
如果没有检测
到信号,就进行下一次的检测,让P01到P03为高电平,P00为低电平,然后检测P01至U
P03的状态。
如果P01为低,则按下的是si,; P02为低,则按下的是s2; P03为低,则按下的是S3。
然后再让P00, P02, P03为高电平,P01为低电平。
同理用上面的方法可以检测出按
下的那个按键。
(部分程序源代码会在后面贴出来,阅读代码可以更好理解电路)
5)、接下来这种方案则更为强大。
不过需要用到一个A/D转换器(有的单片机集成有
A/D转换器,则更为方便)。
如果A/D转化器的分辨率为n位,理论上是可以扩展25 (2 的n次方)个按键。
------------------- 布話吻吋 . ..... ....... ...
方武一 blog. >jri eLODrfLcri/hb=fULJ
这是一种接AD 转化器的方案,有两种:第一种是并联式;第二种是串联式。
在功能上也 有些不同。
第一种的话各个电阻值各不相同, 当按下不同按键时, 进入AD 的模拟量是不一
样的,通过AD 转换,就可以得到按下的是哪个按键。
方式一还可以同时识别多个按键,即 可以设置组合键,只要电阻取得
合适。
方式二各个电阻可以取一样的,
方便计算,但是不能有组合按键。
因为当按下上面的按键后,
下面所有按键都会被短路。
(在实际运用中,还需要接地,这里没有画出)。
前面说理论
上可以扩展25个按键,这只是理论,因为这里电阻的精度有限,所以实际是不可能的,两 个模拟量之间要有足够大的差值,程序才可能准确的分辨。
上面就是我介绍的五种按键扩展方案, 上电路我都仿真过,可以实现。
附方案4键盘扫描源代码:
sbit line_仁 P0.1; sbit lin e_2=P0.2; sbit lin e_3=P0.3; sbit line 4=P0.4 char key=0;
Kii 赛如嘩換器 ■ —
.■ ■(>
a
S1
VCC
T E>
H
R12
R.14
方式二
后面几种比较另类,不过也有他们的优点。
以
------------------- 时磊5说----- - ---- -------
void key_sca n()
{
lin e_1=li ne_2=li ne_3=li ne_4=1;
if(~(li ne_1&&line_2&&line_3&&lin e_4))
{
if(line_1==0) {key=13;return;}
if(li ne_2==0) {key=14; return;}
if(line_3==0) {key=15;return;}
if(li ne_4==0) {key=16; return;}
}
lin e_2=li ne_3=li ne_4=1;
line_仁0;
if(~(li ne_2&&li ne_3&&li ne_4))
{
delay();
if(line_2==0) {key=1;return;}
if(line_3==0) {key=2;return;}
if(line_4==0) {key=3;return;}
}
lin e_1=li ne_3=li ne_4=1;
lin e_2=0;
if(~(li ne_1&&line_3&&li ne_4))
{
delay();
if(li ne_3==0) {key=5;retur n;}
if(line_4==0) {key=6;return;}
}
lin e_1=li ne_2=li ne_4=1;
lin e_3=0;
if(~(li ne_2&&line_1&&lin e_4))
{
delay();
if(li ne_4==0) {key=9;retur n;}
}
lin e_4=0;
line_1= li ne_2=li ne_3=1;
if(~(li ne_2&&li ne_3&&li ne_1))
{
delay();
if(line_1==0) {key=10;return;}
if(li ne_2==0) {key=11;return;}
if(line_3==0) {key=12;return;}
------------------- 时需Sr彳 ------- ---- --- --
lin e_3=0;
lin e_1=li ne_2=li ne_4=1;
if(~(li ne_2&&li ne_3&&li ne_4))
{
delay();
if(li ne_1==O) {key=7;retur n; }
if(line_2==0) {key=8;return; }
}
lin e_2=0;
lin e_1=li ne_3=li ne_4=1;
if(~(li ne_2&&li ne_3&&li ne_4))
{
delay();
if(li ne_1==O) {key=4;retur n; }
}
return;
}。