找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2997|回复: 5
打印 上一主题 下一主题
收起左侧

关于51单片机用按键控制RGBLED灯七彩独立显示和七彩渐变应该怎样编程

[复制链接]
跳转到指定楼层
楼主
ID:878035 发表于 2021-3-9 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于51单片机用按键控制RGBLED灯七彩独立显示和七彩渐变应该怎样编程
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:871393 发表于 2021-3-9 16:58 | 只看该作者
太笼统了 先搞定颜色渐变(几毫秒间隔递增一次占空比)  再搞定按键控制亮灭  之后就水到渠成了
回复

使用道具 举报

板凳
ID:390416 发表于 2021-3-9 19:28 | 只看该作者
void RGB_Buffer_Allot()
{
        static u8 xdata Blue_PWM,Red_PWM,Green_PWM,CHANGE_Mode=0,Status_Mode_old;
        static u16 i=0,count=0;
        if(Status_Mode!=Status_Mode_old)                                        //如果模式改变,i=1;
        {
                Status_Mode_old=Status_Mode;                                        //刷新记忆
                i=0;
                CHANGE_Mode=0;
        }
        switch(Status_Mode)                                                                       
        {
                case POINT://数点模式,每次进来只修改1个字节,i++最多修改Pixel_Num次
                                i++;
                                i=i%Pixel_Num;                                                        //限制最大,防止数组指针溢出
                                if(i!=Rotary_Read_Data_Rotary)                        //如果不是数点位置
                                {
                                        DMX512_Write_Buffer[i]=0;                        //写0灯不亮
                                }
                                else                                                                        //否则,数点位置亮灯
                                {
                                        DMX512_Write_Buffer[Rotary_Read_Data_Rotary]=255;       
                                }
                                break;
                case RED://全红模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
                                i=i%Pixel_Num;
                                DMX512_Write_Buffer[i+1]=255;                        //红灯亮
                                DMX512_Write_Buffer[i+2]=0;
                                DMX512_Write_Buffer[i+3]=0;
                                i+=3;
                                break;
                case GREEN://全绿模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
                                i=i%Pixel_Num;
                                DMX512_Write_Buffer[i+1]=0;
                                DMX512_Write_Buffer[i+2]=255;                         //绿灯亮
                                DMX512_Write_Buffer[i+3]=0;
                                i+=3;
                                break;
                case BLUE://全蓝模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
                                i=i%Pixel_Num;
                                DMX512_Write_Buffer[i+1]=0;
                                DMX512_Write_Buffer[i+2]=0;
                                DMX512_Write_Buffer[i+3]=255;                        //蓝灯亮
                                i+=3;
                                break;
                case ALL://全亮模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
                                i=i%Pixel_Num;
                                DMX512_Write_Buffer[i+1]=255;                        //红灯亮
                                DMX512_Write_Buffer[i+2]=255;                         //绿灯亮
                                DMX512_Write_Buffer[i+3]=255;                        //蓝灯亮
                                i+=3;
                                break;
                case CHANGE://自动变色模式,i同上,每次进来只修改3个字节
                                if(count>200)                                                        //count是速度控制。
                                {
                                        count=0;
                                        switch(CHANGE_Mode)
                                        {
                                                case 0:        Red_PWM++;                                //红灯渐渐亮起
                                                                Green_PWM=0;
                                                                Blue_PWM=0;
                                                                if(Red_PWM==255)               
                                                                {
                                                                        CHANGE_Mode=1;                //红灯最亮了,进入1
                                                                }
                                                                break;
                                                case 1:        Red_PWM--;                                //红灯渐渐灭掉
                                                                Green_PWM=0;
                                                                Blue_PWM=0;
                                                                if(Red_PWM==0)
                                                                {
                                                                        CHANGE_Mode=2;                //红灯黑了,进入2       
                                                                }
                                                                break;
                                                case 2:        Red_PWM=0;                               
                                                                Green_PWM++;                        //绿灯渐渐亮起
                                                                Blue_PWM=0;
                                                                if(Green_PWM==255)
                                                                {
                                                                        CHANGE_Mode=3;                //绿灯最亮了,进入3
                                                                }
                                                                break;
                                                case 3:        Red_PWM=0;
                                                                Green_PWM--;                        //绿灯渐渐灭掉
                                                                Blue_PWM=0;
                                                                if(Green_PWM==0)
                                                                {
                                                                        CHANGE_Mode=4;                //绿灯黑了,进入4
                                                                }
                                                                break;       
                                                case 4:        Red_PWM=0;
                                                                Green_PWM=0;
                                                                Blue_PWM++;                                //蓝灯渐渐亮起
                                                                if(Blue_PWM==255)
                                                                {
                                                                        CHANGE_Mode=5;                //蓝灯最亮了,进入5
                                                                }
                                                                break;
                                                case 5:        Red_PWM=0;
                                                                Green_PWM=0;
                                                                Blue_PWM--;                                //蓝灯渐渐灭掉
                                                                if(Blue_PWM==0)
                                                                {
                                                                        CHANGE_Mode=0;                //蓝灯黑了,返回到0
                                                                }
                                                                break;                                                                       
                                        }
                                }
                                count++;                                                               
                                i=i%Pixel_Num;
                                DMX512_Write_Buffer[i+1]=Red_PWM;
                                DMX512_Write_Buffer[i+2]=Green_PWM;
                                DMX512_Write_Buffer[i+3]=Blue_PWM;
                                i+=3;
                                break;
        case Status_Mode_MAX://状态机的最大值,返回红灯全亮模式                                                               
                                Status_Mode=RED;
                                break;
        }
}
回复

使用道具 举报

地板
ID:878035 发表于 2021-3-9 20:05 | 只看该作者
77599585 发表于 2021-3-9 16:58
太笼统了 先搞定颜色渐变(几毫秒间隔递增一次占空比)  再搞定按键控制亮灭  之后就水到渠成了

谢谢
回复

使用道具 举报

5#
ID:878035 发表于 2021-3-9 20:05 | 只看该作者
人人学会单片机 发表于 2021-3-9 19:28
void RGB_Buffer_Allot()
{
        static u8 xdata Blue_PWM,Red_PWM,Green_PWM,CHANGE_Mode=0,Status_Mode_ol ...

谢谢大佬
回复

使用道具 举报

6#
ID:57657 发表于 2021-3-9 20:35 | 只看该作者
颜色渐变用 AlphaBlend (透明度混合)算法。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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