按键返回值带入不了main函数中
我在key.h中定义如下函数,#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
其中GPIO_ReadInputDataBit有返回值,但是程序执行的时候不能给KEY0赋值.大家帮忙看看为什么? 能看到按键按下的时候bitstatus被赋值为:Bit_RESET,但是不能赋值到KEY0.
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint8_t bitstatus = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
{
bitstatus = (uint8_t)Bit_SET;
}
else
{
bitstatus = (uint8_t)Bit_RESET;
}
return bitstatus;
本帖最后由 ifxz0123 于 2021-1-25 11:40 编辑
你的KEY0是宏定义,KEY0 等价于 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3),这个一个函数调用,你怎么能直接赋值。你个应该定义一个变量,来保存函数的返回值。
例:
uint16_t key_value;
key_value = KEY0;
或
key_value =GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
看到你那个扫描按键的帖子里,STM32F103,M3内核的MCU是有位带操作功能的,M0的MCU好像不带这功能,你是不是把它搞混了
好的,明白了,多谢楼上 bestdesign11 发表于 2021-1-25 11:44
好的,明白了,多谢楼上
{:smile:} ifxz0123 发表于 2021-1-25 11:34
你的KEY0是宏定义,KEY0 等价于 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3),这个一个函数调用,你怎么能直 ...
我看103中的位带操作不是这样的,提到了_HAL操作.请问HAL库操作不是函数调用吗?可以在宏定义里赋值?
//下面的方式是通过直接操作HAL库函数方式读取IO
#define KEY0 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)//KEY0按键PC5 即使宏定义了,你这个只能放到等号右边,给另一个变量赋值,不能直接观察他,他本质上就是一个返回值 如下是例程的具体内容,看看这样是否对?就是KEY0,KEY1等的用法
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//按键初始化函数
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_15; //PA15
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_5; //PC5
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,WKUP按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode==1)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0) return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1) return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0; //无按键按下
} 看到楼上的代码,熟悉了,了解了。
uint8_t KEY_Scan(uint8_t mode)//按键按下函数
{
static uint8_t key_up=1;//按键按松开标志
if(mode==1)key_up=1;//支持连按
if(key_up&&(KEY_PWR==0||KEY_BEEP==0||KEY_IV==0))
{
Delay_ms(20);//去抖动
key_up=0;
if(KEY_PWR==0)
return K_PWR;
else if(KEY_BEEP==0)return K_BEEP;
else if(KEY_IV==0)return K_IV;
}else if(KEY_PWR==1&&KEY_BEEP==1&&KEY_IV==1)key_up=1;
return 0;// 无按键按下
}
void Key_key(void)
{
static uint8_t key=0;
externuint16_t Lmd;//extern是指另处有申明此变量
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case K_PWR: //控电源
MTR_off(); //关机
break;
我这上面想长按开关机代码要怎么改,求指点下,找了好多参考资料没明白
页:
[1]