STM矩阵键盘中断有问题(急)

我想问一下。我将4*4的矩阵键盘最后一列C3(序号0-3)作为外部中断输入时,为什么会导致我矩阵键盘第三行完全读不出按键按下的行为。下面贴相关代码和引脚布局。这件事有点急麻烦各位大佬能帮帮忙帮我解决一下。万分感谢!!

 

头文件

#ifndef INC_KEYBOARD_H_
#define INC_KEYBOARD_H_

#include "main.h"
#include "stm32f1xx_hal.h"

uint8_t KEY_SCAN(void);
uint8_t KEY_CLO_SCAN(void);
void test(void);

#define KEY_ROW0_OUT_LOW  HAL_GPIO_WritePin(R0_GPIO_Port,R0_Pin,GPIO_PIN_RESET)
#define KEY_ROW1_OUT_LOW  HAL_GPIO_WritePin(R1_GPIO_Port,R1_Pin,GPIO_PIN_RESET)
#define KEY_ROW2_OUT_LOW  HAL_GPIO_WritePin(R2_GPIO_Port,R2_Pin,GPIO_PIN_RESET)
#define KEY_ROW3_OUT_LOW  HAL_GPIO_WritePin(R3_GPIO_Port,R3_Pin,GPIO_PIN_RESET)

#define KEY_ROW0_OUT_HIGH  HAL_GPIO_WritePin(R0_GPIO_Port,R0_Pin,GPIO_PIN_SET)
#define KEY_ROW1_OUT_HIGH  HAL_GPIO_WritePin(R1_GPIO_Port,R1_Pin,GPIO_PIN_SET)
#define KEY_ROW2_OUT_HIGH  HAL_GPIO_WritePin(R2_GPIO_Port,R2_Pin,GPIO_PIN_SET)
#define KEY_ROW3_OUT_HIGH  HAL_GPIO_WritePin(R3_GPIO_Port,R3_Pin,GPIO_PIN_SET)

#endif /* INR_KEYBOARD_H_ */

 

源文件

#include "keyboard.h"
#include "main.h"
#include "usart.h"

uint8_t Key_clo[1]={0xFF};

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	Key_clo[0] = KEY_SCAN();
	if(Key_clo[0] == 4){
 		HAL_UART_Transmit(&huart1,Key_clo,1,10);
	}
}


/***
 *函数名:KEY_CLO_SCAN
 *功  能:按键列扫描
 *返回值:1~4,对应1~4列按键位置
 */
uint8_t KEY_CLO_SCAN(void)
{
    //读出列扫描状态
    Key_clo[0] = HAL_GPIO_ReadPin(C0_GPIO_Port,C0_Pin)<<3;
    Key_clo[0] = Key_clo[0] | (HAL_GPIO_ReadPin(C1_GPIO_Port,C1_Pin)<<2);
    Key_clo[0] = Key_clo[0] | (HAL_GPIO_ReadPin(C2_GPIO_Port,C2_Pin)<<1);
    Key_clo[0] = Key_clo[0] | (HAL_GPIO_ReadPin(C3_GPIO_Port,C3_Pin));

    if(Key_clo[0] != 0xFF)         
    {
      HAL_Delay(10);                    //消抖
      if(Key_clo[0] != 0xFF)
        {
                switch(Key_clo[0])
                {
                    case 0x07:         
                        return 1;
                    case 0x0b:         
                        return 2;
                    case 0x0d:        
                        return 3;
                    case 0x0e:         
                        return 4;
                    default :
                        return 0;
                }
        }
        else return 0;
    }
    else return 0;
}

/***
*函数名:KEY_SCAN
*功  能:4*4按键扫描
*返回值:0~16,对应16个按键
*/
uint8_t KEY_SCAN(void)
{
  uint8_t Key_Num=0;       //1-16对应的按键数
  uint8_t key_clo_num=0;       

  KEY_ROW0_OUT_LOW;
  if( (key_clo_num=KEY_CLO_SCAN()) != 0 )
  {
      while(KEY_CLO_SCAN() != 0);  //消抖
      Key_Num = 0 + key_clo_num;
  }
  KEY_ROW0_OUT_HIGH;

  KEY_ROW1_OUT_LOW;
  if( (key_clo_num=KEY_CLO_SCAN()) != 0 )
  {
      while(KEY_CLO_SCAN() != 0);
      Key_Num = 4 + key_clo_num;
  }
  KEY_ROW1_OUT_HIGH;

  KEY_ROW2_OUT_LOW;
  if( (key_clo_num=KEY_CLO_SCAN()) != 0 )
  {
      while(KEY_CLO_SCAN() != 0);
      Key_Num = 8 + key_clo_num;
  }
  KEY_ROW2_OUT_HIGH;

  KEY_ROW3_OUT_LOW;
  if( (key_clo_num=KEY_CLO_SCAN()) != 0 )
  {
      while(KEY_CLO_SCAN() != 0);
      Key_Num = 12 + key_clo_num;
  }
  KEY_ROW3_OUT_HIGH;

  return Key_Num;
}

void test(void){
	uint8_t num[1];
	num[0] = KEY_SCAN();
	if(num[0] > 0){
		HAL_UART_Transmit(&huart1, num, 1, 10);
	}
}

 

 

其他行完全读的出来而且正确。唯独第三行一直读不出按键行为

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^