在 NK-N9H31A2 開發板:GPIO output 中,已經可以控制 LED 亮滅,接下來偵測按鈕並控制 LED 亮滅,關於 GPIO input 的知識可以參考韌體工程師需要懂一點硬體:GPIO 輸入輸出模式與實務應用整理
實驗目的
使用提供的函式偵測板子上的按鈕,按下後 LED 亮,反之則滅掉
使用範例
在官方的 SampleCode 中,找到 GPIO,匯入方式就不再贅述,可以參考上一篇
電路說明
由於下載下來的範例程式中,對應的腳位不一樣,所以要依照板子上的電路圖稍作調整將程式碼中的按鍵腳位設定改為 PI9 及 PH1
由於按鍵電路使用外部 pull-up 電阻,未按下時 GPIO 讀到為 1,按下時接地,GPIO 讀到為 0,因此按鍵為 Active Low 設計。
按鍵狀態最終會反映在 GPIO 的輸入數值中,透過函式讀取即可判斷目前按鍵狀態。
程式碼
以下的程式碼可以直接複製貼上,此篇文章中主要學會使用函式偵測按鍵是否按下的數值,並控制對應的 LED 亮滅,所以將原本官方的程式進行修改,僅保留偵測按鍵及控制 LED 的部分
int main(void)
{
int32_t i32Err;
sysDisableCache();
sysFlushCache(I_D_CACHE);
sysEnableCache(CACHE_WRITE_BACK);
sysInitializeUART();
sysprintf("+-------------------------------------------------+\n");
sysprintf("| GPIO Sample Code |\n");
sysprintf("+-------------------------------------------------+\n\n");
/* Configure Port F10 to output mode and pull-up, LED_2 */
GPIO_OpenBit(GPIOF, BIT10, DIR_OUTPUT, PULL_UP);
/* Configure Port I10 to output mode and pull-up, LED_1 */
GPIO_OpenBit(GPIOI, BIT10, DIR_OUTPUT, PULL_UP);
/* Configure Port I10 to input mode and pull-up, KEY_2 */
GPIO_OpenBit(GPIOH, BIT1, DIR_INPUT, PULL_UP);
/* Configure Port I9 to input mode and pull-up, KEY_1 */
GPIO_OpenBit(GPIOI, BIT9, DIR_INPUT, PULL_UP);
while (1)
{
/* use KEY_1 control LED_1 */
if (GPIO_ReadBit(GPIOI, BIT9) == 0) /* KEY_1 is push down */
{
GPIO_SetBit(GPIOI, BIT10); /* LED_1 OFF */
}
else
{
GPIO_ClrBit(GPIOI, BIT10); /* LED_1 ON */
}
/* use KEY_2 control LED_2 */
if (GPIO_ReadBit(GPIOH, BIT1) == 0) /* KEY_2 is push down */
{
GPIO_SetBit(GPIOF, BIT10); /* LED_1 OFF */
}
else
{
GPIO_ClrBit(GPIOF, BIT10); /* LED_1 ON */
}
}
// GPIO_CloseBit(GPIOF, BIT10);
// GPIO_CloseBit(GPIOI, BIT10);
// GPIO_CloseBit(GPIOH, BIT1);
// GPIO_CloseBit(GPIOI, BIT9);
while(1);
}
函式說明
這裡只針對上面程式使用到的 GPIO 函式說明,更多說明可以參考 gpio.h gpio.c
- GPIO_OpenBit
- 設定單一 GPIO 腳位的模式(port, bit, direction, pull)
- GPIO_SetBit
- 將指定 port 的 bit 驅動為高電位(1)
- GPIO_ClrBit
- 將指定 port 的 bit 驅動為低電位(0)
- GPIO_CloseBit
- 將單一 bit 恢復為預設/關閉狀態
- GPIO_ReadBit
- 讀取偵測到的 GOIO 狀態,高電位(1)低電位(0)
程式參考
Nuvoton 官方 github https://github.com/OpenNuvoton/N9H31_NonOS
延伸閱讀
