其實接觸STM32已經快半年了,端斷續續的也學習了一下的STM32的各個模塊的基本功能,剛開始的時候也是看比人的寫的代碼,看懂了然后再去修改,能夠在自己的平台上實現基本的功能,也就是到現在才能真正的按照自己的想法來實現寫功能,在本文中我將介紹下比較經典的按鍵驅動程序的實現方式--查詢,當然中斷方式的應用也比較廣泛,在此先不做介紹了。
首先我的硬件平台是奮斗版STM32,之所以選擇這款開發版是因為板子提供了許多關於ucos和ucgui的例程,想往這方面發展的童鞋可以考慮哦,呵呵,不多說了,開發板帶的芯片型號是STM32F103VET6: 64K 片內SRAM,512K 片內FALSH.
本文所用到的外設:3個led以及4個按鍵,基本功能就是開發板上電3個led點亮,按下按鍵1時led滅,按下按鍵2時led2熄滅,按下按鍵3時led3熄滅,通過查詢方式來獲取鍵值
接口設置情況:led燈: V6-PB5--LED1
V7-PD6--LED2
V8-PD3--LED3
按鍵:K1--PC5
K2--PC2
K3--PC3
K4--PE6
函數部分:首先是主函數:
int main(void)
{
TYPEDEF_KEY key = KEY_NULL;
RCC_Configuration(); //系統時鍾配置
LED_Config(); //LED控制配置
Key_Config();
LED1_ON; //開發板上電之后3個LED亮,這里是用宏定義的方式來寫的:
//#define LED1_ON GPIO_SetBits(GPIOB, GPIO_Pin_5); //PB5置1 點亮LED1
LED2_ON;
LED3_ON;
while (1)
{
key = GetKey(); //獲取鍵值
if(key == KEY_1)
{
LED1_OFF; //按鍵1被按下 在按鍵釋放后LED滅
}
if(key == KEY_2)
{
LED2_OFF;
}
if(key == KEY_3)
{
LED3_OFF;
}
if(key == KEY_4)
{
LED1_ON; //按鍵4被按下,在按鍵釋放后3個LED全部點亮
LED2_ON;
LED3_ON;
}
Delay(10);
}
}
接着就是LED的配置函數:
void LED_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);//外設時鍾使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3; //LED2, LED3
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
接着就是按鍵的配置函數:4個按鍵配置為上拉輸入模式
void Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(KEY1_PORT_APB2Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY1_PIN; //#define KEY1_PIN GPIO_Pin_5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_Init(KEY1_PORT, &GPIO_InitStructure); //#define KEY1_PORT GPIOC
RCC_APB2PeriphClockCmd(KEY2_PORT_APB2Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY2_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY2_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(KEY3_PORT_APB2Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY3_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY3_PORT, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(KEY4_PORT_APB2Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY4_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY4_PORT, &GPIO_InitStructure);
}
查詢方式獲取鍵值函數:
TYPEDEF_KEY GetKey(void)
{
TYPEDEF_KEY key = KEY_NULL;
if( GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0 || GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN) == 0 || GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN) == 0 || GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN) == 0) //有鍵按下
{
Delay(10000); //去抖動
if(GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0)
{
key = KEY_1;
}
else if(GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN) == 0)
{
key = KEY_2;
}
else if(GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN) == 0)
{
key = KEY_3;
}
else if(GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN) == 0)
{
key = KEY_4;
}
else
{
return(KEY_NULL);
}
while(GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0 || GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN) == 0 || GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN) == 0 || GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN) == 0)//等待鍵抬起
{
Delay(20);
}
return(key);
}
return(KEY_NULL);
}
枚舉類型:按鍵值
typedef enum
{
KEY_1, KEY_2, KEY_3, KEY_4, KEY_NULL = 0xff,
}TYPEDEF_KEY;
創客學院全新視頻盡在:www.makeru.com.cn
嵌入式學習交流群:561213221