野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24413|回复: 3

老师帮忙看看,哪里出的问题?

[复制链接]
发表于 2021-2-7 23:00:19 | 显示全部楼层 |阅读模式
老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!老师快来!

按键控制LED灯开关,我把KEY和LED的初始化配置文件分开写没事,但是合在一起就不可以,MINI板子上的两个LED灯一直亮着,老师帮忙看看哪里出了问题,
  1. #include "stm32f10x.h"
  2. #include "./bsp_key/bsp_key.h"

  3. void delay(uint32_t count)
  4. {
  5.         for(;count!=0;count--);
  6. }

  7. int main()
  8. {
  9.         LED_GPIO_Config();
  10.         KEY_GPIO_Config();
  11.         if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_Pin)==KEY_ON)
  12.         {
  13.                 /* LED1 TOGGLE*/
  14.                 LED1_TOGGLE;
  15.         }
  16.         if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_Pin)==KEY_ON)
  17.         {
  18.                 /* LED2 TOGGLE*/
  19.                 LED2_TOGGLE;
  20.         }
  21. }
复制代码
  1. #include "./bsp_key/bsp_key.h"

  2. void KEY_GPIO_Config(void)
  3. {  GPIO_InitTypeDef GPIO_InitStruct;
  4.         //开始按键时钟使能
  5.         RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
  6.         //配置外设相关的初始化结构体
  7.        
  8.         GPIO_InitStruct.GPIO_Pin=KEY1_GPIO_Pin;
  9.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  10.         //输入不用配置速度
  11.         GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
  12.        
  13.         GPIO_InitStruct.GPIO_Pin=KEY2_GPIO_Pin;
  14.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  15.         GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);
  16. }



  17. //按键扫描函数
  18. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  19. {
  20.         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
  21.         {
  22.                 while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);
  23.                 return KEY_ON;
  24.        
  25.         }
  26.         else
  27.                 return KEY_OFF;
  28. }

  29. void LED_GPIO_Config(void)
  30. {
  31.         GPIO_InitTypeDef GPIO_InitStruct;
  32.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOC,ENABLE);

  33.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
  34.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  35.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
  36.         GPIO_Init(GPIOC,&GPIO_InitStruct);
  37.        
  38.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
  39.         GPIO_Init(GPIOC,&GPIO_InitStruct);
  40. }
复制代码
  1. #ifndef __bsp_key_H
  2. #define __bsp_key_H

  3. #include "stm32f10x.h"

  4. #define KEY1_GPIO_CLK    RCC_APB2Periph_GPIOA
  5. #define KEY1_GPIO_PORT   GPIOA
  6. #define KEY1_GPIO_Pin    GPIO_Pin_0

  7. #define KEY2_GPIO_CLK    RCC_APB2Periph_GPIOC
  8. #define KEY2_GPIO_PORT   GPIOC
  9. #define KEY2_GPIO_Pin    GPIO_Pin_13

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

  12. //C语言知识点,^:两个数相同,为0,不同为1(异或)
  13. #define digitalTOGGLE(p,i)    {p->ODR ^=i;}
  14. #define LED1_TOGGLE      digitalTOGGLE(GPIOC,GPIO_Pin_2)
  15. #define LED2_TOGGLE      digitalTOGGLE(GPIOC,GPIO_Pin_3)

  16. void LED_GPIO_Config(void);
  17. void KEY_GPIO_Config(void);
  18. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

  19. #endif /*__bsp_key_h  */



复制代码

我查了好久找不到错误。



回复

使用道具 举报

发表于 2021-2-8 11:40:04 | 显示全部楼层
本帖最后由 清风抚琴 于 2021-2-8 11:41 编辑

你这代码有问题啊,无论是使用中断控制还是使用CPU循环扫描按键,都要在结尾加一个while循环。你这个代码应该是用CPU循环扫描控制,你把main函数里的两个if语句加到while(1)循环里,循环条件一直为1应该就可以了。你这个程序直接执行完毕了,LED引脚是低电平,直接就会点亮LED,不会等你按下按键来改变。如果解决了就告诉我一声
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 13:20:01 | 显示全部楼层
谢谢老师,我懂了,原来我的while(1)提前回家过年了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 17:43:43 | 显示全部楼层
清风抚琴 发表于 2021-2-8 11:40
你这代码有问题啊,无论是使用中断控制还是使用CPU循环扫描按键,都要在结尾加一个while循环。你这个代码应 ...

加上while(1){},可以控制了,谢谢指点
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 00:38 , Processed in 0.029320 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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