找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教一个关于单片机驱动RGB彩灯的问题,目前已经成功点亮8颗

[复制链接]
跳转到指定楼层
楼主
本人使用STC15单片机驱动RGB彩灯 时钟为30M 通过IO口反转来产生彩灯的数据时序(0码和1码)根据官方给出资料已经成功亮灯:


想跟老铁请教几个问题:
现在的这种全彩灯跟普通LED不太一样比如要实现最简单跑马灯  花样流水灯好像比一般的LED要复杂一些(只是我个人觉得
可能是我还不太了解)
目前实现单个颜色点亮和切换颜色已经实现  数据手册中写道一颗灯就需要24Bit 即3个字节的数据并且需要接收完毕24Bit才能点亮(我的这是GRB顺序)
那么我的是八个灯珠  就需要循环发送24个字节即可点亮8个灯珠 原理是大致弄明白了一些,
《比如实现流水灯  这数据应该怎么发???》这几天一直在研究这问题,到网站查资料结果都是STM32 的较多没找到比较相近的参考!!!
所以向论坛的老铁求助以下了!

以下为部分单片机驱动代码:
此代码只是在本人单片机里调试结果可以驱动  如果别的单片机可能需要对_nop_(); 做适当调整
//========================================================================
// 描述: 1码,高电平850ns 低电平400ns 误差正负150ns.   
// 参数: none.
// 返回: none.
//========================================================================
void WS2812_Write_1()
{
        WS2812_Data_GPIO = 1;
        //经过逻辑分析仪调试的的延时
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        WS2812_Data_GPIO = 0;
}

//========================================================================
// 描述: 0码,高电平400ns 低电平850ns 误差正负150ns.
// 参数: none.
// 返回: none.
//========================================================================
void WS2812_Write_0()
{
        WS2812_Data_GPIO = 1;
        //经过逻辑分析仪调试的的延时
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        WS2812_Data_GPIO = 0;
}

//========================================================================
// 描述: 发送24位数据.
// 参数: 绿色8位,红色8位,蓝色8位.
// 返回: none.
//========================================================================
void rgb_write(uint8 G8, uint8 R8, uint8 B8)
{
        unsigned int n = 0;
        //发送G8位
        EA = 0;
        for (n = 0; n < 8; n++)
        {

                if ((G8 & 0x80) == 0x80)
                {
                        rgb_set_up();
                }
                else
                {
                        rgb_set_down();
                }
                G8 <<= 1;
        }
        //发送R8位
        for (n = 0; n < 8; n++)
        {

                if ((R8 & 0x80) == 0x80)
                {
                        rgb_set_up();
                }
                else
                {
                        rgb_set_down();
                }
                R8 <<= 1;

        }
        //发送B8位
        for (n = 0; n < 8; n++)
        {

                if ((B8 & 0x80) == 0x80)
                {
                        rgb_set_up();
                }
                else
                {
                        rgb_set_down();
                }
                B8 <<= 1;
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:267932 发表于 2021-4-21 17:29 | 只看该作者
建议SPI  加DMA的方法控制。
回复

使用道具 举报

板凳
ID:232366 发表于 2021-4-21 17:33 | 只看该作者
zhai1995 发表于 2021-4-21 17:29
建议SPI  加DMA的方法控制。

目前C知识比较淡薄   还不会用SPI  DMA    尴尬想着先用些笨办法先学习以下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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