嵌入式开发--基于STM32G431RBTx-按键中断
将如下引脚口都设置为输出上拉模式设置为上拉模式。
嵌入式开发–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的实现效果。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)