这个小实验主要还是利用到GPIO:
下面这个bsp_led.h文件使用寄存器版本写的
#ifndef __LED_H #define __LED_H #include"stm32f10x.h" //定义端口,时钟,引脚 #define red_PORT GPIOB #define red_PIN GPIO_Pin_5 #define red_LCK RCC_APB2Periph_GPIOB #define green_PORT GPIOB #define green_PIN GPIO_Pin_0 #define green_LCK RCC_APB2Periph_GPIOB #define blue_PORT GPIOB #define blue_PIN GPIO_Pin_1 #define blue_LCK RCC_APB2Periph_GPIOB #define ON 0 #define OFF 1 #define digitalHi(p,i) {p->BSRR=i;} //引脚输出高电平 #define digitalLo(p,i) {p->BRR=i;} //引脚输出低电平 #define digitalToggle(p,i) {p->ODR ^=i;} //反转 #define red_TOGGLE digitalToggle(red_PORT,red_PIN) #define red_OFF digitalHi(red_PORT,red_PIN) #define red_ON digitalLo(red_PORT,red_PIN) #define green_TOGGLE digitalToggle(green_PORT,green_PIN) #define green_OFF digitalHi(green_PORT,green_PIN) #define green_ON digitalLo(green_PORT,green_PIN) #define blue_TOGGLE digitalToggle(blue_PORT,blue_PIN) #define blue_OFF digitalHi(blue_PORT,blue_PIN) #define blue_ON digitalLo(blue_PORT,blue_PIN) void LED_GPIO_Config(void); #endif
下面是bsp_key.h文件:
#ifndef __KEY_H #define __KEY_H #include"stm32f10x.h" #define key_1_PORT GPIOA #define key_1_PIN GPIO_Pin_0 #define key_1_CLK RCC_APB2Periph_GPIOA #define key_2_PORT GPIOC #define key_2_PIN GPIO_Pin_13 #define key_2_CLK RCC_APB2Periph_GPIOC #define KEY_ON 1 #define KEY_OFF 0 void Key_GPIO_Config(void); uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); #endif
下面是bsp_key.c文件:
#include"bsp_key.h" void Key_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(key_1_CLK|key_2_CLK,ENABLE); GPIO_InitStructure.GPIO_Pin=key_1_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(key_1_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=key_2_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(key_2_PORT,&GPIO_InitStructure); } uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) //检测按键是否按下 { while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); //直到按键被释放 return KEY_ON; //才返回一个KEY_ON } else return KEY_OFF; }
下面是main.c文件
#include"stm32f10x.h" #include"bsp_led.h" #include"bsp_key.h" int main(void) { LED_GPIO_Config(); red_ON; Key_GPIO_Config(); while(1) { if(KEY_Scan(key_1_PORT,key_1_PIN) == KEY_ON )// { red_TOGGLE; //red(OFF); } if( KEY_Scan(key_2_PORT,key_2_PIN) == KEY_ON ) { green_TOGGLE; //green(ON); } } }
以上就是一个简单的通过按键反转LED的亮灭的代码文件,如有不妥,望请指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现