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

一、杜邦线模拟按键

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

[GPIO]stm32f103c8t6 笔记 模拟按键控制LED灯_第1张图片

二、编程

 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的杜邦线,就可以做到按键的效果

笔记:

[GPIO]stm32f103c8t6 笔记 模拟按键控制LED灯_第2张图片

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

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

 

 

你可能感兴趣的:(STM32,stm32,单片机,嵌入式硬件)