[GPIO]stm32f103c8t6 笔记 模拟按键控制LED灯

一、杜邦线模拟按键

一端接GND,一端接A1(接在你要初始化的IO,我是初始化了A1)

二、编程

 1.写 PC13 LED灯IO初始化程序 LED.c

#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"


void LED_Init(void)  //LED对应IO口的初始化
{
	GPIO_InitTypeDef GPIO_InitStruct;     //结构体定义
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能时钟
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;   //推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;					//管脚13
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOC,&GPIO_InitStruct);
}

2.写LED头文件

#ifndef     _LED_H
#define     _LED_H

#define LED_OFF GPIO_SetBits(GPIOC,GPIO_Pin_13)			//拉低电平
#define LED_ON GPIO_ResetBits(GPIOC,GPIO_Pin_13)		//拉高电平
#define LED_REV GPIO_WriteBit(GPIOC, GPIO_Pin_13,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)))) //对输出的bit进行修改

void LED_Init(void);

#endif

为LED灯取反而编写的,即亮与灭

3.模拟按键的对应GPIO口的初始化 KEY.c

#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"


void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;		
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//依然使能对应IO口的时钟
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;  //!!注意这里为上拉输出
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);
}

个人理解:因为GND为低电平,初始化A1口时为上拉输入,这样按键按下时就能进行判断

4.编写头文件KEY.h

#ifndef     _KEY_H
#define     _KEY_H


#define KEY GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)  //读取对应IO口的输入电平的参数

void KEY_Init(void);

#endif

5.编写主函数main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "KEY.h"

int main(void)
{
	LED_Init();
	KEY_Init();
	Delay_Init();

while(1)
	{
		if(!KEY)
		{
			Delay_ms(20);  //对于按键来说有一点抖动误差,但是模拟按键则可有可无
			if(!KEY)
			{
				while(!KEY); //松手的检测
		
				Delay_ms(20);//同理
				LED_REV;  //取反LED灯的电平,使之亮灭
			}

		}
	}
}

拔插A1的杜邦线,就可以做到按键的效果

笔记:

 WK_UP按键则可以配置下拉输出

KEY0与KEY1则可以配置上拉输出,可以这么理解,配置这些,就是给IO口一个初始的状态。

 

 

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,通常用于嵌入式系统中。要通过复位按键控制LED,你需要完成以下几个步骤: 1. **硬件连接**: - 将LED连接到GPIO端口的某个引脚,例如PB0或PB1,作为输出信号。 - 接一个上拉或下拉电阻将复位按键连接到GPIO的输入端,如PD0。 2. **配置GPIO**: - 在STM32 HAL库中初始化GPIO设置LED所在的GPIO为推挽输出模式,并配置相应的中断支持(如果需要响应按键按下)。 3. **设置中断**: - 对于复位按键,你可以配置其上升沿中断。当按键被按下时,中断请求触发。 4. **中断服务函数**: - 编写一个处理复位按键中断的服务函数,在这里检查按键状态,如果按键按下,则点亮或熄灭LED。 5. **主程序循环**: - 主程序进入一个无限循环,不断检查GPIO的中断标志位。如果有中断,执行中断服务函数,判断是否按键按下,然后更新LED的状态。 6. **控制LED**: - 利用`HAL_GPIO_TogglePin()`函数或者直接操作GPIO的OUT寄存器来改变LED的电平,实现亮或灭。 ```c void EXTI0_IRQHandler(void) { if (HAL_GPIO_EXTI_GetIT(GPIOB, GPIO_PIN_0)) { // 假设PB0是复位键,检查中断 HAL_GPIO_EXTI_IRQHandler(GPIOB); // 处理中断 if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)) { // 检查按键状态 // LED亮起 HAL_GPIO_WritePin(GPIOB, GPIO_Pin_0, GPIO_PIN_SET); } else { // LED熄灭 HAL_GPIO_WritePin(GPIOB, GPIO_Pin_0, GPIO_PIN_RESET); } } } int main(void) { // ... 初始化GPIO、延时等... HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启EXTI0中断 while (1) { // 主循环,其他任务... } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值