void gpio_keypads_init(void)
void keypads_rowscan_ipu()
void keypads_linescan_out_pp()
void keypads_rowscan_out_pp()
然後就是行列分別配置推挽輸出和下拉輸入。
int key_line = 0;
char key_val;
char keypads_scan()
else if(gpio_readinputdatabit(gpioa,gpio_pin_5) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_6) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_7) == 0)
else key_line = 0;
switch(key_line)
key_line = 0;
keypads_linescan_ipu();
keypads_rowscan_out_pp();
}else if(gpio_readinputdatabit(gpiob,gpio_pin_1) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_5) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_6) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_7) == 0)
else key_line = 0;
switch(key_line)
key_line = 0;
keypads_linescan_ipu();
keypads_rowscan_out_pp();
}else if(gpio_readinputdatabit(gpiob,gpio_pin_2) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_5) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_6) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_7) == 0)
else key_line = 0;
switch(key_line)
key_line = 0;
keypads_linescan_ipu();
keypads_rowscan_out_pp();
}else if(gpio_readinputdatabit(gpioa,gpio_pin_8) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_5) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_6) == 0)
else if(gpio_readinputdatabit(gpioa,gpio_pin_7) == 0)
else key_line = 0;
switch(key_line)
key_line = 0;
keypads_linescan_ipu();
keypads_rowscan_out_pp();
}return key_val;
}之後就是鍵盤掃瞄程式,在檢測到行電平之後進入switch,然後將行io口切換為推挽輸出,列io口切換為上拉輸入,這樣是最簡單但是是最直觀的寫法。
之前寫的鍵盤掃瞄沒有在檢測的時候加入io口型別切換,雖然測試的時候很正常,但是換了其他的條件之後(比如換了電源,換了其他電路板等情況),就變得不正常,按鍵在特定情況下才有輸出(原因一直還沒有排查清楚)。
總之,最妥善的寫法還是需要加上io口狀態的切換。
矩陣鍵盤掃瞄
矩陣鍵盤掃瞄一般採取行列掃瞄法。比如先拉低所有列線,拉高行線,之後讀取行線狀態,如果行線有一行為低,則假設有按鍵按下,此時再延時20毫秒左右後判 斷行線的某一行是否仍然為低,若為低則確認有鍵按下。這時可以進行按鍵鍵值判斷,即判別在哪一行哪一列有按鍵按下。判斷的方法是通過拉高列線,依次置行線 的某一行...
矩陣鍵盤掃瞄
矩陣鍵盤掃瞄 module matrix keyboard input clk 50m,50m時鐘 input rst n,復位 input 3 0 row,矩陣鍵盤行輸入 output reg 3 0 col,矩陣鍵盤列輸出 output reg key flag,按鍵按下標誌 output re...
矩陣鍵盤掃瞄
根據矩陣鍵盤的原理圖可知,當沒有按鍵按下時,p1 0xf0 然後依次將p1 0 p1 3單獨置低電平,其他置高,再掃瞄各列的狀態,來判斷是哪個按鍵按下,比如,將p1 0輸出低電平,其他的引腳都輸出高電平,即p1 0xfe,那麼當第1行有按鍵按下時p1的相應值為,1x1 01111110 0x7e 1...