这一章我们讲解单片机最常用的硬件部分——按键!
1.原理图
按键分 独立按键 和 矩阵按键,本教程不讲解矩阵按键,4个独立按键已经满足大部分的程序测试。学会了独立按键,矩阵按键可参考宋老师的教程。
先看到我们开发板上的K4
我们单独拿这个按键来入门,看一下它的原理图
现在让单片机的P2.3输出低电平,则演化为下图所示
要是K4被按下导通,则
圈出部分都为0V电压,因为这些地方都被接了地。
2.原理
原理很简单,我们开发板上的按键用的是没有自锁功能的自弹起的按键,也就是像按家里电磁炉上的按键一样,按下之后两个断点就被短接起来,松手后这时按键自己弹起,两个断点就没有短接在一起了。
拿P2.7来说,当K4按键按下,则断点导通,P2.7被接地,此时P2.7的IO端口为0V,也就是低电平,俗称被拉低。这时候即使是程序令P2.7输出5V高电平都于事无补,因为这是外部电路直接导致,IO端口就是0V。内部硬件也能感觉到这个信号属于被强制拉低。这么解释有点笼统,所以我们前往《手把手教你学51单片机》文档8.4.1节有很权威的解释。
在程序里我们是可以去读此时的IO端口信号的,读的意思就是外部信号输入到单片机内部里面,单片机去检测识别这个信号的意思,我们还是先用一个简单的程序来说明一下IO端口被拉低的情况怎么在代码中表示出作用。
3.代码
程序下载进去我们按下K4,按下时8盏LED小灯被点亮,松开不按时就熄灭
#include <reg52.h>
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
sbit KEY4 = P2^7;
sbit GND = P2^3;
void main()
{
ADDR3 = 1;
ENLED = 0;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
GND=0;
while (1)
{
P0=KEY4*0xFF;
}
}
|
4.解析
那么看到“P0=KEY4*0xFF;”语句,KEY4是可以作为一个数值与0xFF相乘的,但这个KEY4值只有两个极限数,不是1就是0。
在P2.3输出低电平的情况下,当按键按下时,此时P2.7被拉低,在程序中KEY4就变为0了,当按键松开,那P2.7断开了与地相接,就相当于什么也没接,自然跟第三章第2讲结尾提到过的是高电平状态了,这是内部硬件上拉电阻的作用,空闲时是高电平,所以此时在程序中KEY4也就变为1了。
所以“P0=KEY4*0xFF;”就是取决于按键的动作是要变为“P0=0x00;”还是“P0=0xFF;”。
我们就是用一排灯来提示了一个IO端口有没有被拉低了的功能。
如果想实现按下时8盏小灯熄灭,松开不按时点亮,只需把“P0=KEY4*0xFF;”改为“P0=~(KEY4*0xFF);”即可。
|