用自定义结构类型做的流水灯(这个在底部)

起初用原子的战舰初学STM32,接触流水灯时,由于是51过渡来的,总觉得两个灯看着别扭,自己也做了几个一排灯接在开发板上面。奈何原子的板子IO不是类似51的整组排列分布,所以当时接的电路是这样的

导致自己做个流水灯写了一堆的初始化,程序在这

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"

#define LED0 PBout(11)// PB11							声明LED0
#define LED1 PEout(15)// PE15	
#define LED2 PEout(13)// PE13
#define LED3 PEout(11)// PE11
#define LED4 PEout(9)// PE9
#define LED5 PEout(7)// PE7
#define LED6 PGout(0)// PG0
#define LED7 PFout(14)// PF14
#define LED8 PFout(12)// PF12
#define LED9 PBout(2)// PB2
#define LED10 PBout(0)// PB0
#define LED11 PCout(4)// PC4
#define LED12 PAout(6)// PA6
#define LED13 PAout(4)// PA4
#define LED14 PAout(0)// PA0
#define LED15 PCout(2)// PC2

void LED_Init(void);
void LED_Control(uint8_t LED_Number);

 int main(void)
 {
  uint8_t LED_Number = 0;	 
	delay_init();	     				 //延时函数初始化	
	
  while(1){			 
		LED_Control(LED_Number);			
		LED_Number ++;		
		if(17 == LED_Number)
			LED_Number = 0;					//当LED_Number=17时变为0
		delay_ms(100);					//延时100ms
		LED_Init();							//初始化与LED连接的硬件接口		
	}	   	  	 
 }

void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG, ENABLE);	
	// 控制GPIO的引脚配置
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_6;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 				 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;				 //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 					
 GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_6);	 //PA.0 4 6  输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_11;	    // 端口配置, 
 GPIO_Init(GPIOB, &GPIO_InitStructure);	  													
 GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_11); 						

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4;	    		 // 端口配置, 推挽输出
 GPIO_Init(GPIOC, &GPIO_InitStructure);	  									 
 GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_4); 					 //PC.2 4 输出高 

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15;	  //端口配置, 
 GPIO_Init(GPIOE, &GPIO_InitStructure);	 
 GPIO_SetBits(GPIOE,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15);			//PE.7 9 11 13 15 输出高 

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;	    		 // 端口配置, 
 GPIO_Init(GPIOF, &GPIO_InitStructure);	 											
 GPIO_SetBits(GPIOF,GPIO_Pin_12|GPIO_Pin_14); 							 //PF.12 14 输出高 

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	    			 // 端口配置, 
 GPIO_Init(GPIOG, &GPIO_InitStructure);	  					 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOG,GPIO_Pin_0); 						 //PG.0 输出高 
}

void LED_Control(uint8_t LED_Number)
{
	switch(LED_Number)
	{
				case 1:LED0=0;break;
				case 2:LED1=0;break;
				case 3:LED2=0;break;
				case 4:LED3=0;break;
				case 5:LED4=0;break;
				case 6:LED5=0;break;
				case 7:LED6=0;break;
				case 8:LED7=0;break;
				case 9:LED8=0;break;
				case 10:LED9=0;break;
				case 11:LED10=0;break;
				case 12:LED11=0;break;
				case 13:LED12=0;break;
				case 14:LED13=0;break;
				case 15:LED14=0;break;
				case 16:LED15=0;break;				//给对应的IO口低电平,使得灯亮
  }
}


最近看了下数据结构的内容,弥补之前的过错用数据结构重写了个,算是相对之前能入眼。IO用的是


程序如下

#define LED1_PIN			GPIO_Pin_12
#define LED1_GPIO			GPIOB
#define LED1_RCC			RCC_APB2Periph_GPIOB

#define LED2_PIN			GPIO_Pin_14
#define LED2_GPIO			GPIOB
#define LED2_RCC			RCC_APB2Periph_GPIOB

#define LED3_PIN			GPIO_Pin_8
#define LED3_GPIO			GPIOD
#define LED3_RCC			RCC_APB2Periph_GPIOD

#define LED4_PIN			GPIO_Pin_10
#define LED4_GPIO			GPIOD
#define LED4_RCC			RCC_APB2Periph_GPIOD

#define LED5_PIN			GPIO_Pin_12
#define LED5_GPIO			GPIOD
#define LED5_RCC			RCC_APB2Periph_GPIOD

#define LED6_PIN			GPIO_Pin_14
#define LED6_GPIO			GPIOD
#define LED6_RCC			RCC_APB2Periph_GPIOD

#define LED7_PIN			GPIO_Pin_2
#define LED7_GPIO			GPIOG
#define LED7_RCC			RCC_APB2Periph_GPIOG

#define LED8_PIN			GPIO_Pin_4
#define LED8_GPIO			GPIOG
#define LED8_RCC			RCC_APB2Periph_GPIOG



 
#include <stm32f10x.h>
#include <led.h>
#include <stdio.h>
#include <delay.h>
typedef struct
{
	uint32_t ir_rcc;
	GPIO_TypeDef * ir_gpio;
	uint16_t ir_pin;
}GPIO_Config;

const GPIO_Config led[8]={
	LED1_RCC, LED1_GPIO, LED1_PIN,
	LED2_RCC, LED2_GPIO, LED2_PIN,
	LED3_RCC, LED3_GPIO, LED3_PIN,
	LED4_RCC, LED4_GPIO, LED4_PIN,
	LED5_RCC, LED5_GPIO, LED5_PIN,
	LED6_RCC, LED6_GPIO, LED6_PIN,
	LED7_RCC, LED7_GPIO, LED7_PIN,	
	LED8_RCC, LED8_GPIO, LED8_PIN,
};

void LED_GPIO_Config()
{
	u8 i;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		for(i=0; i<8; i++)
	{
		RCC_APB2PeriphClockCmd(led[i].ir_rcc, ENABLE);

		GPIO_InitStructure.GPIO_Pin = led[i].ir_pin;

		GPIO_Init(led[i].ir_gpio, &GPIO_InitStructure);
		GPIO_SetBits(led[i].ir_gpio,led[i].ir_pin);
	}
}
int main()
{
	u8 j;
	delay_init();
	LED_GPIO_Config();
	while(1)
	{
		for(j=0;j<8;j++)
		{
			GPIO_ResetBits(led[j].ir_gpio,led[j].ir_pin);
			delay_ms(500);
			GPIO_SetBits(led[j].ir_gpio,led[j].ir_pin);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值