RGB(三⾊)灯配置常⽤颜⾊数据,⽤法讲解,基于C语⾔的
程序讲解,七彩渐变程序讲解
本⼈新⼿,此讲解适合新⼿朋友,⼤神不喜勿喷。通过实际测试过的,请放⼼消化。
1:灯的计数配置如下:
2:七⾊在模拟PWM程序中的配置,原理:在⼀个周期中 灯亮的时长 / 周期时长 = 占空⽐ ,此程序是通过占空⽐来调节各个灯的亮度,上表的配置参数为三种灯的⽐例参数,按照此参数配置为最亮。所以在配置橙的灯时,红⾊灯整个周期都亮,绿⾊灯只亮周期的⼀半时长。
七彩渐变是每⼀种灯由暗变亮,在由亮变暗,然后在切换到另⼀种灯光的最暗状态继续循环。
代码如下:
/******************************************************************
************************RGB灯使⽤**********************************
******************************************************************/
bool rgb_over = true; //翻转标志
bool is_qcding = false; //控制灯是否开启
uint8_t rgb_colour = 0; //⼋种灯⾊0-7分别对应:⽩,红,绿,蓝,橙,黄,青,紫
uint8_t duty_num_b = 10; //灯光亮度(0-255)
/************脚位说明*****************
LEDR_GPIO 红⾊灯控制脚位
LEDG_GPIO 绿⾊灯控制脚位
LEDB_GPIO 蓝⾊灯控制脚位
*************************************/
void _close_all_led(){ //关闭所有灯光
user_gpio_set_value(LEDR_GPIO, LEDRGB_CLOSE);
user_gpio_set_value(LEDG_GPIO, LEDRGB_CLOSE);
user_gpio_set_value(LEDB_GPIO, LEDRGB_CLOSE);
}
//此函数在定时器中断中使⽤,每隔100us进⼊⼀次
void _RGB_timer_shade(){ //七彩渐变函数
if(rgb_over){ //暗->亮
duty_num_b += 4;
if(duty_num_b > 251){
rgb_over = false;
duty_num_b = 255;
}
}else{ //亮->暗
duty_num_b -= 4;
if(duty_num_b < 10){
rgb_over = true;
duty_num_b = 10;
duty_num_b = 10;
rgb_colour++;
if(rgb_colour > 7){
rgb_colour = 1;
}
}
}
}
//此函数可在定时器中断中使⽤,也可在循环函数中使⽤,每隔25us进⼊⼀次void _RGB_timer_handle( ){ //单独开启某种灯⾊的灯光,灯⾊由rgb_colour控制 static uint8_t count = 0; //计数范围0-255,每隔25us此变量加1
uint8_t dutynum = 255; //临时亮度值
dutynum = duty_num_b; //亮度赋值
if(is_qcding){
渐变颜代码大全if(rgb_colour < 8){ //rgb_colour灯⾊
//橙⾊灯和紫⾊灯由于单个灯的配置⽐例不同,所以单独配置
if(rgb_colour == 4){ //橙
if(count <= dutynum){
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN); //红的灯配置亮
}else{
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);//红的灯配置灭
}
if(count <= (dutynum/2)){ //绿的灯的亮度为红⾊灯的⼀半
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
}else{
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
}
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
}else if(rgb_colour == 7){ //紫
if(count <= (dutynum/2)){ //红⾊灯的亮度为蓝⾊灯的⼀半
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
}else{
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
}
if(count <= dutynum){
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
}else{
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
}
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
}else{
if(count <= dutynum){
switch(rgb_colour) {
case 0:{ //⽩
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
break;
}
case 1:{ //红
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
break;
}
case 2:{ //绿
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
break;
}
case 3:{ //蓝
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
break;
}
case 5:{ //黄
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
break;
}
case 6:{ //青
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
break;
}
}
}else{
_close_all_led(); //关闭所有灯光
}
}
count++;
if(count >= 255){ //⼀个周期结束,配置为0进⾏下⼀个周期
count = 0;
}
}else{
count = 0;
rgb_colour = 0;
}
}else{
_close_all_led(); //关闭所有灯光
}
}
看完有帮助的话记得点个赞哈,制作不易啊
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论