[香橙派开发系列]输入模式和上拉下拉

发布时间 2023-12-04 16:02:09作者: Lavender·edgar

前言

前面说了一下输出模式,这一章说一下输入模式,学完输入模式后我们就可以用一个软件模拟IIC让OLED0.96寸的显示屏显示内容了。

一、设置输入模式

前面说过设置gpio的模式的函数是pinMode,这个也可以设置gpio为输入模式。

这里还是使用PC10这个引脚(就是插线比较方便),然后还是和之前的一样的配置

#include <stdio.h>
#include <wiringPi.h>

int main(){
    wiringPiSetup();    // 初始化
    pinMode(16, INPUT);  // 设置为输入模式
    return 0;
}

这样就可以将PC10设置为输入模式了,然后我们就来读一下这个端口的电平。

二、读取端口电平

这里使用的函数是

int digitalRead(int pin)

这个函数可以读取指定引脚的电平,通过返回值进行返回。

这里的返回值就是0和1,然后将代码写一下,这里需要一直等待输入,所以这里需要使用一个死循环讲读取放入,这样就可以使其一直在接收状态,而不直接结束,这里如果读取到按键按下后就输出一句话。

在写之前需要分析一下电路,要不然不知道到底读取低电平还是高电平,这里我简单搭建了一个按键电路,按键的另一端接到了地,另一端接到PC10,所以当按键按下后PC10的电平就为低电平了。

img

知道了接线图就可以开始写代码了

#include <stdio.h>
#include <wiringPi.h>

int main(){
    wiringPiSetup();    // 初始化
    pinMode(16, INPUT);  // 设置为输入模式
    while(1){
        // 死循环进行读取内容
        if (digitalRead(16) == 0){
            printf("按键按下了\n");
        }
    }
    return 0;
}

然后编译执行一下代码

img

会发现没有按下就会输出这句话,为什么会这样呢?

其实这个本质上和stm32的输入一样。

三、配置上拉下拉电平

在stm32中,在设置引脚输入的时候会选择一个输入模式,有一个上拉输入还有一个下拉输入然后还有一个无上拉下拉模式,这几个模式在香橙派中也是有的。

我们使用pinMode设置为输入模式的时候会默认讲这个引脚变成无上拉下拉的输入,也就是一个中间态,这个状态非常的不稳定,一点风吹草动都会时输入的状态发生改变,就像上面的那种情况一样,你没有按下按键,但是它波动了就会导致电平变成了低电平。

为了解决这个问题,我们需要设置一下这个引脚为上拉输入还是下拉输入。

1.上拉输入

上拉输入其实是在内部有一个上拉电阻,也就是有一个接电源的电阻和引脚相连,使得这个引脚一开始就是高电平,我们可以将引脚设置为上拉输入后获取低电平的变化。

2.下拉输入

下拉输入和上拉是反的,下拉是有一个下拉电阻,其实就是这个引脚有一个接地的电阻和它连接,所以这个引脚一开始就是低电平,我们可以将引脚设置为下拉输入来获取高电平的变化。

3.设置函数

设置的函数是

void pullUpDnControl(int pin, int mode)

其中mode有下面几种选择

mode 说明
PUD_OFF 无上拉无下拉
PUD_UP 上拉输入
PUD_DOWN 下拉输入

这里我们需要设置为上拉输入,因为要获取低电平的输入。

代码如下:

#include <stdio.h>
#include <wiringPi.h>

int main(){
    wiringPiSetup();    // 初始化
    pinMode(16, INPUT);  // 设置为输入模式
    pullUpDnControl(16, PUD_UP);   // 上拉输入
    while(1){
        // 死循环进行读取内容
        if (digitalRead(16) == 0){
            printf("按键按下了\n");
        }
    }
    return 0;
}

然后编译运行一下,然后运行

img

会发现进入了死循环,然后但我们按下后就会有语句输出

img

会发现这个出现了很多语句,怎么样来实现按一下输出一条语句呢?这里可以在循环里面再加上一个循环判断一下这个按键是不是一直为低电平,如果一直为低电平就一直在循环中出不来

#include <stdio.h>
#include <wiringPi.h>

int main(){
    wiringPiSetup();    // 初始化
    pinMode(16, INPUT);  // 设置为输入模式
    pullUpDnControl(16, PUD_UP);   // 上拉输入
    while(1){
        // 死循环进行读取内容
        if (digitalRead(16) == 0){
            while(digitalRead(116) == 0);
            printf("按键按下了\n");
        }
    }
    return 0;
}

img

这个就叫做消抖,当然有一些是使用延时函数进行消抖的,这里也说一下,使用delay函数来延时去除抖动即可,一般按键的抖动都在20ms到30ms之间,这个可以进行微调

#include <stdio.h>
#include <wiringPi.h>

int main(){
    wiringPiSetup();    // 初始化
    pinMode(16, INPUT);  // 设置为输入模式
    pullUpDnControl(16, PUD_UP);   // 上拉输入
    while(1){
        // 死循环进行读取内容
        if (digitalRead(16) == 0){
            delay(20);     // 延时消抖
            printf("按键按下了\n");
        }
    }
    return 0;
}

但是这个也不是很精准,一般情况下对按键的消抖是用延时函数配合着循环进行判断

#include <stdio.h>
#include <wiringPi.h>

int main(){
    wiringPiSetup();    // 初始化
    pinMode(16, INPUT);  // 设置为输入模式
    pullUpDnControl(16, PUD_UP);   // 上拉输入
    while(1){
        // 死循环进行读取内容
        if (digitalRead(16) == 0){
            delay(20);
            while(digitalRead(16) == 0);
            printf("按键按下了\n");
        }
    }
    return 0;
}

这样的消抖要准确一点。

最后

输入还是非常的简单,大家多多练习即可,后面也会经常使用到这个输入函数的。

大家有什么问题可以私信或者在文章下面留言,我都会看的。