一、总结
主要记录通过按键来控制灯的亮灭。
这里先说一下,上节课是自己刷了一遍野火的课,做出来了,如果你程序下载到板上需要按一下复位才可以,那么你可以设置一下
这里我还是按照自己的理解来写的,但没有写出来,所以我这里抄写野火的代码了,野火代码就是宏定义太多了对于我这种不是按部就班的看视频的来说,续航太难,但是我自己的按键最后没有亮。然后自己弄了一个多小时也没有弄出来,所以为我们先弄下一节。
好了时隔一天,我又回来写这章了
二、按键控制代码
首先我们可以电亮LED灯但是不能通过按键熄灭,所以我们的之前点灯的代码是没问题的。我这里仿照野火改了一下,以后也会按照野火的格式来,因为真的好看、方便。
bsp_led.h
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "stm32f10x.h"
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN GPIO_Pin_1
void LED_CONFIG(void);
#endif /*_BSP_LED_H*/
bsp_led.c
#include "bsp_led.h"
void LED_CONFIG(void)
{
GPIO_InitTypeDef LED_GPIO;
/*打开时钟*/
//原型 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);
/*配置GPIO*/
//原型 GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
LED_GPIO.GPIO_Pin = LED1_GPIO_PIN;
LED_GPIO.GPIO_Mode = GPIO_Mode_Out_PP;
LED_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED1_GPIO_PORT, &LED_GPIO);
//输出低电平
GPIO_ResetBits(GPIOB,LED1_GPIO_PIN);
}
然后经过一段时间查找,终于发现了问题
emm,我真是一个小可爱。
按键点灯代码
ksy_led.h
#include "stm32f10x.h"
#define KEY_ON 1
#define KEY_OFF 0
#define KEY_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_PIN GPIO_Pin_0
void KEY_CONFIG(void);
uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//#define LED_G_TOGGLE {GPIOB->ODR ^= GPIO_Pin_0;}
记得改输入模式,因为是输入可以不要速度。
#include "key_led.h"
void KEY_CONFIG()
{
GPIO_InitTypeDef KEY_GPIO;
/*打开时钟*/
//原型 RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
/*配置GPIO*/
//原型 GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
KEY_GPIO.GPIO_Pin = KEY_GPIO_PIN;
//这里记得改为浮空输入,因为现在按键控制的是输入
KEY_GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY_GPIO_PORT,&KEY_GPIO);
}
uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx ,GPIO_Pin) == KEY_ON)
{
while(GPIO_ReadInputDataBit(GPIOx ,GPIO_Pin) == KEY_ON);
return KEY_ON ;
}
else
return KEY_OFF;
}
按键点灯的精髓我主要觉得实在这个KSY_SCAN这里,该有就是修改bsp.ld.h中的返回值。
uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx ,GPIO_Pin) == KEY_ON)
{
/*按键是高电平按压则返回1 否者返回0 */
while(GPIO_ReadInputDataBit(GPIOx ,GPIO_Pin) == KEY_ON);
return KEY_ON ;
}
else
return KEY_OFF;
}
main.c
#include "stm32f10x.h" //默认是在当前文件夹
#include "bsp_led.h"
#include "key_led.h"
int main(void)
{
LED_CONFIG();
KEY_CONFIG();
while(1)
{
if(KEY_SCAN(KEY_GPIO_PORT, KEY_GPIO_PIN) == KEY_ON)
{
LED_G_TOGGLE;//之间bsp.led打开的灯的电平
}
}
}
修改bsp_led.h
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "stm32f10x.h"
#define LED_GPIO_PORT GPIOB
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED_GPIO_PIN GPIO_Pin_1
void LED_CONFIG(void);
#define LED_G_TOGGLE {LED_GPIO_PORT->ODR ^= LED_GPIO_PIN;}
#endif /*_BSP_LED_H*/
其中main.c我改过,想着把返回值不要(LED_G_TOGGLE),改为将GPIOB的电平拉高( GPIO_SetBits(GPIOB,LED_GPIO_PIN); ),这样灯就灭了,但是试了下,可以控制板子灯灭,但是不能亮,需要按下复位才行。不然亮不起来。、
三、按键控制灯的原理
按键点灯的原理如图,当按键没有按下的时候,我们的寄存器接地,处于低电平,所以我们的灯亮,如果按键按下,我们的寄存器就和3.3V的电源接通,处于高电平,所以按键不亮。
就是通过按键来控制GPIO输入的高低电平。
原理图如上,这里我也不是很懂,毕竟没学过。大概就是这个意思。
最后,编程需要视力!编程需要视力!编程需要视力!
问问有没有大佬知道不使用那个LED_G_TOGGLE
返回值来控制灯亮灭的方法。