news 2026/9/24 17:28:43

按键控制LED

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
按键控制LED


GPIO_ Read_ input_ Data_ bit 就是读取这里输入数据寄存器的某一位。
GPIO_ Read_ input_ Data 就是读取这整个输入数据寄存器。
GPIO_ Read_ output_ Data_ bit 就是读取这里输出数据寄存器的某一位。
GPIO_ Read_ output_ Data 就是读取这整个输出数据寄存器。

按键控制LED

intmain(void){/*模块初始化*/LED_Init();//LED初始化Key_Init();//按键初始化while(1){KeyNum=Key_GetNum();//获取按键键码if(KeyNum==1)//按键1按下{LED1_Turn();//LED1翻转}if(KeyNum==2)//按键2按下{LED2_Turn();//LED2翻转}}}

【LED.c】

#include"stm32f10x.h"// Device header/** * 函 数:LED初始化 * 参 数:无 * 返 回 值:无 */voidLED_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟/*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);//将PA1和PA2引脚初始化为推挽输出/*设置GPIO初始化后的默认电平*/GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);//设置PA1和PA2引脚为高电平}/** * 函 数:LED1状态翻转 * 参 数:无 * 返 回 值:无 */voidLED1_Turn(void){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)//获取输出寄存器的状态,如果当前引脚输出低电平{GPIO_SetBits(GPIOA,GPIO_Pin_1);//则设置PA1引脚为高电平}else//否则,即当前引脚输出高电平{GPIO_ResetBits(GPIOA,GPIO_Pin_1);//则设置PA1引脚为低电平}}/** * 函 数:LED2状态翻转 * 参 数:无 * 返 回 值:无 */voidLED2_Turn(void){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)//获取输出寄存器的状态,如果当前引脚输出低电平{GPIO_SetBits(GPIOA,GPIO_Pin_2);//则设置PA2引脚为高电平}else//否则,即当前引脚输出高电平{GPIO_ResetBits(GPIOA,GPIO_Pin_2);//则设置PA2引脚为低电平}}

【Key.c】

STM32 内部有约 30k~50kΩ 的可编程上拉电阻,可以代替外部上拉:

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;

按键一端接 PB1,另一端接 GND

  • 松开:内部上拉 → IDR = 1

  • 按下:拉到 GND → IDR = 0

#include"stm32f10x.h"// Device header#include"Delay.h"/** * 函 数:按键初始化 * 参 数:无 * 返 回 值:无 */voidKey_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//将PB1和PB11引脚初始化为上拉输入}/** * 函 数:按键获取键码 * 参 数:无 * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下 * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手 */uint8_tKey_GetNum(void){uint8_tKeyNum=0;//定义变量,默认键码值为0if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);//延时消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);//等待按键松手Delay_ms(20);//延时消抖KeyNum=1;//置键码为1}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)//读PB11输入寄存器的状态,如果为0,则代表按键2按下{Delay_ms(20);//延时消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0);//等待按键松手Delay_ms(20);//延时消抖KeyNum=2;//置键码为2}returnKeyNum;//返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 17:28:17

BA | 一周速学业务与系统框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 17:27:03

lu,震惊分析实验系统、震惊实验视频分析系统

震惊反射系统用于分析动物受到突发强刺激后的应激行为,单台计算机可管控 1‑5 个震惊反应箱。除噪声刺激外,还可叠加光、电、气流组合刺激,刺激间隔技术参数1、重量传感器量程:1‑2kg 2、系统架构:主控制器搭配装置控制…

作者头像 李华
网站建设 2026/9/24 17:26:48

springboot太原青年背包客深度游小程序20606-计算机课程设计、毕业设计

前言 ✨ 博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮…

作者头像 李华
网站建设 2026/9/24 17:26:48

液冷服务器渗透率2027年破50%?产业链谁在受益

中商产业研究院预计中国液冷服务器渗透率2027年有望突破50%,从2021年不足3%到2027年过半,六年翻十几倍。产业链受益顺序是:最先受益的是液冷板/换热器等核心部件,其次是冷却液、管路、CDU等配套,最后是运维和改造服务。…

作者头像 李华