1. 程式人生 > >基於STM32F103ZET6主控平臺實現簡單的LED BEEP KEY驅動

基於STM32F103ZET6主控平臺實現簡單的LED BEEP KEY驅動

一個熱愛程式碼的工程師,唯有憑藉雙手不斷敲打,才可以快速提升實力!

本文謹以記錄,日後相忘時再作複習,程式碼沒有貴賤,既來之則安之。

第一步:瞭解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:本文的程式碼參考正點原子