按鍵控制燈的亮與滅的效果圖:
一、寄存器開發與庫函數開發的優缺點
1、寄存器開發
缺點:
(1)開發難度大,查閱相關手冊比較多
(2)開發效率相對低,產品周期長
(3)可維護性較差
(4)可移植性、閱讀性差
優點:
運行效率高。
2、庫函數開發
優點:
(1)開發難度小,有庫函數封裝,即可實現功能
(2)開發效率高,產品周期短
(3)可維護性高
(4)可移植性、閱讀性強
缺點:
運行效率相對寄存器低一些。
二、LED庫函數開發
LED庫開發要添加庫文件:stm32f4xx_gpio.c
(1)原理圖可參看上篇文章:入門篇 | STM32F407寄存器開發--點燈
(2)打開GPIOF組時鐘,也叫做使能F組時鐘(STM32當中外設的時鐘不打開,降低功耗)
(3)設置GPIOF9 引腳為輸出模式 輸出推挽 上拉 速度
/*
引腳說明:
LED0連接在PF9引腳
PF9輸出VCC(1),燈滅
PF9輸出GND(0),燈亮
*/
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIO F組時鐘,
//RCC_AHB1ENR |= (0x01<<5);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //引腳9
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //快速
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF, &GPIO_InitStruct);
}
(4)通過置位或者復位函數控制引腳電平來點燈
GPIO_SetBits( ) :置位(1)
GPIO_ResetBits( )復位(0)
int main(void)
{
//LED燈初始化
Led_Init();
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9); //PF9置1 燈滅
delayms(1000);
GPIO_ResetBits(GPIOF,GPIO_Pin_9);//PF9置0 燈亮
delayms(1000);
}
return 0;
}
是不是比起寄存器點燈方便多啦!!!
二、按鍵庫函數開發
按鍵庫開發要添加庫文件:stm32f4xx_gpio.c
(1)理解按鍵輸入原理圖
按鍵S1連接PA0,
當按鍵S1按下時,PA0為低電平
當按鍵S1未按下時,PA0為高電平
補充:由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產生這種現象而作的措施就是按鍵消抖。抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms。我們延時消抖即可
(2)打開GPIOA組時鐘,也叫做使能A組時鐘(STM32當中外設的時鐘不打開,降低功耗。
(3)設置GPIOA0 引腳為模式 上拉
/*
引腳說明:
KEY0(S1) -- PA0
*/
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIO A組時鐘,
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //引腳0
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //輸入模式
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
(4)通過函數獲取引腳電平(主函數使用此函數)
GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
結合上面led庫函數點燈來實現按鍵控制燈的亮與滅
int main(void)
{
//LED燈初始化
Led_Init();
Key_Init();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)//判斷是否按下
{
delayms(15); //延時消抖
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)//判斷是否按下
{
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0);//按鍵按下
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);//引腳狀態變更
}
}
}
return 0;
}
-
單片機
+關注
關注
6037文章
44564瀏覽量
635978 -
led燈
+關注
關注
22文章
1592瀏覽量
108069 -
寄存器
+關注
關注
31文章
5355瀏覽量
120541 -
STM32
+關注
關注
2270文章
10904瀏覽量
356397 -
STM32F407
+關注
關注
15文章
188瀏覽量
29495
發布評論請先 登錄
相關推薦
評論