STM32--点亮LED灯

1、GPIO的基本结构

在这里插入图片描述

2、GPIO的寄存器

每个GPIO端口有:
两个配置寄存器(GPIOx_CRL,GPIOx_CRH)
两个数据寄存器(GPIOx_IDR和GPIOx_ODR)
一个置位/复位寄存器(GPIOx_BSRR),
一个复位寄存器(GPIOx_BRR)
一个锁定寄存器(GPIOx_LCKR)

3、GPIO的模式

  • GPIO_Mode_AIN 模拟输入
  • GPIO_Mode_IN_FLOATING 浮空输入
  • GPIO_Mode_IPD 下拉输入
  • GPIO_Mode_IPU 上拉输入
  • GPIO_Mode_Out_OD 开漏输出
  • GPIO_Mode_Out_PP 推挽输出
  • GPIO_Mode_AF_OD 复用开漏输出
  • GPIO_Mode_AF_PP 复用推挽输出

4、GPIO输出模式的速率

  • GPIO_Speed_10MHz ,最高输出速率为10MHZ
  • GPIO_Speed_2MHz, 最高输出速率为2MHZ
  • GPIO_Speed_50MHz,最高输出速率为50MHZ

5、GPIO库函数

在这里插入图片描述

6、开始实践—点亮流水灯

led.c文件(我这里使用的是PC13、PC14、PC15这三个IO口,可根据自己的实际修改)

#include "led.h"
//初始化PC13、PC14、PC15为输出口.并使能这3个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 //使能PC端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;				 //LED0-->PC13、14、15 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOC, &GPIO_InitStructure);					 //根据设定参数初始化GPIOC13
 GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);	 //PC13、14、15 输出高

}

led.h文件(我这里使用的是PC13、PC14、PC15这三个IO口,可根据自己的实际修改)

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"

#define LED0 PCout(13)// PC13
#define LED1 PCout(14)// PC14
#define LED2 PCout(15)// PC15
void LED_Init(void);//初始化		    
#endif

key.c文件(我这里使用的是PB12、13、14、15这4个IO口,可根据自己的实际修改)

#include  "stm32f10x.h"
#include "key.h"

//初始化
void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTB时钟

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;//KEY1-KEY4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB15,14,13,12
	

}

key.h文件(我这里使用的是PB12、13、14、15这4个IO口,可根据自己的实际修改)

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"

#define KEY1  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)//读取按键1
#define KEY2  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)//读取按键2
#define KEY3  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)//读取按键3
#define KEY4  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)//读取按键4

void KEY_Init(void);//IO初始化		    
#endif

1、实现LED1、LED2、LED3正向流水灯功能(即依次顺序点亮,从上到下),LED间隔时间0.2S

#include "sys.h"	
#include "delay.h"	
#include "led.h" 
 int main(void)
 {
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	while(1)
	{
	LED0=0;LED1=1;LED2=1;delay_ms(200);
	LED0=1;LED1=0;LED2=1;delay_ms(200);
	LED0=1;LED1=1;LED2=0;delay_ms(200);
	}
 }

2、分别用按键1、2、3分别控制LED0、LED1、LED2的开关

 #include "sys.h"	
#include "delay.h"	
#include "led.h" 
#include "key.h"
 int main(void)
 {
	 vu8 key=0;

	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	KEY_Init();
	 
	while(1)
	{
		if(KEY1 == 0)//LED0
		{
			delay_ms(10);
			if(KEY1 ==0)
			{
				while(!KEY1);
				LED0=!LED0;
			}
		}
		
		if(KEY2 == 0)//LED1
		{
			delay_ms(10);
			if(KEY2 ==0)
			{
				while(!KEY2);
				LED1=!LED1;
			}
		}
		if(KEY3 == 0)//LED2
		{
			delay_ms(10);
			if(KEY3 ==0)
			{
				while(!KEY2);
				LED2=!LED2;
			}
		}
	}
}

3、若键盘未按下,LED1、LED2、LED3交替闪烁,每个LED闪烁间隔时间0.2S(一亮一灭共0.2S),持续1S。
若键盘K2按下,实现LED1、LED2、LED3正向流水灯功能(即依次顺序点亮,从上到下),LED间隔时间0.2S。
若键盘K3按下,实现LED1、LED2、LED3反向流水灯功能(即依次顺序点亮,从下到上),LED间隔时间0.2S。

#include "sys.h"	
#include "delay.h"	
#include "led.h" 
#include "key.h"

 int main(void)
 {
	int i;
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	KEY_Init();	  	 	//初始化与按键连接的硬件接口
	 
	LED0=0;LED1=1;LED2=1;delay_ms(200);
	LED0=1;LED1=0;LED2=1;delay_ms(200);
	LED0=1;LED1=1;LED2=0;delay_ms(200);
 
	while(1)
	{
		if(KEY1 == 0)
		{
			delay_ms(10);
			for(i=0;i<5;i++)//从上到下流水5次
			{
				LED0=0;LED1=1;LED2=1;delay_ms(200);
				LED0=1;LED1=0;LED2=1;delay_ms(200);
				LED0=1;LED1=1;LED2=0;delay_ms(200);	
			
			}
		}
	
		if(KEY2 == 0)
		{
			delay_ms(10);
			for(i=0;i<5;i++)//从下到上流水5次
			{
				LED0=1;LED1=1;LED2=0;delay_ms(200);	
				LED0=1;LED1=0;LED2=1;delay_ms(200);
				LED0=0;LED1=1;LED2=1;delay_ms(200);
			}
		
		}
		

	}
}

今天的学习就到这里啦,加油加油,我们下次见!!!

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y黎好好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值