高中生
最后登录1970-1-1
在线时间 小时
注册时间2020-7-13
|
10火花
本帖最后由 ReturnO 于 2020-7-21 11:28 编辑
求助:按键检测控制LED的程序无法用于控制四路继电器
萌新一只,昨天跟着视频教程学习到“GPIO输入-按键检测”,这一节实现了用按键去控制LED的开关。
因为之前还一起购买了野火的四路继电器,我想着把这一程序移植过来,用于控制四路继电器的开关,但是实现不了,程序编译都是没有error的,但是按动按键就是无法开关继电器,继电器一直是关闭状态
以下是我的程序:
这是bsp_key.h
- #ifndef __BSP_KEY.H
- #define __BSP_KEY.H
- #include "stm32f10x.h"
- #define KEY1_GPIO_PIN GPIO_Pin_0 //按键1是PA0
- #define KEY1_GPIO_PORT GPIOA
- #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
- #define KEY2_GPIO_PIN GPIO_Pin_13 //按键2是PC13
- #define KEY2_GPIO_PORT GPIOC
- #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
- #define KEY_ON 1
- #define KEY_OFF 0
- void KEY_GPIO_Config(void);
- uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
- #endif /* __KEY.H */
复制代码
这是bsp_key.c
- #include "bsp_key.h"
- void KEY_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
-
- //时钟
- RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE); //注意:时钟一定要放在初始化前面
- RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
-
- //初始化
- GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-
- GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
-
- GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-
- GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);
- }
- uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
- {
- if(GPIO_ReadInputDataBit( GPIOx, GPIO_Pin) == KEY_ON)
- {
复制代码
这是main.c
- #include "stm32f10x.h"
- #include "bsp_SysTick.h"
- #include "bsp_relay.h"
- #include "bsp_key.h"
- int main(void)
- {
- RELAY_GPIO_Config(); //初始化
- while(1)
- {
- if(KEY_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) ==KEY_ON)
- RELAY1_TOGGLE; //RELAY1_ON:继电器1开;RELAY1_OFF:继电器1关;RELAY1_TOGGLE:翻转,这些都是野火四路继电器模块资料里的配套程序。
-
- if(KEY_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) ==KEY_ON)
- RELAY2_TOGGLE;
- }
- }
复制代码
main函数中的RELAY1_TOGGLE是野火四路继电器模块资料里的配套程序,不会有问题的
- /* 直接操作寄存器的方法控制IO */
- #define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
- #define digitalLo(p,i) {p->BRR=i;} //输出低电平
- #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
- /* 定义控制IO的宏 */
- #define RELAY1_TOGGLE digitalToggle(RELAY1_GPIO_PORT,RELAY1_GPIO_PIN)
- #define RELAY1_ON digitalHi(RELAY1_GPIO_PORT,RELAY1_GPIO_PIN)
- #define RELAY1_OFF digitalLo(RELAY1_GPIO_PORT,RELAY1_GPIO_PIN)
- #define RELAY2_TOGGLE digitalToggle(RELAY2_GPIO_PORT,RELAY2_GPIO_PIN)
- #define RELAY2_ON digitalHi(RELAY2_GPIO_PORT,RELAY2_GPIO_PIN)
- #define RELAY2_OFF digitalLo(RELAY2_GPIO_PORT,RELAY2_GPIO_PIN)
复制代码
bsp.key.h、bsp.key.c、main.c基本上都是从教程里移植过来的,没什么区别,实际编译也没有error
请大家帮帮忙看看是哪里出现了问题?是因为虽然语法没有错误但逻辑不正确吗?还是其他的原因?
|
最佳答案
查看完整内容
RELAY_GPIO_Config();这个函数原型是什么?里面有没有初始化按键?
KEY_GPIO_Config 这里没看到有调用过
|