小白跟做江科大32单片机之按键控制LED

原理部分

1.LED部分使用的是这样的连接方式

2.传感器模块的电路图

滤波电容如果接地,一般用于滤波,在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大,就能把电压值对应到相应的电压值

比较器部分

如果A端电压>B端电压,接VCC,反之接地

传感器需要上拉或下拉驱动,一般用下拉驱动

3.按键需要消除抖动

4.连接示意图


代码编写

1.思路

首先实现LED亮灭,随后实现按键1控制LED亮灭,最后实现2个按键各自控制两个ledd的亮灭

2.按照江科大老师给的电路连接接图进行连接

注意: 

    由于连接图中两个LED,一个连接的GPIO口为A1,一个连接的GPIO口为A2,所以需要分别定义

    GPIO口默认为低电平

3.复制之前已经构建好的模板库

4.新建hardware文件夹并将路径联系到工程中,在hardware中新建led.c,led.h;key.c,‘key.h文件

5.led.h代码如下所示:

#ifndef _LED__H
#define _LED__H

void led_Init(void);
void led1_on(void);
void led1_off(void);
void led2_on(void);
void led2_off(void);
void turn_1(void);
void turn_2(void);

#endif

6.led.c代码如下所示:

#include "stm32f10x.h" 
void led_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //开启GPIOB的时钟
                                                            //使用各个外设前必须开启时钟,否则对外设的操作无效
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //GPIO模式,赋值为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;    //GPIO引脚,赋值为第1,2号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz
    
    GPIO_Init(GPIOA, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
                                                            //函数内部会自动根据结构体的参数配置相应寄存器
                                                            //实现GPIOB的初始化
    //LED默认为灭,SetBits是灭,ReSetBits是亮
    GPIO_SetBits(GPIOA, GPIO_Pin_1|GPIO_Pin_2);
}

void led1_on(void)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void led1_off(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void led2_on(void)
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void led2_off(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void turn_1(void)
{
    if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)==0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
    }
    else
   {
     GPIO_ResetBits(GPIOA, GPIO_Pin_1);
   }
}

void turn_2(void)
{
    if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2)==0)   //获取输出寄存器的状态,如果当前引脚输出低电平
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_2);   //设置PA2引脚为高电平
        
    }
    else
   {
      GPIO_ResetBits(GPIOA, GPIO_Pin_2);  //设置PA2引脚为高电平
   }
}

7.key.h代码如下所示:

#ifndef _KEY__H
#define _KEY__H

void key_Init(void);
uint8_t key(void);

#endif

8.key.c代码如下所示:

#include "stm32f10x.h" 
#include "Delay.h"

void key_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);    //开启GPIOB的时钟
                                                            //使用各个外设前必须开启时钟,否则对外设的操作无效
    
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //GPIO模式,赋值为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_11;    //GPIO引脚,赋值为第1,2号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz
    
    GPIO_Init(GPIOB, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
                                                            //函数内部会自动根据结构体的参数配置相应寄存器
                                                            //实现GPIOB的初始化
    
    
}

uint8_t key(void)
{
    uint8_t keynum=0;
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)
    {
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0);
        Delay_ms(20);
        keynum=1;
    }
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0)
    {
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);
        Delay_ms(20);
        keynum=2;
    }
    return keynum;
}
9.main.c代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "led.h"
#include "key.h"

