上一節我們介紹了矩陣鍵盤的具體原理,這次我們來將實際操作。
首先,在MSP432中,對於按鍵的輸入就是檢測端口的高低電平來判斷矩陣鍵盤的按鍵情況。
首先我們打開CCS中的gpiointerrupt工程,打開syscfg文件,增加幾個輸入和輸出GPIO口,如下:
其中CONFIG_GPIO_A\B\C\D是屬於檢測我們矩陣鍵盤中ABCD的鍵值。CONFIG_GPIO_GREEN\BLUE\RED是屬於控制我們開發板上的三色LED燈。
然后我們打開gpiointerrupt.c這個文件,開始我們核心函數的編寫。
我們實驗的內容是:通過矩陣鍵盤檢測不同的鍵值ABCD亮不同顏色的燈。
像往常一樣,我們要引入GPIO的頭文件。
/* Driver Header files */ #include <ti/drivers/GPIO.h>
我們首先編寫四個回調函數,分別對應於我們MSP432檢測到按鍵端口電平變化,MSP432該執行什么函數,如亮紅綠藍燈,或者關閉所有燈。
void gpioButtonFxn0(uint_least8_t index) { /* Clear the GPIO interrupt and toggle an LED */ GPIO_toggle(CONFIG_GPIO_LED_0); } void gpioButtonFxnA(uint_least8_t index) { /* Clear the GPIO interrupt and toggle an LED */ GPIO_toggle(CONFIG_GPIO_RED); } void gpioButtonFxnB(uint_least8_t index) { /* Clear the GPIO interrupt and toggle an LED */ GPIO_toggle(CONFIG_GPIO_GREEN); } void gpioButtonFxnC(uint_least8_t index) { /* Clear the GPIO interrupt and toggle an LED */ GPIO_toggle(CONFIG_GPIO_BLUE); } void gpioButtonFxnD(uint_least8_t index) { /* 關閉所有LED燈 */ GPIO_write(CONFIG_GPIO_RED, CONFIG_GPIO_LED_OFF); GPIO_write(CONFIG_GPIO_GREEN, CONFIG_GPIO_LED_OFF); GPIO_write(CONFIG_GPIO_BLUE, CONFIG_GPIO_LED_OFF); }
在具體使用GPIO函數前,我們要先初始化GPIO:
/* Call driver init functions */ GPIO_init();
然后初始化具體端口:
/* Configure the LED and button pins */ GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); GPIO_setConfig(CONFIG_GPIO_BUTTON_0, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING); GPIO_setConfig(CONFIG_GPIO_A, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING); GPIO_setConfig(CONFIG_GPIO_B, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING); GPIO_setConfig(CONFIG_GPIO_C, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING); GPIO_setConfig(CONFIG_GPIO_D, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING); /* Turn off user LED */ GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF); GPIO_write(CONFIG_GPIO_GREEN, CONFIG_GPIO_LED_OFF); GPIO_write(CONFIG_GPIO_BLUE, CONFIG_GPIO_LED_OFF);
然后將我們的四個作為輸入的GPIO口與和我們的回調函數關聯起來,當我們的GPIO口檢測到下降沿的時候就開始執行回調函數。
/* install Button callback */ GPIO_setCallback(CONFIG_GPIO_BUTTON_0, gpioButtonFxn0); GPIO_setCallback(CONFIG_GPIO_A, gpioButtonFxnA); GPIO_setCallback(CONFIG_GPIO_B, gpioButtonFxnB); GPIO_setCallback(CONFIG_GPIO_C, gpioButtonFxnC); GPIO_setCallback(CONFIG_GPIO_D, gpioButtonFxnD);
同時我們還要開啟中斷:
/* Enable interrupts */ GPIO_enableInt(CONFIG_GPIO_BUTTON_0); GPIO_enableInt(CONFIG_GPIO_A); GPIO_enableInt(CONFIG_GPIO_B); GPIO_enableInt(CONFIG_GPIO_C); GPIO_enableInt(CONFIG_GPIO_D);
至此我們的程序就完全完成了,我們來看一下運行結果。