http://bbs.elecfans.com/jishu_508459_1_1.html
WS2811.h
#ifndef __WS2811_H
#define __WS2811_H
#include "sys.h"#define White       0xFFFFFF  // 白色
#define Black       0x000000  // 黑色
#define Red         0x00ff00  // 红色
#define Green       0xff0000  // 绿色
#define Blue        0x0000ff  // 蓝色#define nWs 16                // 有多少颗WS2811级联extern unsigned long WsDat[];extern void WS_Init(void);
extern void WS_SetAll(void);
extern u32 ColorToColor(unsigned long color0, unsigned long color1);#endif
WS2811.c
/****************************************************************************************
* WS2811 彩灯驱动函数
*
* 调用方法:
*        修改宏定义: #define nWs 1        // 有多少颗WS2811级联
*        WS_Init();        // IO初始化
*        WsDat[0] = 0x808080;//显存赋值
*        WS_SetAll();  // 发送数据
*        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
*
* 作者:星希望(已校验)
* 日期:2015年6月24日
****************************************************************************************/
#include "sys.h"
#include <stm32f10x.h>
#include "WS2811.h"
#include "delay.h"/* 显存 */
unsigned long WsDat[nWs];/**************************************************************************************
* IO初始化(移植时请修改)
**************************************************************************************/
void WS_Init()
{GPIO_InitTypeDef  GPIO_InitStructure;        //端口时钟,使能RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         // 端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PINGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根据设定参数初始化
}/**************************
* 内部延时
***************************/
void delay2us()
{unsigned char i;for(i=0; i<12; i++);
}
void delay05us()
{unsigned char i;for(i=0; i<1; i++);
}/***************************
* 发送一比特
****************************/
void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0
void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送1
void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }/**************************************************************************************
* 发送一字节
**************************************************************************************/
void WS_Set1(unsigned long dat)
{unsigned char i;for(i=0; i<24; i++){if(0x800000 == (dat & 0x800000) )        TX1();else                                                                TX0();dat<<=1;                                                        //左移一位}
}/**************************************************************************************
* 发送所有字节
**************************************************************************************/
void WS_SetAll()
{unsigned char j;for(j=0; j<nWs; j++){WS_Set1(WsDat[0]);  // j / 0}WS_Reset();
}/********************************************
* 求绝对值
********************************************/
unsigned char abs0(int num)
{if(num>0) return num;num = -num;return (unsigned char) num;
}/***********************************************************************************
* 颜色渐变算法
* 误差 <= 2
************************************************************************************/
u32 ColorToColor(unsigned long color0, unsigned long color1)
{unsigned char Red0, Green0, Blue0;  // 起始三原色unsigned char Red1, Green1, Blue1;  // 结果三原色int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)unsigned char NStep;                                                         // 需要几步float                  RedStep, GreenStep, BlueStep;                // 各色步进值unsigned long color;                                                        // 结果色unsigned char i;// 绿 红 蓝 三原色分解Red0   = color0>>8;Green0 = color0>>16;Blue0  = color0;Red1   = color1>>8;Green1 = color1>>16;Blue1  = color1;// 计算需要多少步(取差值的最大值)RedMinus   = Red1 - Red0; GreenMinus = Green1 - Green0; BlueMinus  = Blue1 - Blue0;NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);// 计算出各色步进值RedStep   = (float)RedMinus   / NStep;GreenStep = (float)GreenMinus / NStep;BlueStep  = (float)BlueMinus  / NStep;// 渐变开始for(i=0; i<NStep; i++){Red1   = Red0   + (int)(RedStep   * i);Green1 = Green0 + (int)(GreenStep * i);Blue1  = Blue0  + (int)(BlueStep  * i);color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  绿红蓝WsDat[0] = color;WS_SetAll();                                                        // 输出delay_ms(1);                                                // 渐变速度}// 渐变结束return color;
}

WS2811彩带驱动库函数相关推荐

  1. 51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动)

    CS1237芯片是一枚国产24位A/D转换芯片,输出速率可选:10Hz.40Hz.640Hz.1.28kHz.内置时钟电路,不需外部晶振.带可编程PGA,PGA放大倍数可选:1.2.64.128.2 ...

  2. 51 单片机实战教程(14 外围芯片驱动程序之LTC1658芯片驱动)

    LTC1658是一款14bit轨到轨DAC芯片.可选用3V或5V供电,采用3线串口通信(兼容SPI与MICROWIRE),其应用场景为数字校准.工业控制.自动测试设备等.它采用SOP8封装,Pin脚定 ...

  3. 自定义数码管IP核,并让NiosⅡ SBT for Eclipse自动抓取驱动文件

    1.前言 在Platform Designer(原Qsys)中创建自定义六位七段独立数码管IP核并让NiosⅡ SBT for Eclipse自动抓取驱动文件. 开发环境:Quartus Prime ...

  4. 4412开发板学习之Linux驱动开发(五):4412MMU及GPIO操作(点灯)

    4412MMU及GPIO操作(点灯) 物理地址与虚拟地址 与传统MCU的对比 4412中的物理地址 MMU内存管理单元 存储器分类 4412中的存储器映射 物理地址和虚拟地址 其他的地址概念 GPIO ...

  5. SylixOS下 i.MX RT1050的GPIO驱动实例

    实例源码 下面是 i.MX RT1050 的GPIO驱动实现源码: /***************************************************************** ...

  6. 0.96寸_OLED_屏幕_SSD1306_IIC通信_入门教程_指令详解_驱动介绍_笔记分享_初学者易懂

    目录 一.简介 1:总结 2:屏幕介绍 二.基本使用流程 1_介绍: 2_流程:(省略了应答) 三.指令集 1.基础指令 1:设置对比度(亮度)(81H + A[7:0]) 2:设置全屏全亮(A4H. ...

  7. 浮点运算和代码优化, 音频常识, 并行计算

    http://antkillerfarm.github.io/ 浮点运算和代码优化 1.浮点运算问题 浮点运算在工业中应用非常广泛,但嵌入式CPU通常没有对浮点运算提供直接的硬件支持.而采用标准库提供 ...

  8. 2021年2月28日【Jiawei_Z】Ethercat的整个实现过程(举例:Lan9252)

    一.基本知识点---数据帧格式 从图 中可以看出,一个 EtherCAT 帧中包含若干个 EtherCAT 子报文. 每个子报文由子报文头.数据区和工作计数器 WKC 组成. EtherCAT 进行网 ...

  9. 如何用TI Unifalsh烧录程序到CC3200 Launchpad

    板子样式 SDK软件开发套件的下载 下载网址:CC3200 SDK工具包下载 在TI注册了用户之后进行下载,前两个都要下载.运行installer文件,把SDK软件开发套件安装到系统默认路径,或者自己 ...

  10. Linux学习~树莓派gpio控制

    WiringPi 是应用于树莓派平台的 GPIO 控制库函数,WiringPi 遵守 GUN Lv3.wiringPi 使用 C 或者 C++ 开发并且可以被其他语言包转,例如 Python.ruby ...

最新文章

  1. 两次杀人,自动驾驶技术之恶
  2. PostgreSQL学习手册(常用数据类型)
  3. 中object转为list集合_java基础集合小结
  4. Linux与Windows比较出的20个优势
  5. 经典插花的教训 PKU 1157
  6. C++中的namespace ----转载
  7. JAVA基础之自定义容器实现
  8. mysql的引双向链表_一分钟掌握MySQL的InnoDB引擎B+树索引
  9. javascript 西瓜一期 14 回顾 字符与编码 进制转换 数据保存
  10. css案例学习之并集选择器
  11. 【Codeforces 1051D】Bicolorings
  12. Python 自动识别图片文字—保姆级OCR实战教程
  13. MATLAB中求某个函数的积分并绘图
  14. 优维低代码:Pipes 管道
  15. 基于ESP32的蓝牙刷屏器自动点击器的制作
  16. 3.5.4 Exposure Fusion(曝光融合)—Mertens TMO
  17. I2C的ACK和NACK
  18. 深入浅出LDA(1)
  19. 中国碱性电解二氧化锰市场行业动态与投资规划分析报告2022-2028年
  20. 全球十大资质正规现货黄金交易平台排名榜单(最新版汇总)

热门文章

  1. winserver2012安装mysql8.0.22需要安装vc++2015时报错0x80240017未指定错误
  2. 百兆网络变压器:H81601S产品规格及建议配置的芯片型号
  3. android Google Advertising ID 如何重置
  4. miui9android8.0xp框架,MIUI9MIUI10官方8.0/8.1刷入xp框架
  5. qu32调音台说明书_Qu-32 数字调音台
  6. Sap Hana触发器
  7. 搭建steam游戏服务器
  8. 微信公众平台二次开发技术文档
  9. 企业微信登陆服务器设置,企业微信怎么登入
  10. python井字棋_用python井字棋