基於STM32F103ZET6主控平臺實現簡單的LED BEEP KEY驅動
阿新 • • 發佈:2018-12-10
一個熱愛程式碼的工程師,唯有憑藉雙手不斷敲打,才可以快速提升實力!
本文謹以記錄,日後相忘時再作複習,程式碼沒有貴賤,既來之則安之。
第一步:瞭解LED/BEEP/KEY與STM32F103ZET6主控晶片對應的連線引腳
DS1(LED0) —— PB5
DS2(LED1) —— PE5
BEEP ———— PB8
KEY0 ———— PE4
KEY1 ———— PE3
KEY_UP ——— PA0
第二步:建立相應的驅動資料夾,並建立對應的LED/BEEP/KEY的驅動檔案.c和.h
第三步:配置LED/BEEP/KEY
LED的配置檔案
//led.c #include "led.h" void LED_Init(void)//LED初始化函式 { RCC->APB2ENR|=1<<3; //開啟GPIOB時鐘 RCC->APB2ENR|=1<<6; //開啟GPIOE時鐘 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000; //設定PB5為普通輸出 GPIOB->ODR|=1<<5; //拉高PB5 GPIOE->CRL&=0XFF0FFFFF; GPIOE->CRL|=0X00300000; //設定PE5為普通輸出 GPIOE->ODR|=1<<5; //拉高PE5 } //led.h #ifndef __LED_H #define __LED_H #include "sys.h" #define LED0 PBout(5)//DS1 #define LED1 PEout(5)//DS2 void LED_Init(void); #endif
BEEP的配置檔案
//beep.c #include "beep.h" void BEEP_Init(void) { RCC->APB2ENR|=1<<3;//開啟GPIOB的時鐘 GPIOB->CRH&=0XFFFFFFF0; GPIOB->CRH|=0X00000003; GPIOB->ODR|=~(1<<8);//拉低關閉蜂鳴器 } //beep.h #ifndef BEEP_H #define BEEP_H #define BEEP PBout(8) #include "sys.h" void BEEP_Init(void); #endif
KEY的配置檔案
//key.c #include "key.h" //按鍵初始化 void KEY_Init(void) { RCC->APB2ENR|=1<<6; //開啟GPIOE時鐘 RCC->APB2ENR|=1<<2; //開啟GPIOA時鐘 GPIOE->CRL&=0XFFF00FFF;//配置PE3 4為普通輸入模式 GPIOE->CRL|=0X00088000; GPIOA->CRL&=0XFFFFFFF0;//配置PA0為普通輸入模式 GPIOA->CRL|=0X00000008; GPIOE->ODR|=3<<3; //PE3 4 上拉 } //按鍵處理函式 u8 Key_Scan(u8 mode) { static u8 stat=1; if(mode)stat=1; if((KEY0==0||KEY1==0||KEY_UP==1)&&stat) { stat=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(KEY_UP==0)return KEYUP_PRES; } else if(KEY0==1||KEY1==1||KEY_UP==0) stat=1; return 0; } //key.h #ifndef __KEY_H #define __KEY_H #include "sys.h" #define KEY0 PEin(4) #define KEY1 PEin(3) #define KEY_UP PAin(0) #define KEY0_PRES 1 #define KEY1_PRES 2 #define KEYUP_PRES 3 void KEY_Init(void); u8 Key_Scan(u8 mode); #endif
第四步:編寫main函式
/*
* 杭州小膚科技 嵌入式軟硬體工程師 自正點原子改編
*/
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
u8 Wl_stat=0;
int main(void)
{
u8 key_stat,start=5;
Stm32_Clock_Init(9); //系統時鐘設定
delay_init(72); //延時初始化
uart_init(72,115200); //串列埠初始化為115200
LED_Init();
BEEP_Init();
KEY_Init();
printf("-------------------- \r\n");
printf(" 自學->嵌入式 \r\n");
printf(" 版本:1.0.0 \r\n");
printf("-------------------- \r\n");
while(1)
{
if(Wl_stat==0)//代表進入WHILE迴圈
{
printf("Input While(1)-->\r\n");
Wl_stat=1;
}
key_stat=Key_Scan(1); //設定為不支援連續按模式
if(key_stat==1) //key0按下->DS1
{
while(start--)
{
LED0=0;//DS1
delay_ms(300);
LED0=1;
delay_ms(300);
}
start=5;
}
else if(key_stat==2) //key1按下->DS2
{
while(start--)
{
LED1=0;//DS2
delay_ms(300);
LED1=1;
delay_ms(300);
}
start=5;
}
else if(key_stat==3) //key_up按下
{
BEEP=1;
delay_ms(1000);
BEEP=0;
}
}
}
第五步:編譯通過後,燒錄進STM32F103ZET6開發板,實現程式設計效果即可。
想太多,做太少,怎改變自己
謝謝大家的關注和支援,來自一個嵌入式軟硬體工程師的內心情感!
PS:本文的程式碼參考正點原子