STM32CubeMX HAL库矩阵键盘 定时器

简单理解
上拉输入:即在悬空状态下,将输入信号,上拉成高电平
下拉输入:即在悬空状态下,将输入信号,下拉成低电平

将PB 3,4,6,7设置为,输出,
将PB 9,10,11,12设置为上拉输入

因为stm32的io口改输出,输入模式比较麻烦,所以,选择一行一行读取的方法

STM32CubeMX配置如下:
在这里插入图片描述
设置定时器 time2 每0.1秒进入一次中断在这里插入图片描述
串口输出
在这里插入图片描述
其他时钟,debug等配置,按平常一样配置

重定向

#include <stdio.h>

#define   USER_MAIN_PRINTF
#ifdef   USER_MAIN_PRINTF

#define  USE_MAIN_INFO(format,...)    printf("\t[main info] "format "\r\n",##__VA_ARGS__)
#define  USE_MAIN_DEBUG(format,...)   printf("\t[main debug]"format"\r\n",##__VA_ARGS__)
#define  USE_MAIN_ERROR(format,...)   printf("\t[main error]"format"\r\n",##__VA_ARGS__)
#define   _DEBUG_                  printf("test\r\n");

#else
#define  USE_MAIN_INFO(format,...)
#define  USE_MAIN_DEBUG(format,...)
#define  USE_MAIN_ERROR(format,...)
#define   _DEBUG_
#endif

设置扫描函数

int rowread(void)
{ 
	if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)==GPIO_PIN_RESET)
					return 1;
  
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)==GPIO_PIN_RESET)
					return 2;
 
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==GPIO_PIN_RESET)
			return 4;
  
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)==GPIO_PIN_RESET)
			return 3;
	
return 0;
}

设置读取函数
while()循环为消抖

void columnread(void)

{ int column_flag=0  ;  

	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
	
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
		if((column_flag=rowread())!=0){
          while(rowread()!=0);
	        USE_MAIN_INFO("按下第%d个数字",column_flag);
	  
		}
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
		
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
		if((column_flag=rowread())!=0){
               while(rowread()!=0);
	             USE_MAIN_INFO("按下第%d个数字",column_flag+4);
	  
		}
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
		
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
		if((column_flag=rowread())!=0){
    while(rowread()!=0);
	USE_MAIN_INFO("按下第%d个数字",column_flag+8);
		}
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
		
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
	if((column_flag=rowread())!=0){
	  
   while(rowread()!=0);
		USE_MAIN_INFO("按下第%d个数字",column_flag+12);
	}
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
		

}

在中断函数中调用读取函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance==TIM2)
	{
	columnread();
	}

}

别忘了在 主函数 main()中的while()循环前调用,定时器启动函数`

HAL_TIM_Base_Start_IT(&htim2);

猜你喜欢

转载自blog.csdn.net/m0_52521883/article/details/114269400