野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22802|回复: 2

求助:按键检测控制LED的程序无法用于控制四路继电器

[复制链接]
发表于 2020-7-21 11:03:45 | 显示全部楼层 |阅读模式
10火花
本帖最后由 ReturnO 于 2020-7-21 11:28 编辑

求助:按键检测控制LED的程序无法用于控制四路继电器
萌新一只,昨天跟着视频教程学习到“GPIO输入-按键检测”,这一节实现了用按键去控制LED的开关。
因为之前还一起购买了野火的四路继电器,我想着把这一程序移植过来,用于控制四路继电器的开关,但是实现不了,程序编译都是没有error的,但是按动按键就是无法开关继电器,继电器一直是关闭状态
以下是我的程序:

这是bsp_key.h
  1. #ifndef __BSP_KEY.H
  2. #define __BSP_KEY.H

  3. #include "stm32f10x.h"

  4. #define KEY1_GPIO_PIN                      GPIO_Pin_0                           //按键1是PA0
  5. #define KEY1_GPIO_PORT                   GPIOA
  6. #define KEY1_GPIO_CLK                      RCC_APB2Periph_GPIOA

  7. #define KEY2_GPIO_PIN                      GPIO_Pin_13                         //按键2是PC13
  8. #define KEY2_GPIO_PORT                   GPIOC
  9. #define KEY2_GPIO_CLK                      RCC_APB2Periph_GPIOC

  10. #define KEY_ON                                 1
  11. #define KEY_OFF                                0

  12. void KEY_GPIO_Config(void);
  13. uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

  14. #endif /* __KEY.H */
复制代码


这是bsp_key.c
  1. #include "bsp_key.h"

  2. void KEY_GPIO_Config(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStruct;
  5.         
  6.         //时钟
  7.         RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);                       //注意:时钟一定要放在初始化前面
  8.         RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
  9.         
  10.         //初始化
  11.         GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
  12.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  13.         
  14.         GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
  15.         
  16.         GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
  17.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  18.         
  19.         GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);        
  20. }

  21. uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
  22. {
  23.         if(GPIO_ReadInputDataBit( GPIOx, GPIO_Pin) == KEY_ON)
  24.         {
复制代码


这是main.c
  1. #include "stm32f10x.h"
  2. #include "bsp_SysTick.h"
  3. #include "bsp_relay.h"
  4. #include "bsp_key.h"

  5. int main(void)
  6. {
  7.         RELAY_GPIO_Config();                                                                   //初始化

  8. while(1)                          
  9. {
  10.           if(KEY_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) ==KEY_ON)
  11.                 RELAY1_TOGGLE;                                                                          //RELAY1_ON:继电器1开;RELAY1_OFF:继电器1关;RELAY1_TOGGLE:翻转,这些都是野火四路继电器模块资料里的配套程序。
  12.                
  13.                 if(KEY_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) ==KEY_ON)
  14.                 RELAY2_TOGGLE;
  15. }

  16. }


复制代码

main函数中的RELAY1_TOGGLE是野火四路继电器模块资料里的配套程序,不会有问题的
  1. /* 直接操作寄存器的方法控制IO */
  2. #define        digitalHi(p,i)                 {p->BSRR=i;}         //输出为高电平               
  3. #define digitalLo(p,i)                 {p->BRR=i;}         //输出低电平
  4. #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态

  5. /* 定义控制IO的宏 */
  6. #define RELAY1_TOGGLE                 digitalToggle(RELAY1_GPIO_PORT,RELAY1_GPIO_PIN)
  7. #define RELAY1_ON                      digitalHi(RELAY1_GPIO_PORT,RELAY1_GPIO_PIN)
  8. #define RELAY1_OFF                           digitalLo(RELAY1_GPIO_PORT,RELAY1_GPIO_PIN)

  9. #define RELAY2_TOGGLE                 digitalToggle(RELAY2_GPIO_PORT,RELAY2_GPIO_PIN)
  10. #define RELAY2_ON                   digitalHi(RELAY2_GPIO_PORT,RELAY2_GPIO_PIN)
  11. #define RELAY2_OFF                           digitalLo(RELAY2_GPIO_PORT,RELAY2_GPIO_PIN)
复制代码



bsp.key.h、bsp.key.c、main.c基本上都是从教程里移植过来的,没什么区别,实际编译也没有error
野火论坛202007211051503900..png QQ图片20200721111530.jpg

请大家帮帮忙看看是哪里出现了问题?是因为虽然语法没有错误但逻辑不正确吗?还是其他的原因?




最佳答案

查看完整内容

RELAY_GPIO_Config();这个函数原型是什么?里面有没有初始化按键? KEY_GPIO_Config 这里没看到有调用过
回复

使用道具 举报

发表于 2020-7-21 11:03:46 | 显示全部楼层
RELAY_GPIO_Config();这个函数原型是什么?里面有没有初始化按键?
KEY_GPIO_Config 这里没看到有调用过
回复

使用道具 举报

 楼主| 发表于 2020-7-22 11:51:30 | 显示全部楼层
还有梦与你 发表于 2020-7-22 09:41
RELAY_GPIO_Config();这个函数原型是什么?里面有没有初始化按键?
KEY_GPIO_Config 这里没看到有调用过 ...

真的是太感谢了!!!
RELAY_GPIO_Config()没有错,这个是初始化GPIO端口的
错就错在没有在main函数里面调用KEY_GPIO_Config(),所以没有初始化按键,导致按键没能工作。现在在main函数里加上一句“KEY_GPIO_Config();”就能正常用按键控制了
真的十分感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 13:40 , Processed in 0.050681 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表