我想问一下。我将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);
}
}
其他行完全读的出来而且正确。唯独第三行一直读不出按键行为
不知道你这个问题是否已经解决, 如果还没有解决的话: