【STM32】(2) 按键输入实验
程序员文章站
2022-07-12 10:18:56
...
一、基本介绍
(1) STM32F7的IO口做输入使用的时候,是通过调用函数HAL_GPIO_ReadPin( )来读取I0口的状态的。
(2) 实验目的:我们将通过ALIENTEK阿波罗STM32开发板上载有的4个按钮(KEY_UP、KEYO、KEY1和KEY2),来控制板上的2个LED(DSO和DS1),其中KEY_UP控制DS0,DS1互斥点亮;KEY2控制DS0,按一次亮,再按一次灭;KEY1控制DS1,效果同KEY2;KEYO则同时控制DS0和DS1,按一次,他们的状态就翻转一次。
二、硬件连接
引脚 | 硬件 |
PA0 | WK_UP |
PH3 | KEY0 |
PH2 | KEY1 |
PC13 | KEY2 |
三、代码及分析
key.c
#include "key.h"
#include "delay.h"
//按键初始化函数
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
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_13; //PC13
GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3
HAL_GPIO_Init(GPIOH,&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||KEY2==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(KEY2==0) return KEY2_PRES;
else if(WK_UP==1) return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0; //无按键按下
}
在函数KEY_Init()中,编写按键的初始化函数。因为要用到PA口、PC口、PH口的引脚,所以要使能对应分组的时钟。PA0配置为输入、下拉、高速。而PH2,3、PC13要配置成输入、上拉、高速。
main.c
int main(void)
{
u8 key;
u8 led0sta=1,led1sta=1; //LED0,LED1的当前状态
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
while(1)
{
key=KEY_Scan(1); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制LED0,LED1互斥点亮
led1sta=!led1sta;
led0sta=!led1sta;
break;
case KEY2_PRES: //控制LED0翻转
led0sta=!led0sta;
break;
case KEY1_PRES: //控制LED1翻转
led1sta=!led1sta;
break;
case KEY0_PRES: //同时控制LED0,LED1翻转
led0sta=!led0sta;
led1sta=!led1sta;
break;
}
LED0(led0sta); //控制LED0状态
LED1(led1sta); //控制LED1状态
}else delay_ms(10);
}
}
首先引入相应的头文件,并初始化相关函数。在switch语句中,看那个case 条件成立,就会执行相应的语句。在while循环中,比如 led1sta=!led1sta,就能使led1sta状态由高到低不停的翻转。
上一篇: linux看门狗使用
下一篇: linux watchdog看门狗编程