1. 程式人生 > >微控制器矩陣按鍵長短按

微控制器矩陣按鍵長短按

實習的時候,同事給了我一個矩陣鍵盤程式,竟然長達1千多行程式碼,當時我就嚇尿了。仔細分析程式碼,也未見其獨到之處,僅僅是普通的按鍵掃描以及判斷長短按。但其中使用的結構很複雜,中間產生的臨時變數特別多,而且指標很多,也不容易移植。稍微搜尋一下網上的程式,也並不是很詳盡。這裡貼出我的程式給大家參考一下,是基於NUC100RE3AN微控制器的。這裡不使用太多列舉以及巨集定義,大家根據自己的需求去修改吧。

1首先定義矩陣的行列,已經相對應的引腳列表

#define LINE 4
#define COLUMN 4

uint8_t key_line[LINE][2]={
{GPC,7},
{GPC,7},
{GPC,7},
{GPC,7},
};
uint8_t key_column[COLUMN][2]={
{GPC,8},
{GPC,9},
{GPC,10},
{GPC,11},
};


2定義一個存放按鍵狀態的陣列,0無按鍵,1短按,2長按
uint8_t key[LINE][COLUMN];


3初始化矩陣鍵盤,將引腳列表裡面的行列進行輸入輸出設定,該拉高的拉高,該拉低的拉低
void key_matrix_init()
{
uint8_t i;
for(i=0;i<LINE;i++)
{
DrvGPIO_Open((DRVGPIO_PORT)key_line[i][0],key_line[i][1],IO_OUTPUT);
DrvGPIO_ClrBit((DRVGPIO_PORT)key_line[i][0],key_line[i][1]);
}
for(i=0;i<COLUMN;i++)
{
DrvGPIO_Open((DRVGPIO_PORT)key_column[i][0],key_column[i][1],IO_INPUT);
}
}

4巨集定義一個時間值,當按鍵按下超過這個值時判斷為長按
#define LONG_TIME 20


5巢狀的for迴圈對按鍵進行掃描。掃描完成後,按鍵狀態便存放在陣列key中了。

void key_matrix_scan()
{
int long_flag_cnt=0;
uint8_t i,j;

for(i=0;i<LINE;i++)
{
DrvGPIO_ClrBit((DRVGPIO_PORT)key_line[i][0],key_line[i][1]);
for(j=0,long_flag_cnt=0;j<COLUMN;j++)
{
if(DrvGPIO_GetBit((DRVGPIO_PORT)key_column[j][0],key_column[j][1])==0)
{
delay_ms(10);
while(DrvGPIO_GetBit((DRVGPIO_PORT)key_column[j][0],key_column[j][1])==0)
{
long_flag_cnt++;
if(long_flag_cnt>=LONG_TIME)
{
break;
}
delay_ms(1);
}
if(long_flag_cnt>=LONG_TIME)
{
key[i][j]=2;
//long_flag_cnt=0;
}
else
{
key[i][j]=1;
delay_ms(10);
}
}
}
DrvGPIO_SetBit((DRVGPIO_PORT)key_line[i][0],key_line[i][1]);
}

}

說明:

當要對矩陣鍵盤進行修改的時候,只需要修改步驟1中的行列大小以及相應的引腳列表即可。

本人QQ1607114262,有什麼不懂的地方可以找我。