嵌入式开发–STM32G431RBTx-按键

将如下引脚口都设置为输出上拉模式

PB0,PB1,PB2,PA0

image-20240306214045243

image-20240306214346959

设置为上拉模式

image-20240306214523712

配置定时器

image-20240306221155182

如图有反映stm32g431的定时器资源。

时钟源选择外部时钟

image-20240306221409574

设定系数

image-20240306221800552

第一个是分频系数(Prescaler)

第二个是周期计数值,按照分频后的时间进行计数(Counter Period)

80M的晶振除以80,得到的工作频率为80 000 000/80=1 000 000

10000-1是因为从零开始,是100kz ,即为10毫秒

使用中断

image-20240306222103416

关于按键中断的实现

	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的实现效果。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