一、实验描述及工程文件清单
1.实验描述:
按键-引脚连接:KEY1-PC5 KEY2-PC2 KEY3-PC3
LED-引脚连接:LED1-PB5 LED2-PD6 LED3-PD
用扫描的方式查询是否有按键按下:key1按下时,LED1状态取反;key2按下时,LED2状态取反;KEY3按下 时,LED3状态取反。
3.库文件、用户文件:
4.USER文件: main.c、led.c、key.c、stm32f10x_it.c
二、这是我的流程图
三、代码编写
1.main.C
/**************************************************************************** *Copyright: (C)2018 武汉凌云嵌入式实验室 www.emblinux.com *Author:luoyiran QQ: 969303624 *Description: 本例在奋斗STM32 V5开发板上调通过; *按键 灯 *KEY1-PC5 LED1-PB5 *KEY2-PC2 LED2-PD6 *KEY3-PC3 LED3-PD3 *文件名:main.c *描述:按键点灯 *版本号 日期 作者 *V1.0.0 2018.4.24 LUOYIRAN ****************************************************************************/ #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "led.h" #include "key.h" void delay_ms(u16 time); int main(void) { SystemInit(); init_led_gpio(); Key_GPIO_Config(); /* turn_led(LED1,ON); turn_led(LED2,ON); turn_led(LED3,ON); */ while (1) { if (KeyScan(GPIOC,GPIO_Pin_5) == KEY_ON) { /* LED1反转 读取GPIOB 5端口位的值并用1减去之后再写入此位即LED1的控制位 */ GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); } if (KeyScan(GPIOC,GPIO_Pin_2) == KEY_ON) { /* LED2反转 读取GPIOD 6端口位的值并用1减去之后再写入此位即LED2的控制位 */ GPIO_WriteBit(GPIOD, GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_6))); } if (KeyScan(GPIOC,GPIO_Pin_3) == KEY_ON) { /* LED3反转 读取GPIOD 3端口位的值并用1减去之后再写入此位即LED3的控制位 */ GPIO_WriteBit(GPIOD, GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_3))); } } }
2.led.c
/**************************************************************************** * Copyright: (C)2018 武汉凌云嵌入式实验室 www.emblinux.com * Description: 在奋斗STM32 V5开发板上调通过; *LED1-PB5 *LED2-PD6 *LED3-PD3 *版本号 日期 作者 说明 * V1.0.0 2018.4.21 LUOYIRAN 配置灯的模式 ****************************************************************************/ #include "stm32f10x.h" #define ON 1 #define OFF 0 enum { LED1 = 0, LED2, LED3, MAX_LED, }; typedef struct led_gpio_s { int num; /* LED编号 */ GPIO_TypeDef *group; /* LED使用的GPIO在哪一组: GPIOB or GPIOD */ uint16_t pin; /* LED使用的GPIO组中的那一个pin: GPIO_Pin_x */ } led_gpio_t; led_gpio_t leds_gpio[MAX_LED] = { {LED1, GPIOB, GPIO_Pin_5}, /* LED1 用的GPB5 */ {LED2, GPIOD, GPIO_Pin_6}, /* LED2 用的GPD6 */ {LED3, GPIOD, GPIO_Pin_3}, /* LED3 用的GPD3 */ }; /*LED的初始化*/ void init_led_gpio(void) { int i; GPIO_InitTypeDef GPIO_InitStructure; /* 使能PB和PD组 GPIO的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE); /*设置 PB5(LED1), PD6(LED2), PD3(LED3)为 GPIO 输出推免模式,口线翻转速度为50MHz */ for(i=0; i<MAX_LED; i++) { /*设置 PB5(LED1)为 GPIO 输出推免模式,口线翻转速度为50MHz */ GPIO_InitStructure.GPIO_Pin = leds_gpio[i].pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(leds_gpio[i].group, &GPIO_InitStructure); } } /*使LED在初始化后处于全灭状态*/ void turn_led(int which, int cmd) { if(which<0 || which> MAX_LED ) return ; if(OFF == cmd) GPIO_ResetBits(leds_gpio[which].group, leds_gpio[which].pin); else GPIO_SetBits(leds_gpio[which].group, leds_gpio[which].pin); }
led.H
#ifndef __LED_H #define __LED_H #include "stm32f10x.h" /*定义0-ON 1-OFF*/ #define ON 0 #define OFF 1 extern void LED_GPIO_Config(void); extern void init_led_gpio(void); #endif /*__LED_H*/
3.key.C
/* *函数名: KEY_GPIO_Config() *描述:配置按键用到的I/O口 *KEY1-PC5 *KEY2-PC2 *KEY3-PC3 *输入:无 *输出:无*/ #include "stm32f10x.h" #include "key.h" void delay_ms(u16 time) { u16 i=0; while(time--) { i=12000; while(i--); } } void Key_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_2 |GPIO_Pin_3; //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHZ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init (GPIOC,&GPIO_InitStructure); } /* * @brief : 按键按下检测 * @param : 端口 : GPIOx 端口位 : GPIO_Pin_x * @retval : 按键的状态 : 按下 弹起 */ uint8_t KeyScan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin_x ) { /* 检测是否有按键按下 */ if ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON ) { /* 延时消抖 延时大约5ms */ delay_ms(5); if ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON ) { while ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON ); /* 等待按键释放 */ return KEY_ON; } else { return KEY_OFF; } } return KEY_OFF; }
KEY.H
#ifndef __KEY_H_ #define __KEY_H_ #define KEY_ON 1 #define KEY_OFF 0 extern void delay_ms(u16 time); extern void Key_GPIO_Config(void); extern uint8_t KeyScan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin_x ); #endif