STM32微控制器之GPIO按键控制LED灯开关状态的反转

Proteus仿真STM32F103R6微控制器GPIO的输入与输出,循环检测按键状态,控制LED灯开关状态的反转。GPIO输入:按键检测;GPIO输出:高低电平,点亮或关闭LED灯。

一、实验环境
微控制器:STM32F103R6;仿真软件:Proteus 8.11;开发工具:Keil MDK 5.33。

二、原理图
实验所用的8个LED灯,分别接在STM32微控制器的PB0,PB1,…,PB7,通过IO端口的高低电平控制;一个按键接在PC0,同时给按键并联一个小电容,实现硬件消抖。

三、源码

#include "stm32f10x.h"

int main(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	// 配置LED端口:GPIOB
	// 使能GPIOB端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	// 配置GPIOB口为输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	// 配置按键端口:GPIOC
	// 使能GPIOC端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	// 配置GPIOC口为输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == SET)
		{
			while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == SET)
			{
				__asm("nop");
			}
			// LED灯开关状态反转
			GPIOB->ODR ^= GPIO_Pin_All;
		}
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *