当前位置: 首页 > news >正文

STM32学习笔记

实现按键控制LED灯

前置知识:

基本的GPIO

  • 输入模式:读取外部信号(如按键、传感器状态)。——主要用到上拉输入
  • 输出模式:向外部输出信号(如控制 LED、继电器)。——主要用到推挽输出
  • 其他模式:模拟输入、复用功能(如 USART、I2C)等。

按键的知识与常识

  • 按键未按下:GPIO 引脚通过上拉电阻连接到 VCC,读取为高电平(1)
  • 按键按下:按键将 GPIO 引脚直接接地,读取为低电平(0)

有关LED的代码部分

执行文件.c

#include "stm32f10x.h"                  // Device header//LED的初始化函数
void LED_Init(void)
{//时间时钟函数RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//设置GPIO的结构体GPIO_InitTypeDef GPIO_InitStructure;//设置为推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//setbits是使它值为1(高电平)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 LED1_Turn(void){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) {GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(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 LED2_Turn(void){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0) {GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2);}
}

 头文件.h

#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);#endif

有关按键部分:

执行文件.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*
按键未按下:GPIO 引脚通过上拉电阻连接到 VCC,读取为高电平(1)。
按键按下:按键将 GPIO 引脚直接接地,读取为低电平(0)。
*/
uint8_t Key_GetNum(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;
}

头文件.h

#ifndef __KEY_H
#define __KEY_Hvoid Key_Init(void);
uint8_t Key_GetNum(void);#endif

main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "Key.h"uint8_t KeyNum;int main(void)
{//主函数初始化LED_Init();Key_Init();while(1){//进入循环后,获取按键状态KeyNum = Key_GetNum();if(KeyNum == 1){LED1_Turn();}if(KeyNum == 2){LED2_Turn();}}
}

http://www.lqws.cn/news/492085.html

相关文章:

  • 深入浅出Node.js后端开发
  • 可信计算的基石:TPM技术深度解析与应用实践
  • 2025.06.23【甲基化】methylKit:甲基化测序数据分析安装与详细使用教程
  • 常用终端命令(Linux/macOS/bash 通用)分类速查表
  • Docker 永久换源步骤
  • C++之二叉搜索树及其实现
  • 嘉讯科技:医院电子病历系统的关键性作用
  • 【Java开发日记】我们详细讲解一下 Java 中 new 一个对象的流程
  • 智慧水利新引擎,数字孪生流域解决方案
  • 领域驱动设计(DDD)【7】之数据库设计
  • 基于 Spark 实现 COS 海量数据处理
  • AntDesign栅格系统全解析:Row与Col实战指南
  • Java封装过程中的getter/setter究竟有什么用?
  • 爬虫003----requests库
  • ABP VNext + Apache Kafka Streams:构建高吞吐、生产级实时流处理服务
  • 自回归(AR)与掩码(MLM)的核心区别:续写还是补全?
  • 采集MFC软件的数据方法记录
  • 【Java面试】你是怎么控制缓存的更新?
  • Linux系统能ping通ip但无法ping通域名的解决方法
  • 【源码+文档+调试讲解】基于web的运动健康小程序的设计与实现y196
  • 【科研绘图系列】R语言绘制论文组合图(multiple plots)
  • 【Leetcode】有效的括号、用栈实现队列、用队列实现栈
  • 数据赋能(313)——合作共享——跨界融合
  • STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!
  • 马斯克YC技术核弹全拆解:Neuralink信号编译器架构·星舰着陆AI代码·AGI防御协议(附可复现算法核心/开源替代方案/中国技术对标路径)
  • CSS 中aspect - ratio属性的用途及应用
  • Mermaid学习第二部
  • Netty内存池核心:PoolChunkList解析
  • 【附源码】考试报名系统设计与实现+SpringBoot + Vue (前后端分离)
  • 【Linux网络编程】五种IO模型与非阻塞IO