按键学习
按键常见的为独立按键和行列按键
stm32中不存在Bit类型数据-而在51内核中存在bit类型的
按键引脚分配
开发板自带3个独立按键:KEY0—PC5 KEY1—PA15 WK_UP – PA0
行列键盘引脚分配:
注意分配管脚的时候,你需要注意你这个引脚有没有其他用途,比如PA9和PA10是串口的,不过以后可以改当发现不合适的时候
行列按键 –8个端口分配—(行)PA1 A2 A3 A4 (列) A5 A6 A7 A11
软件代码部分
独立按键代码
static void Independ_KEY_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //由于按键的端口过多,而且按键使用的端口一般是不一样的
GPIO_InitStructure.GPIO_Pin = KEY0_PIN|KEY1_PIN|WK_UP_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //根据原理图知道,按下就是低电平
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY0_GPIO_PORT, &GPIO_InitStructure);
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(WK_UP_GPIO_PORT, &GPIO_InitStructure); //WK_UP的模式应该为下拉
}
static uint8_t Key_Scan(void)
{
if( GPIO_ReadInputDataBit(KEY0_GPIO_PORT, KEY0_PIN ) == 0 )
return KEY0_PRESS;
if( GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_PIN ) == 0 )
return KEY1_PRESS;
if( GPIO_ReadInputDataBit(WK_UP_GPIO_PORT, WK_UP_PIN ) == 1 )
return WK_UP_PRESS;
return NO_KEYPRESS;
}
行列键盘按键部分
建议:写一个专门测试的任务函数,比如看看我引脚有没有成功配置好
测试按键的初始化设置有没有配置好,所以就简单调试一下,这个不是最终的按键程序,只是为了判断我的按键初始化有没有成功
在完成项目的时候,我们是一个一个的小部分完成,并且测试一个一个小部分
任务函数需要在头文件中声明一下
无阻塞函数,上图
出现的问题:关于任务优先级的取值出现的问题
可以发现:我的测试的任务优先级为4比LED0的任务优先级高,但是你发现我测试任务的函数是不存在阻塞语句的,导致测试函数一直占用CPU,因此初期的时候,为了避免这种错误,先不需要分优先级,而是全部为1,使用时间片轮转,到了后面才开始分配优先级
KEY0和KEY1正常显示,但是WK_UP不正常显示,--错误原因是配置失败,因为原理图没有看好
WK_UP应该是下拉,而我配置的是上拉
软件调试的作用
我移植KEY按键的时候,4x4按键,默认上电的时候就有一个按键被检测到,但是我实际上我配置的没问题,但是还是有问题,调试的时候,发现我明明配置的端口电平为高电平,但是上电调试的时候却是默认低电平(一直找不到原因为什么),后来我就换了一个端口就直接成功了---因此学会调试的能力是很重要的