寫在前面:因?yàn)轫?xiàng)目內(nèi)需要用到機(jī)械的矩陣按鍵,所以這里整理一下有關(guān)矩陣按鍵的一些知識(shí)~溫故而知新。
一、矩陣按鍵的工作原理:
常用的按鍵操作方式有IO口按鍵、AD按鍵、觸摸按鍵、滑觸按鍵等,在使用IO口按鍵,且按鍵數(shù)量較多的時(shí)候,為了減少IO的占用,通常將按鍵設(shè)計(jì)為矩陣形式。矩陣式結(jié)構(gòu)的按鍵顯示比直接法要復(fù)雜一些,識(shí)別也要復(fù)雜一些,上圖中,行線通過電阻接正電源,并將行線作為輸入腳,列線作為輸出腳,當(dāng)按鍵沒有按下時(shí),所有的輸入腳都是高電平,代表無按鍵按下;一旦有按鍵按下,則輸入腳就會(huì)被拉低,所以通過讀取輸入腳的電平狀態(tài),就可以知道是否有按鍵按下。
二、矩陣按鍵的識(shí)別方法:
1、逐行掃描法、逐列掃描法(最常用);
2、高低電平翻轉(zhuǎn)法;
3、行列掃描法;
三、行列掃描法的工作原理:
1、編程使行線作為輸入腳(初始化為輸入低),列線作為輸出腳(初始化為輸出高);
2、掃描所有行線輸入腳,如果某個(gè)腳為高電平,則說明有按鍵按下,延時(shí)去抖,再次讀取該腳,如果電平還是高則進(jìn)入下一步,否則返回重新判斷;
3、開始掃描按鍵位置,逐列掃描,分別拉高列線輸出腳,當(dāng)拉高其中一列時(shí),其他列都拉低為低電平,讀取輸入腳的電平獲取按鍵值;
4、然后根據(jù)上面得到的行列計(jì)算出按鍵值;
四、行列掃描法代碼實(shí)現(xiàn):
第一種直接實(shí)現(xiàn),比較粗糙:
uint32_t Matrix_Key_Scan(void)
{
uint8_t outNum = 0;
uint8_t inNum = 0;
uint32_t ret = 0;
bool tmp = false;
for(inNum = 0; inNum < matrixkey_in_num; inNum++)
{
if(nrf_gpio_pin_read(matrixkey_in_num[inNum]))
{
nrf_delay_ms(30);
if(nrf_gpio_pin_read(matrixkey_in_num[inNum]))
{
for(outNum = 0; outNum < matrixkey_out_num; outNum++)
{
Set_MATRIX_OUTPUT_IO(outNum);
tmp = Read_Matrix_INPUT_IO(inNum);
if(tmp)
ret |= p_matrix_lookup[outNum+inNum*matrixkey_out_num];
}
}
}
}
return ret;
}
第二種比較精煉:
uint32_t Matrix_Key_Scan(void)
{
uint8_t outNum = 0;
uint8_t inNum = 0;
uint32_t ret = 0;
bool tmp = false;
for(outNum = 0; outNum < matrixkey_out_num; outNum++)
{
Set_MATRIX_OUTPUT_IO(outNum);
nrf_delay_ms(30);
for(inNum = 0; inNum < matrixkey_in_num; inNum++)
{
tmp = Read_Matrix_INPUT_IO(inNum);
if(tmp)
ret |= p_matrix_lookup[outNum+inNum*matrixkey_out_num];
}
}
return ret;
}