新手入门
- 积分
- 12
- 金钱
- 12
- 注册时间
- 2022-8-23
- 在线时间
- 2 小时
|
本帖最后由 满船星河丶 于 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Äü
RCC->APB2ENR|=1<<6;//GPIOEê1Äü
GPIOB->CRL &= 0xFF0FFFFF;//GPIOB.5
GPIOB->CRL |= 0x00300000;//GPIOB.5éèÖÃÎaíÆíìêä3ö50MHz
GPIOB->ODR |= 1<<5;//GPIOB.5éèÖÃÎa¸ßμçƽ
GPIOE->CRL &= 0xFF0FFFFF;//GPIOE.5
GPIOE->CRL |= 0x00300000;//GPIOE.5éèÖÃÎaíÆíìêä3ö50MHz
GPIOE->ODR |= 1<<5;//GPIOE.5éèÖÃÎa¸ßμçƽ
GPIOE->CRL &= 0xFFFF00FF;//éèÖÃGPIOE.3&4ÎaêäèëÄ£ê½
GPIOE->CRL |= 0x00008800;//éèÖÃGPIOE.3&4ÎaéÏà-»òÏÂà-êäèëÄ£ê½
GPIOE->ODR|=3<<3;//éèÖÃGPIOE.3&4ÎaéÏà-Ä£ê½
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//°′¼ü°′Ëé¿a±êÖ¾
if(mode)key_up=1; //Ö§3Öᬰ′
if(key_up&&(KEY0==0||KEY1==0))
{
delay_ms(10);//襶¶¶ˉ
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;// ÎT°′¼ü°′ÏÂ
}
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);
}
}
|
|