一、基本介紹
(1) STM32F7的IO口做輸入使用的時候,是通過調用函數HAL_GPIO_ReadPin( )來讀取I0口的狀态的。
(2) 實驗目的:我們将通過ALIENTEK阿波羅STM32開發闆上載有的4個按鈕(KEY_UP、KEYO、KEY1和KEY2),來控制闆上的2個LED(DSO和DS1),其中KEY_UP控制DS0,DS1互斥點亮;KEY2控制DS0,按一次亮,再按一次滅;KEY1控制DS1,效果同KEY2;KEYO則同時控制DS0和DS1,按一次,他們的狀态就翻轉一次。
二、硬體連接配接
引腳 | 硬體 |
PA0 | WK_UP |
PH3 | KEY0 |
PH2 | KEY1 |
PC13 | KEY2 |
三、代碼及分析
key.c
#include "key.h"
#include "delay.h"
//按鍵初始化函數
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //開啟GPIOA時鐘
__HAL_RCC_GPIOC_CLK_ENABLE(); //開啟GPIOC時鐘
__HAL_RCC_GPIOH_CLK_ENABLE(); //開啟GPIOH時鐘
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_INPUT; //輸入
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_13; //PC13
GPIO_Initure.Mode=GPIO_MODE_INPUT; //輸入
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3
HAL_GPIO_Init(GPIOH,&GPIO_Initure);
}
//按鍵處理函數
//傳回按鍵值
//mode:0,不支援連續按;1,支援連續按;
//0,沒有任何按鍵按下
//1,WKUP按下 WK_UP
//注意此函數有響應優先級,KEY0>KEY1>KEY2>WK_UP!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按鍵松開标志,定義靜态變量,隻能初始化一次,後續調用時的值為上一時刻的值
if(mode==1)key_up=1; //支援連按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))//如果有一個按鍵按下
{
delay_ms(10);
key_up=0;
if(KEY0==0) return KEY0_PRES;
else if(KEY1==0) return KEY1_PRES;
else if(KEY2==0) return KEY2_PRES;
else if(WK_UP==1) return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0; //無按鍵按下
}
在函數KEY_Init()中,編寫按鍵的初始化函數。因為要用到PA口、PC口、PH口的引腳,是以要使能對應分組的時鐘。PA0配置為輸入、下拉、高速。而PH2,3、PC13要配置成輸入、上拉、高速。
main.c
int main(void)
{
u8 key;
u8 led0sta=1,led1sta=1; //LED0,LED1的目前狀态
Cache_Enable(); //打開L1-Cache
HAL_Init(); //初始化HAL庫
Stm32_Clock_Init(432,25,2,9); //設定時鐘,216Mhz
delay_init(216); //延時初始化
uart_init(115200); //序列槽初始化
LED_Init(); //初始化LED
KEY_Init(); //按鍵初始化
while(1)
{
key=KEY_Scan(1); //得到鍵值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制LED0,LED1互斥點亮
led1sta=!led1sta;
led0sta=!led1sta;
break;
case KEY2_PRES: //控制LED0翻轉
led0sta=!led0sta;
break;
case KEY1_PRES: //控制LED1翻轉
led1sta=!led1sta;
break;
case KEY0_PRES: //同時控制LED0,LED1翻轉
led0sta=!led0sta;
led1sta=!led1sta;
break;
}
LED0(led0sta); //控制LED0狀态
LED1(led1sta); //控制LED1狀态
}else delay_ms(10);
}
}
首先引入相應的頭檔案,并初始化相關函數。在switch語句中,看那個case 條件成立,就會執行相應的語句。在while循環中,比如 led1sta=!led1sta,就能使led1sta狀态由高到低不停的翻轉。