uint8_t keynum=0;
int main()
{
   
   led_Init();
   key_Init();
    while (1)
    {
        keynum=key();
        if(keynum==1)
        {
            turn_1();
        }
        if(keynum==2)
        {
            turn_2();
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/342598.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 图表开发开源库 MPAndroidChart 使用总结

1. 引言 电视项目中需要一个折线图表示节电数据变化情况,类比 H5 来说,Android 中也应该有比较成熟的控件,经过调研后,发现 MPAndroidChart 功能比较强大,网上也有人说可能是目前 Android 开发最好用的一个三方库了&a…

WPS表格插件方方格子【凑数】功能:选出和等于固定数字的数

文章目录 后来发现可以下载方方格子插件,使用【凑数】功能https://ffcell.lanzouj.com/iwhfc1kjhayh【凑数】快速【凑数】 导师让沾发票,需要选出若干个数额的发票,使它们的和等于一个指定数。不知道怎么办了,查了一下&#xff0c…

Python第二语言(四、Python数据容器)

目录 一、 数据容器(list、tuple、str、map、dict) 1. 数据容器概念 2. 列表list( [] ) 2.1 定义方式 2.2 嵌套列表 2.3 list通过获取下标索引获取值 2.4 下标使用概念 2.5 list列表的使用(列表的方法&#xff…

linux nohup命令详解:持久运行命令,无视终端退出

nohup (全称为 “no hang up”),用于运行一个命令,使其在你退出 shell 或终端会话后继续运行。 基本语法 nohup command [arg1 ...] [&> output_file] &command 是你想要运行的命令。[arg1 ...] 是该命令的参数。&am…

快排与归并的算法(非递归版)

一.快排 1.递归法(方法多样) 1>hoare版 注:该方法小编已经在上篇博客中介绍过了,就不在这里过多赘述了,如果有兴趣的小伙伴可以看看小编的上篇博客哦 2>挖坑法 1)方法介绍:定义最左边的数据为key&#xff0…

生信学习入门常见错误可能的原因分类总结和求助指南

文件或目录找不到 这是常见问题,常见提示有 No such file or directory Error in file(file, “rt”):无法打开链接 Fatal error: Unable to open file for reading (seq/WT1_1.fq) Fatal error: Unable to read from file (C:Program file/Git/usea…

OneDrive空间清理及文件历史版本查询

点击OneDrive图标 点击“在线查看” 点击“设置” 点击“OneDrive设置” 点击“其他设置” 点击“存储标准” 点击“文档” 选择需要操作的文件,点击“历史版本记录” 需要清理空间,可删除历史版本,需要使用历史版本,可还原历史版…

为什么我们需要在软件本地化过程中使用术语服务?

你知道软件翻译和本地化的术语服务吗?此解决方案涵盖源术语和目标术语的创建、开发和维护。所有术语都存储在具有多个字段的数据库中,包括术语定义、用法示例、上下文和历史记录。这使我们能够正确处理每个术语的创建或更改请求,避免创建重复…

f1c100s 荔枝派 系统移植

一。交叉编译环境配置 1.1下载交叉工具链:https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/ 1.2解压安装 在home目录下新建 工程目录:mkdir f1c100s_project 将windows下的gcc-linaro-7.2.1-2017.11-x86…

Spark MLlib 机器学习详解

目录 🍉引言 🍉Spark MLlib 简介 🍈 主要特点 🍈常见应用场景 🍉安装与配置 🍉数据处理与准备 🍈加载数据 🍈数据预处理 🍉分类模型 🍈逻辑回归 &a…

C# FTP/SFTP 详解及连接 FTP/SFTP 方式示例汇总

文章目录 1、FTP/SFTP基础知识FTPSFTP 2、FTP连接示例3、SFTP连接示例4、总结 在软件开发中,文件传输是一个常见的需求。尤其是在不同的服务器之间传输文件时,FTP(文件传输协议)和SFTP(安全文件传输协议)成…

前端图片在切换暗黑模式时太亮该怎么办?

通过css中的filter属性来实现,进行图片的色系反转、亮度、对比度调整等 1、invert 反转输入图像,值为 100% 则图像完全反转,值为 0% 则图像无变化 filter: invert(1); 2、blur 给元素应用高斯模糊效果。 filter: blur(5px); 3、brightnes…

C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

运行在VS2022,x86,Debug下。 30. 外观模式 为子系统定义一组统一的接口,这个高级接口会让子系统更容易被使用。应用:如在游戏开发中,游戏引擎包含多个子系统,如物理、渲染、粒子、UI、音频等。可以使用外观…

Xcode 打包报错Command PhaseScriptExecution failed with a nonzero exit code

解决办法: 1、在Xcode项目中 Pods -> Targets Support Files -> Pods-项目名 -> Pods-项目名-frameworks 中(大约在第44行) 加上 -f 2、CocoaPods版本太旧了,可以尝试升级CocoaPods版本 使用sudo gem update cocoapods更新cocoapods,问题将在1.12.1版本已…

DP读书:如何使用badge?(开源项目下的标咋用)

最近在冲论坛,很少更一些内容了。但遇到了一个真的有趣的: 开源项目下,蓝蓝绿绿的标是怎么用的呢? 这是我的主页Readme,在看一些NXP的主仓时,突然发现没有这个玩,就自己整了个 再比如我的CSDN专…

信号:干扰类别及特征提取

目录 第一部分:干扰类别 1.压制干扰 1.1噪声调幅瞄准式干扰(单音干扰) 1.2噪声调频阻塞式干扰(宽带噪声干扰) 1.3噪声调频扫频式干扰(线性调频) 2.欺骗干扰 2.1距离欺骗干扰(幅度调制干扰&#xff0…

MySQL—多表查询—内连接

一、引言 (1)内连接查询语法 内连接查询的是两张表的交集部分的数据。(也就是绿色部分展示的数据) (2)内连接有两种形式: 1、隐式内连接 语法结构: 2、显示内连接 语法结构&#xf…

上市即交付,比亚迪秦L DM-i万人交车暨千媒众测开营

6月6日,“引领中级 开创油耗2时代”秦L DM-i万人交车暨千媒众测开营仪式在比亚迪大本营深圳盛大举行。 众多车主代表亲临现场,与全国各地的比亚迪4S店千店联动,将秦L DM-i全国交付推向新的高潮。发布即量产,上市即交付&#xff0…

查看远程桌面端口,查看服务器的远程桌面端口的方法

如果你正在寻找一种方法来检查服务器的远程桌面端口,那么请务必按照以下步骤操作,以确保准确且安全地获取所需信息。这不仅是一个技术问题,更是一个关于效率和安全性的重要议题。 首先,你需要明确,远程桌面端口通常是…

SQLServer 查询指定数据库名和表名及表结构等

查询当前数据库中所有表名,不用指定数据库,选中某数据库直接执行SQL就好 -- U:所有用户表名; S:所有系统表名;V:所有视图表名 SELECT name FROM sysobjects WHERE xtypeU OR xtypeS OR xtypeV 查询指定数据库数据库中所有表名, SELECT TAB…