为什么要写这篇
温故而知新。
相比于最初的版本,下面这个程序代码已经将硬件层分离开来了,但是还有改进优化的地方,代码重复性太强,这个可能可读性稍微强一些,但是每增加一个RGB灯就会增添将近三十行重复性代码,一个源文件里有一半是重复性代码估计阅读体验也不会好吧。
/**
* led_1_set_color
* @brief 设置对应编号RGB灯颜色,七色可选,也可熄灭
* @param[in] color: 0,灭; 1,红; 2,黄 ;3,绿 ; 4,青; 5,蓝; 6,紫; 7,白
* @return void
*/
static void
led_1_set_color(uint8_t color)
{
switch (color)
{
case RED:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
break;
case GREEN:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
break;
case BLUE:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case YELLOW:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
break;
case PURPLE:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case CHING:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case WHITE:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case NO_COLOR:
set_gpio_output_data(RED_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_1_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_1_PIN, GPIO_DATA_LOW_LEVEL);
break;
default:
break;
}
}
/**
* led_2_set_color
* @brief 设置对应编号RGB灯颜色,七色可选,也可熄灭
* @param[in] color: 0,灭; 1,红; 2,黄 ;3,绿 ; 4,青; 5,蓝; 6,紫; 7,白
* @return void
*/
static void
led_2_set_color(uint8_t color)
{
switch (color)
{
case RED:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
break;
case GREEN:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
break;
case BLUE:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case YELLOW:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
break;
case PURPLE:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case CHING:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case WHITE:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_HIGH_LEVEL);
break;
case NO_COLOR:
set_gpio_output_data(RED_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(GREEN_2_PIN, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(BLUE_2_PIN, GPIO_DATA_LOW_LEVEL);
break;
default:
break;
}
}
头文件相关设置
#define RED_1_PIN GPIO_PC2
#define GREEN_1_PIN GPIO_PC3
#define BLUE_1_PIN GPIO_PC4
#define RED_2_PIN GPIO_PB5
#define GREEN_2_PIN GPIO_PD2
#define BLUE_2_PIN GPIO_PB4
enum rgb_color
{
NO_COLOR = 0,
RED,
YELLOW,
GREEN,
CHING,
BLUE,
PURPLE,
WHITE,
};
代码优化
当初自己能力不够,想改动来着,结果选错了方法,使用的##操作符,而如何使用又一知半解,最后没有成功。经过这一段时间不断提升,各种常用的数据结构已经达到信手拈来的程度了,对代码和注释也基本形成自己的风格了(注释由中文变成了英文,因为已经实在受不了辛辛苦苦写的注释都变成乱码的那种感觉了),之后要继续提升更重要的是认准方向,认知升级,优化和架构,通过自己的思考来一点点接触和了解操作系统。
优化后头文件相关设置
/* RGB pin define */
#define RED_1_PIN GPIO_PC2
#define GREEN_1_PIN GPIO_PC3
#define BLUE_1_PIN GPIO_PC4
#define RED_2_PIN GPIO_PB5
#define GREEN_2_PIN GPIO_PD2
#define BLUE_2_PIN GPIO_PB4
/* choose RGB */
typedef enum
{
RGB1 = 0,
RGB2,
}Rgb_Id;
/* set R G B pin */
typedef struct rgb_pin
{
Gpio_Pin red_pin;
Gpio_Pin green_pin;
Gpio_Pin blue_pin;
}Rgb_Pin;
static Rgb_Pin array_rgb_pin[2] =
{
{
RED_1_PIN, GREEN_1_PIN, BLUE_1_PIN},
{
RED_2_PIN, GREEN_2_PIN, BLUE_2_PIN},
};
/* set color */
typedef struct color_set
{
uint8_t color;
uint8_t set_color;
}COLOR_SET;
typedef enum rgb_color
{
NO_COLOR = 0,
RED,
YELLOW,
GREEN,
CHING,
BLUE,
PURPLE,
WHITE,
}RGB_COLOR;
可复用的模块函数
void rgb_set_color(Rgb_Id id, RGB_COLOR color)
{
switch (color)
{
case RED:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
break;
case GREEN:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
break;
case BLUE:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
break;
case YELLOW:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
break;
case PURPLE:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
break;
case CHING:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
break;
case WHITE:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_HIGH_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_HIGH_LEVEL);
break;
case NO_COLOR:
set_gpio_output_data(array_rgb_pin[id].red_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].green_pin, GPIO_DATA_LOW_LEVEL);
set_gpio_output_data(array_rgb_pin[id].blue_pin, GPIO_DATA_LOW_LEVEL);
break;
default:
break;
}
}