OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4839|回复: 2

小白请教关于正点原子STM32的按键问题

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-8-23
在线时间
2 小时
发表于 2022-8-23 00:44:24 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 满船星河丶 于 2022-8-23 20:12 编辑

小白刚学stm32,想用下面的程序用按键控制灯,可是发现按下按键2开启灯后,想要关闭灯就需要等一会再按下按键2才起作用,按键1就不会出这种问题,请各位大佬帮忙解答一下为什么(l乱码是注释)。LED.C
#include "led.h"
#include "stm32f10x.h"
#include "delay.h"
void KEY_Init()
{
        RCC->APB2ENR|=1<<3;//GPIOBê1&#196;ü
        RCC->APB2ENR|=1<<6;//GPIOEê1&#196;ü
       
        GPIOB->CRL &= 0xFF0FFFFF;//GPIOB.5
        GPIOB->CRL |= 0x00300000;//GPIOB.5éè&#214;&#195;&#206;aí&#198;íìê&#228;3&#246;50MHz
        GPIOB->ODR |= 1<<5;//GPIOB.5éè&#214;&#195;&#206;a&#184;&#223;μ&#231;&#198;&#189;
       
        GPIOE->CRL &= 0xFF0FFFFF;//GPIOE.5
        GPIOE->CRL |= 0x00300000;//GPIOE.5éè&#214;&#195;&#206;aí&#198;íìê&#228;3&#246;50MHz
        GPIOE->ODR |= 1<<5;//GPIOE.5éè&#214;&#195;&#206;a&#184;&#223;μ&#231;&#198;&#189;
       
        GPIOE->CRL &= 0xFFFF00FF;//éè&#214;&#195;GPIOE.3&4&#206;aê&#228;è&#235;&#196;£ê&#189;
        GPIOE->CRL |= 0x00008800;//éè&#214;&#195;GPIOE.3&4&#206;aé&#207;à-&#187;ò&#207;&#194;à-ê&#228;è&#235;&#196;£ê&#189;
        GPIOE->ODR|=3<<3;//éè&#214;&#195;GPIOE.3&4&#206;aé&#207;à-&#196;£ê&#189;
       
}
u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;//°′&#188;ü°′&#203;é&#191;a±ê&#214;&#190;
        if(mode)key_up=1;  //&#214;§3&#214;á&#172;°′                  
        if(key_up&&(KEY0==0||KEY1==0))
        {
                delay_ms(10);//è¥&#182;&#182;&#182;ˉ
                key_up=0;
                if(KEY0==0)return 1;
                else if(KEY1==0)return 2;
        }else if(KEY0==1&&KEY1==1)key_up=1;             
        return 0;// &#206;T°′&#188;ü°′&#207;&#194;
}




LED.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"
#include "stm32f10x.h"

#define KEY0 ((GPIOE->IDR&(1<<3))?1:0)
#define KEY1 ((GPIOE->IDR&(1<<4))?1:0)
#define KEY0_PRESS 1
#define KEY1_PRESS 2
void KEY_Init(void);
u8 KEY_Scan(u8);

#endif

main函数

#include "stm32f10x.h"
#include "usart.h"               
#include "delay.h"
#include "led.h"
int main(void)
{       
        u8 key;          
        u8 n;
        u8 m;
        n = 1;
        m = 1;
        Stm32_Clock_Init(9);
        delay_init(72);
        KEY_Init();
        //GPIOB->ODR &= ~(1<<5);
        //delay_ms(500);
        while(1){
        key = KEY_Scan(0);
         if(key)
         {
                 switch(key)
                 {
                         case 1:
                                 if(n==1)
                                 {GPIOE->ODR &= ~(1<<5);n=0;}
                                 else if(n==0)
                                 {GPIOE->ODR |= (1<<5);n=1;}
                                 break;
                         case 2:       
                                 if(m==1)
                                  {GPIOB->ODR &= ~(1<<5);m=0;}
                                 else if(m==0)
                                 {GPIOB->ODR |=(1<<5);m=1;}
                                 break;                                 
                 }
         }else delay_ms(10);
               
        }

}




IMG_20220823_003547.jpg
IMG_20220823_003613.jpg
IMG_20220823_003625.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

163

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2021-12-14
在线时间
70 小时
发表于 2022-8-23 11:30:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-8-23
在线时间
2 小时
 楼主| 发表于 2022-8-23 20:13:50 | 显示全部楼层

您好,我把复制到上面了正在审核,请您再看一下,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 07:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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