嵌入式开发–STM32G431RBTx-按键
将如下引脚口都设置为输出上拉模式
PB0,PB1,PB2,PA0
设置为上拉模式
配置定时器
如图有反映stm32g431的定时器资源。
时钟源选择外部时钟
设定系数
第一个是分频系数
(Prescaler)
第二个是周期计数值,按照分频后的时间进行计数(Counter Period)
80M的晶振除以80,得到的工作频率为80 000 000/80=1 000 000
10000-1是因为从零开始,是100kz ,即为10毫秒
使用中断
关于按键中断的实现
struct keys key[4]={0,0,0};
if(htim->Instance==TIM3)
{
key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
}
这段代码是一个中断回调函数,用于处理定时器 TIM3 的中断事件。代码中包含一个名为 key
的结构体数组,用于记录按键的状态。
在函数体中,首先通过读取 GPIO 引脚的状态,将按键的状态存储到 key
数组中的相应位置。其中,key[i].key_sta
表示第 i 个按键的状态。
接下来,使用一个循环遍历 key
数组的每个元素,对每个按键的状态进行判断和处理。
for(int i=0;i<4;i++)
{
switch (key[i].judge_sta)
{
case 0: //
{
if(key[i].key_sta==0) key[i].judge_sta=1;
}
break;
case 1:
{
if(key[i].key_sta==0)
{
key[i].judge_sta=2;
key[i].single_flag=1;
}
else key[i].judge_sta=0;
}
break;
case 2:
{
if(key[i].key_sta==1)
{
key[i].judge_sta=0;
}
}
break;
}
}
在 switch
语句中,根据 key[i].judge_sta
的值来确定需要执行的操作。key[i].judge_sta
表示按键的判断状态。
当key[i].judge_sta
的值为 0 时,表示按键处于初始状态。
- 如果按键的状态为按下(
key[i].key_sta
等于 0),则将key[i].judge_sta
的值设为 1,表示按键已按下。
当 key[i].judge_sta
的值为 1 时,表示按键已按下。
- 如果按键的状态仍然为按下,维持
key[i].judge_sta
的值为 1。 - 如果按键的状态变为松开(
key[i].key_sta
等于 1),则将key[i].judge_sta
的值设为 2,表示按键已松开,并将key[i].single_flag
的值设为 1,表示按键被单击。
当key[i].judge_sta
的值为 2 时,表示按键已松开。
- 如果按键的状态变为按下,将
key[i].judge_sta
的值设为 0,表示按键已按下。
功能实现
一共有四个按键,按键0,按键1,按键2,按键3
按键 | 功能 |
---|---|
按键0 | LCD显示“key0down”;亮0个LED |
按键1 | LCD显示“key1down”;亮1个LED |
按键2 | LCD显示“key2down”;亮2个LED |
按键3 | LCD显示“key3down”;亮3个LED |
char text[30];
uint i=5;
if(key[0].single_flag==1)
{
sprintf(text," key0down ");
LCD_DisplayStringLine(Line8, (uint8_t *)text);
LED_Disp(0x00);
key[0].single_flag=0;
}
如上是对按键0的实现。
类比可以写出按键1,2,3的实现效果。