STM32 开关控制LED灯闪烁

一、说明:

研1新生自学嵌入式,配套江协,自己复习食用。

STM32 F103C8T2

1.模块化编程:

为了简化代码,将代码分为main.c ,LED.c,KEY.c,并设置好头文件.h文件,在魔术棒中添加好。

2.头文件文件设置方法:

1.首先新建一个文件夹,里面分别建立LED.c,LED.h,KEY.c,KEY.h文件。

配置KEY.h文件:(#infdef及#define 需要__KEY_H)

#ifndef  __KEY_H

#define __KEY_H
void KEY_Init(void); (注意分号)
 int KEY_Getnum(void);

#endif

3.设备:

根据江协科技所给的设备及其连线

这节课新学的函数!

1.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);‘

这个函数是用来读取输入数据寄存器某一个端口的输入值的

uint16_t GPIO_Pin;

用来指定某一个端口

uint8_t;

用来代表返回值的高低电平;(可以用来读取按键)


2. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

uint16_t是一个16位的数据,每一位代表一个端口值;(整个);


3. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

这个函数是用来读取输出数据寄存器某一个端口的输入值的;


4.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

int16_t是一个16位的数据,每一位代表一个端口值;(整个);

4.输入数据寄存器(GPIO_ReadInputDataBit,GPIO_ReadInputData)读取;

5.输出数据寄存器(GPIO_ReadoutDataBit,GPIO_ReadoutData)读取;

三、正式编写

LED编写:

打开LED.c

#include "stm32f10x.h"  

GPIO_InitTypeDef GPIO_InitStructure;

void LED_Init(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置上拉模式,按下开关为低电平,默认为高电平
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);
}   初始化

void LED1_ON(void)(控制LED_1启动函数)

    GPIO_ResetBits(GPIOA,GPIO_Pin_1);(将GPIO_Pin_1设置为低电平)
}

void LED1_OFF(void)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_1);(将GPIO_Pin_2设置为低电平)
}

void LED2_ON(void)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}

void LED2_OFF(void)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_2);
}

以上为控制灯亮灯灭函数

void LED1_TURN(void) 取反,
{
    if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) 读取输出位高低电平,
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_1); 将pin_1设置为高电平
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_1);//    将pin_1设置为低电平
    }
}

void LED2_TURN(void)
{
    if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_2);//将pin_2设置为高电平
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_2);//   将pin_2设置为低电平
    }

}

第二部分

include "stm32f10x.h"                
#include "Delay.h"
GPIO_InitTypeDef GPIO_InitStructure1;

void KEY_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure1.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;
    GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure1);
    
} 初始化

uint8_t KEY_Getnum(void)
{

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) (用来读取输入数据寄存器某一个端口的输入值的,按键按下为低电平,(上拉模式))
    {
        Delay_ms(20);(消除抖动)
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
        Delay_ms(20);
        KEY_num=1;(按下赋予1,在第三部分接收)
    }
    
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
    {
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);
        Delay_ms(20);
        KEY_num=2;
    }
    return KEY_num;
}

第三部分

#include "LED.h"
#include "KEY.h"

uint8_t KeyNum;
int main(void)
{
    LED_Init();
    KEY_Init();
        
    while (1)
    {    
        KeyNum =KEY_Getnum();
        if(KeyNum==1)(第一个开关按下)
        {
            LED1_TURN();下面分析
        }
        
        if(KeyNum==2)
        {
            LED2_TURN();
        }
        
        
    }
}

void LED1_TURN(void) 取反,
{
    if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) 读取输出位高低电平,
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_1); 将pin_1设置为高电平,如果此时是高电平,输出模式为上拉模式,LED的双引脚都是高电平,无法点亮,LED熄灭
    }
    else
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_1);//    将pin_1设置为低电平,pin_1设置为低电平,如果此时是高电平,输出模式为上拉模式,LED的双引脚一高一低电平,点亮LED。
    }

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值