基于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==1)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:本文的代码参考正点原子

猜你喜欢

转载自blog.csdn.net/weixin_41586634/article/details/82770176