这一章我们讲解单片机最常用的硬件部分——按键!


1.原理图

按键分 独立按键 和 矩阵按键,本教程不讲解矩阵按键,4个独立按键已经满足大部分的程序测试。学会了独立按键,矩阵按键可参考宋老师的教程。

先看到我们开发板上的K4

按键1

 

我们单独拿这个按键来入门,看一下它的原理图

按键2


现在让单片机的P2.3输出低电平,则演化为下图所示

按键3


要是K4被按下导通,则

按键4

圈出部分都为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;//让三八译码器的IO6输出低电平
    ADDR0 = 0;//**************************
    GND=0;    //让P2.7能具备有被拉低的条件先
    
    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);”即可。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)