首页 > 其他分享 >[香橙派开发系列]输入模式和上拉下拉

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

时间:2023-12-04 16:14:33浏览次数:26  
标签:引脚 16 上拉下 香橙 设置 按键 include 输入

目录

前言

前面说了一下输出模式,这一章说一下输入模式,学完输入模式后我们就可以用一个软件模拟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;
}

这样的消抖要准确一点。

最后

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

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

标签:引脚,16,上拉下,香橙,设置,按键,include,输入
From: https://www.cnblogs.com/Lavender-edgar/p/17875188.html

相关文章

  • 迅为基于iTOP-RK3568开发板主要讲解输入子系统,共计24 讲。
    驱动视频全新升级,并持续更新~更全,思路更科学,入门更简单。迅为基于iTOP-RK3568开发板进行讲解,本次更新内容为第十三期,主要讲解输入子系统,共计24讲。1.总领:本期视频介绍2.什么是输入子系统?3.如何确定输入设备与节点的对应关系?4.实践:确定输入设备对应的设备节点5.输入子系统框架讲解6......
  • 实用功能分享,弹窗展示形式的6位卡号输入功能实现【玩转业务功能】
    前言本篇主要分享如何实现一个弹窗展示形式的6位卡号输入功能。6位卡号输入前面是根据卡的不同状态的流程实现,接下来,讲讲卡号输入的交互实现。卡号输入UIUI的呈现,会影响前端的实现方式。这里UI设计成弹出层的方式,每个数字都是一个方框。开发前在开发前,我列了一些可能出现的问题......
  • [香橙派开发系列]使用wiringPi控制26个引脚
    目录前言一、香橙派使用的包二、使用wiringPi包的命令1.下载wiringOP2.gpioreadall信息分析3.设置gpio的模式4.设置gpio输出的电平三、wiringPi软件实现1.初始化函数2.设置gpio的模式3.输出电平4.执行代码最后前言不管是对什么开发板来说,开发需要使用到一些包,像stm32就需要用到......
  • Linux服务器账号多次输入错误密码后解锁
    pam_tally2模块用于对系统进行失败的ssh登录尝试后锁定用户帐户。此模块保留已尝试访问的计数和过多的失败尝试。 查看用户登录失败的信息pam_tally2-urootLoginFailuresLatestfailureFromroot812/3/23 13:18:19192.168.7.49注:Failures表示登录系统失败的次数......
  • win11 搜索框无法输入文字
    打开注册表regedit删除文件夹:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderTypes\{ef87b4cb-f2ce-4785-8658-4ca6c63e38c6}\TopViews\{00000000-0000-0000-0000-000000000000}删除文件夹:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft......
  • input输入时的边框样式去除
    很多程序员在写项目过程中,会遇到input的边框样式去除问题。今天我们就研究一下,有什么办法解决这个问题?一般的,我们会给input设置:input{ border:none; }这种方法,我们去除的是显示样式,但是输入的时候,我们需要点击一下input框,发现还是有一个黑色的初始化边框:这种情况,怎么处理?我们可......
  • [香橙派开发系列]无屏幕使用香橙派
    目录前言一、使用的东西二、使用步骤1.下载系统到SD卡中2.上电连接串口3.打开ssh4.使用xshell连接香橙派最后前言在学单片机之前我就接触到树莓派这个掌间电脑,之前买了一块但是一直放在家里面吃灰,然后这几天突然感觉树莓派很好玩,准备买一块来玩一下,但是树莓派的价格实在是太高了......
  • vue实现请再次输入密码的表单校验
    1、获取第一次输入的密码的值2、比较两次密码的值是否相等3、如果不一致返回错误信息this.userInfo.password2:获取第一次输入的密码;value当前校验值;validator自定义校验规则;constConfirmPassword=(rule,value,callback)=>{if(value!==this.userInfo.password2){......
  • # yyds干货盘点 # Python如何通过input输入一个键,然后自动打印对应的值?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【冯诚】问了一个Python基础的问题,一起来看看吧。问题描述:大佬们,我有个字典如下:dict={'b':2,'a':4,'c':3}如何通过input输入一个键,然后自动打印对应的值?二、实现过程这里【巭孬......
  • 【R】Rscript中使用变量控制输入输出的文件名
    在R输入输出控制中不可避免地将变量引入输出文件名中,这种输出的文件名在Rscript中应该如何加入变量?library(ggplot2)library(dplyr)library(tidyr)for(iin10:21){file<-paste("result_",i,sep="")out_file<-paste(file,".out",sep="")......