主要问题是,功能都能按我的预期实现,但是对按键按下的响应太慢了,比如按了其中一个按键,过好几秒才出现象(使用的是原子哥的战舰STM32开发板)
代码如下:
1)key.h文件:
# ifndef KEY_H_
# define KEY_H_
# include "sys.h"
//自己写的宏:读取某组I/O口某个引脚的电平
# define ReadA(n) GPIO_ReadInputDataBit(GPIOA, (uint16_t)(0x0001 << n))
# define ReadE(n) GPIO_ReadInputDataBit(GPIOE, (uint16_t)(0x0001 << n))
# define KEY_UP 1
# define KEY_LEFT 2
# define KEY_DOWN 3
# define KEY_RIGHT 4
void Key_Init(void);
u8 Key_Scan(void);
# endif
2)key.c文件:( 仅列出和原子哥很不类似的函数而已,其中I/O口的使能等都是差不多的)
u8 Key_Scan(void)
{
if(ReadA(0) || !ReadE(2) || !ReadE(3) || !ReadE(4))
{
delay_ms(10); //消抖
if(ReadA(0))
{
while(ReadA(0)) //松手检测,下同
continue;
return KEY_UP;
}
else if(!ReadE(2))
{
while(!ReadE(2))
continue;
return KEY_LEFT;
}
else if(!ReadE(3))
{
while(!ReadE(3))
continue;
return KEY_DOWN;
}
else if(!ReadE(4))
{
while(!ReadE(4))
continue;
return KEY_RIGHT;
}
}
return 0; //无按键按下
}
3)main.c文件:
# include "led.h"
# include "sys.h"
# include "delay.h"
# include "beep.h"
# include "key.h"
int main(void)
{
delay_init();
LED_init();
Beep_Init();
Key_Init();
while(1)
{
switch(Key_Scan())
{
case KEY_UP:
GPIO_ResetBits(GPIOB, GPIO_Pin_5); //灯亮
GPIO_ResetBits(GPIOE, GPIO_Pin_5); //灯亮
GPIO_ResetBits(GPIOB, GPIO_Pin_8); //不响
break;
case KEY_LEFT:
GPIO_SetBits(GPIOB, GPIO_Pin_5); //不亮
GPIO_SetBits(GPIOE, GPIO_Pin_5); //不亮
GPIO_SetBits(GPIOB, GPIO_Pin_8); //响
break;
case KEY_DOWN:
GPIO_ResetBits(GPIOB, GPIO_Pin_5); //亮
GPIO_SetBits(GPIOE, GPIO_Pin_5); //不亮
GPIO_ResetBits(GPIOB, GPIO_Pin_8); //不响
break;
case KEY_RIGHT:
GPIO_SetBits(GPIOB, GPIO_Pin_5); //不亮
GPIO_ResetBits(GPIOE, GPIO_Pin_5); //亮
GPIO_ResetBits(GPIOB, GPIO_Pin_8); //不响
break;
}
}
}
看了开发指南(库函数版本),很好的资料(顶下),看了就自己能操作那些I/O口了,都是自己看着外围电路来写的代码,写完后再看原子哥的标准例程(库函数版本)
不过有一点不大明白, CRL或者 CRH寄存器不是每4位设置一个I/O口的输入输出模式了吗,为什么 GPIOMode_TypeDef这个枚举是8位的,见下图
希望大家帮我解决上面2个问题
嘿嘿,开发板上一年就买了,因为某些事,去给人弄一些纯软件的项目,现在才拿出来学习,硬件编程和硬件不是很懂,如果有哪些地方说的不够详细,请指出
|