一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力!
本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之。
第一步:了解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:本文的代码参考正点原子