野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20748|回复: 3

将LED例程修改了一下,请高手们指点

[复制链接]
发表于 2015-4-3 11:08:45 | 显示全部楼层 |阅读模式
本帖最后由 JavaBoy 于 2015-4-3 17:04 编辑

这份代码里有一个小错误,己在四楼更正

我之前有说过,我是做JAVA出身的,JAVA有一些特点,就是结构化很好,很重视"包装",把数据都包装到"Bean"里,这样的好处是写程序时不用太多考虑底层的东西,专注于业务逻辑。

于是我把例程例用JAVA的思想,修改了一下

******************* LED.H *****************

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

/**
  * @brief 将LED相关的数据项打包成结构体,做用类似于Java的Bean
  */
typedef struct {
         GPIO_TypeDef* GPIO_Group;
         uint16_t Pin;
} LED;

//声明三盏灯
LED Led_1,Led_2,Led_3;

//初始化
void LED_GPIO_Config(void);
//设定每一盏灯并保持熄灭状态
void Init(LED Led);
//开灯
void LED_ON(LED Led);
//关灯
void LED_OFF(LED Led);
                                       
#endif /* __LED_H */



******************* LED.C *****************

#include "led.h"

/**
*        @brief        初始化
*        @param        void
*        @retval        null
**/
void LED_GPIO_Config(void) {
                  
         //打开 GPIOB、GPIOF 的时钟
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF,ENABLE);
         
         //设定 Led1\2\3 的数据
         Led_1.GPIO_Group = GPIOB;
         Led_1.Pin = GPIO_Pin_0;
         
         Led_2.GPIO_Group = GPIOF;
         Led_2.Pin = GPIO_Pin_7;
         
         Led_3.GPIO_Group = GPIOF;
         Led_3.Pin = GPIO_Pin_8;
         
         //初始化
         Init(Led_1);
         Init(Led_2);
         Init(Led_3);

}

/**
*        @brief       初始化LED
*        @param        Led 每盏灯的数据包装容器,包括所属的GPIO组(GPIOx)和引脚(Pin)
*        @retval        null
**/
void Init(LED Led) {
         GPIO_InitTypeDef GPIO_InitStructure;
         
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_Pin = Led.Pin;
         
         //初始化
         GPIO_Init(Led.GPIO_Group,&GPIO_InitStructure);
         
         //关灯
         LED_OFF(Led);
         
}
  
/**
*        @brief        开灯
*        @param      
Led 每盏灯的数据包装容器,包括所属的GPIO组(GPIOx)和引脚(Pin)
*        @retval        null
**/
void LED_ON(LED Led) {
         GPIO_SetBits(Led.GPIO_Group,Led.Pin);
}
   
/**
*        @brief        关灯

*        @param      
Led 每盏灯的数据包装容器,包括所属的GPIO组(GPIOx)和引脚(Pin) *        @retval        null
**/
void LED_OFF(LED Led) {
         GPIO_ResetBits(Led.GPIO_Group,Led.Pin);
}





















回复

使用道具 举报

发表于 2015-4-3 13:40:34 | 显示全部楼层
很好,其实就是以面向对象的思想来编程
回复 支持 反对

使用道具 举报

发表于 2015-4-3 16:07:00 | 显示全部楼层
挺好的,学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-3 17:08:44 | 显示全部楼层
关于代码中的小错误:

******************* LED.H *****************

……

//声明三盏灯
LED Led_1,Led_2,Led_3;



这样是不行的,因为led.h要在led.c和main.c中引用两次,这样做就会导致重复定义,应该改为:


******************* LED.H *****************

……

//声明三盏灯

extern LED Led_1,Led_2,Led_3;



******************* LED.C *****************
……
LED Led_1,Led_2,Led_3;


/*************************************************

出错原因:还是对C语言语法不熟悉导致的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-7 02:21 , Processed in 0.045884 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表