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; } } }