#include <stdint.h>
// 假設你有一個適當的 delay 函數
void delay(uint16_t ms);
// 假設 P1 和 P1_x (x = 0, 1, 2, 3, 4, 5, 6, 7) 已經被定義并連接到相應的硬件
#define ROW_COUNT 4
#define COL_COUNT 4
// 矩陣鍵盤掃描函數
unsigned char matrix_keydown()
{
uint8_t row, col;
static const uint8_t rowPins[] = {P1_0, P1_1, P1_2, P1_3};
static const uint8_t colPins[] = {P1_4, P1_5, P1_6, P1_7};
static const uint8_t keyMap[ROW_COUNT][COL_COUNT] = {
{1, 5, 9, 13},
{2, 6, 10, 14},
{3, 7, 11, 15},
{4, 8, 12, 16}
};
for (row = 0; row < ROW_COUNT; ++row)
{
P1 = 0xFF; // 設置所有列為高電平
rowPins[row] = 0; // 將當前行設為低電平
for (col = 0; col < COL_COUNT; ++col)
{
if (colPins[col] == 0) // 檢查是否有列被拉低
{
delay(3); // 消抖
while (colPins[col] == 0); // 等待按鍵釋放
delay(3); // 消抖
return keyMap[row][col]; // 返回按鍵值
}
}
rowPins[row] = 1; // 恢復當前行為高電平,為下一行做準備
}
return 0; // 沒有按鍵被按下
}
可以嘗試一下這個方法,沒驗證過, |