spi 推跑马灯

spi 推跑马灯,来电时跑马灯效果 归零码

1 主控spi单次最少是发一个U8 也就是8个bit位,所以软件充分利用 这个u8的每一个bit位组合成一个 灯需要的0码 或者1码

2 遇到的问题,主频改变的时候数据就不对了,发送spi数据前需要判断当前主频来设置spi的波特率来保持波形

3 开机第一次发送波形的时候有概率的波形中间会被中断一次-----丢弃第一次发送的波形,第一次发送波形的时候,led使能脚不要使能

代码

void ws2812_power_open(void)

{

printf("%s\n",__func__);

GPIOFSET = BIT(4);

}

void ws2812_power_close(void)

{

printf("%s\n",__func__);

GPIOFCLR = BIT(4);

}

void ws2812_set_led_buf_offset(rgb_t* buf_p) //����buf��ʾ

{

rgb_t offset_buf[WS2812_LED_NUM];

u8 k=0,i=0;

static u8 offset=1;

k = offset++;

if(offset>9)

offset=1;

while(i<WS2812_LED_NUM)

{

offset_buf[k] = *(buf_p+i);

if(++k>=WS2812_LED_NUM)

k = 0;

i++;

}

ws2812_send_data((u8*)offset_buf,WS2812_LED_NUM*3);

}

void ws2812_set_blue_led_on(void)

{

u8 rgb_data[3*10]={0x55,0x00,0x55,

0x55,0x00,0x55,

0x55,0x00,0x55,

0x55,0x00,0x55,

0x55,0x00,0x55,

0x55,0x00,0x55,//

0x55,0x00,0x55,

0x55,0x00,0x55,

0x55,0x00,0x55,

0x55,0x00,0x55,

};

ws2812_set_led_buf((rgb_t *)rgb_data);

}

void ws2812_set_red_led_on(void)

{

u8 rgb_data[3*10]={0x00,0xAA,0x00,

0x00,0xAA,0x00,

0x00,0xAA,0x00,

0x00,0xAA,0x00,

0x00,0xAA,0x00,

0x00,0xAA,0x00,//

0x00,0xAA,0x00,

0x00,0xAA,0x00,

0x00,0xAA,0x00,

0x00,0xAA,0x00,

};

ws2812_set_led_buf((rgb_t *)rgb_data);

}

void ws2812_set_red_blue_led_on(void)

{

u8 rgb_data[3*10]={0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,//

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

0x00,0xAA,0xAA,

};

ws2812_power_open();

ws2812_set_led_buf((rgb_t *)rgb_data);

}

WS2812_DRIVER_SECTION

void ws2812_set_blue_breath(void)

{

u8 rgb_data[3*10]={0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,//

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

};

u8 step=5;

u8 i;

bool dir_up = sys_cb.dir_up;

u8 curValue=sys_cb.curValue;

static u8 offCnt=0;

if(dir_up)

{

if(curValue+step<100+10)//100

curValue+=step;

else{

if(offCnt++==4)

{

dir_up=false;

offCnt=0;

}

}

}

else {

if(curValue>10+10) //step

curValue-=step;

else{

if(offCnt++==4)

{

dir_up=true;

offCnt=0;

}

}

}

for(i=0;i<3*WS2812_LED_NUM;i++)

{

//j=i/3;

if((i)%3==2)

{

rgb_data[i]=curValue;

}

//20230818

else if((i)%3==0)//g

{

rgb_data[i]=curValue;//5+curValue/5;

}

//

}

sys_cb.dir_up=dir_up;

sys_cb.curValue=curValue;

ws2812_set_led_buf((rgb_t *)rgb_data);

}

void ws2812_set_red_breath(void)

{

u8 rgb_data[3*10]={0x00,0x00,0x00,// g r b

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,//

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

0x00,0x00,0x00,

};

u8 step=2;//5

u8 i,j;

bool dir_up = sys_cb.dir_up;

u8 curValue=sys_cb.curValue;

static u8 offCnt=0;

if(dir_up)

{

if(curValue+step<50)//100

curValue+=step;

else{

if(offCnt++==4)

{

dir_up=false;

offCnt=0;

}

}

}

else {

if(curValue>step)

curValue-=step;

else{

if(offCnt++==4)

{

dir_up=true;

offCnt=0;

}

}

}

for(i=1;i<3*WS2812_LED_NUM;i++)

{

j=i/3;

if((i-j*3)%3==1)

{

rgb_data[i]=curValue;

}

}

sys_cb.dir_up=dir_up;

sys_cb.curValue=curValue;

//printf("ws2812_set_red_breath:%d\n",sys_cb.curValue);

ws2812_set_led_buf((rgb_t *)rgb_data);

}

void ws2812_set_call_led(void)

{

printf("ws2812_set_call_led:%d\n",sys_cb.ledStatus);

if(sys_cb.ledStatus!=LOW_BAT_FLASH)

{

sys_cb.ledStatus=THIRD_CALL_FLASH;

ws2812_power_open();

}

}

void ws2812_set_low_led(void)

{

//printf("ws2812_set_low_led:%d\n",sys_cb.ledStatus);

if(sys_cb.ledStatus==ALL_LED_OFF)

sys_cb.ledStatus=LOW_BAT_FLASH;

}

void ws2812_set_off_led(void)

{

printf("ws2812_set_off_led:%d\n",sys_cb.ledStatus);

//if(sys_cb.ledStatus!=LOW_BAT_FLASH)

{

sys_cb.ledStatus=ALL_LED_OFF;

ws2812_led_clear();

ws2812_power_close();

}

}

void ws2812_set_blue_breath_start(void)

{

printf("ws2812_set_blue_breath_start:%d\n",sys_cb.ledStatus);

sys_cb.ledStatus=BLUE_BREATH;

sys_cb.curValue=0x8;

sys_cb.dir_up=true;

ws2812_power_open();

}

void ws2812_set_blue_breath_stop(void)

{

printf("ws2812_set_off_led:%d\n",sys_cb.ledStatus);

sys_cb.ledStatus=ALL_LED_OFF;

ws2812_led_clear();

ws2812_power_close();

}

void ws2812_set_red_breath_start(void)

{

printf("ws2812_set_off_led:%d\n",sys_cb.ledStatus);

sys_cb.ledStatus=RED_BREATH;

sys_cb.curValue=0x0;

sys_cb.dir_up=true;

ws2812_power_open();

}

void ws2812_set_red_breath_stop(void)

{

printf("ws2812_set_off_led:%d\n",sys_cb.ledStatus);

sys_cb.ledStatus=ALL_LED_OFF;

ws2812_led_clear();

ws2812_power_close();

}

void ws2812_set_horce_race_ring(void)

{

sys_cb.ledStatus=RING_HORCE_RACE_LED;

ws2812_power_open();

}

void ws2812_horce_race_ring_run(void)

{

u8 rgb_data[3*10]={0x00,0xAA,0xAA,

0x00,0x88,0x88,

0x00,0x66,0x66,

0xAA,0x00,0x00,

0x88,0x00,0x00,

0x66,0x00,0x00,//

0x55,0x00,0x00,

0xAA,0x00,0xAA,

0x88,0x00,0x88,

0x66,0x00,0x66,

};

ws2812_set_led_buf_offset((rgb_t *)rgb_data);

}

void ws2812_set_horce_race_ring_stop(void)

{

sys_cb.ledStatus=ALL_LED_OFF;

ws2812_led_clear();

ws2812_power_close();

}

void ws2812_set_low_bat_led_on(void)

{

printf("%s,%d\n",__func__,tick_get());

ws2812_power_open();

ws2812_set_red_led_on();

}

void ws2812_set_low_bat_led_off(void)

{

printf("%s,%d\n",__func__,tick_get());

ws2812_led_clear();

ws2812_power_close();

}

void ws2812_set_poweroff_led_on(void)

{

sys_cb.ledStatus=0;

ws2812_power_open();

ws2812_set_red_led_on();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度刨析程序中的指针

前面我们已经学习过了指针的一下性质&#xff1a; 指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识的一块内存空间指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff09;指针是有类型&#xff0c;指针的类型决定了指针的加减整数的步长&…

SQL 中的 EXISTS 子句:探究其用途与应用

目录 EXISTS 子句简介语法 EXISTS 与 NOT EXISTSEXISTS 子句的工作原理实际应用场景场景一&#xff1a;筛选存在关联数据的记录场景二&#xff1a;优化查询性能 EXISTS 与其他 SQL 结构的比较EXISTS vs. JOINEXISTS vs. IN 多重 EXISTS 条件在 UPDATE 语句中使用 EXISTS常见问题…

Flutter基本概念常用命名

Flutter基本概念 一切皆是Widgets多组件容器&#xff08;Row、Column、Stack、Wrap&#xff09;单组件容器&#xff08;Container、Padding、Center、Align&#xff09;Flutter组件的规律 Widgets状态 stateful&#xff08;有状态&#xff09; 当创建一个能随时间动态改变的w…

uniapp动态自定义导航栏,动态修改后无法再次点击的解决方案

如果你的写法是这样&#xff1a; 这种方式在动态修改后 &#xff0c;再次点击按钮&#xff0c;按钮事件无法正常回调 // #ifdef APP-PLUSvar pages getCurrentPages();var page pages[pages.length - 1];var currentWebview page.$getAppWebview();var tn currentWebview…

Maven学习—如何在IDEA中配置Maven?又如何创建Maven工程?(详细攻略)

目录 前言 1.在IDEA中配置Maven 2.创建Maven项目 &#xff08;1&#xff09;Maven&#xff1a;创建普通Maven工程 &#xff08;2&#xff09;Maven Archetype&#xff1a;创建Maven模板工程 前言 本篇博客将详细的介绍在IDEA中如何配置Maven&#xff0c;以及如何创建一个Ma…

分布式 I/O 系统 BL200 Modbus TCP 耦合器

BL200 耦合器是一个数据采集和控制系统&#xff0c;基于强大的 32 位微处理器设计&#xff0c;采用 Linux 操作系统&#xff0c;支持 Modbus 协议&#xff0c;可以快速接入现场 PLC、SCADA 以及 ERP 系统&#xff0c; 内置逻辑控制、边缘计算应用&#xff0c;适用于 IIoT 和工业…

Android中的图像效果实现:探索图像处理的艺术

在Android开发领域&#xff0c;图像处理技术是提升应用吸引力和用户体验的关键组成部分。从简单的颜色调整到复杂的滤镜效果&#xff0c;开发者可以通过各种方法在Android应用中创造令人印象深刻的视觉效果。本文将从多个角度探讨Android中图像效果的实现&#xff0c;包括基础图…

园区道路车辆智能管控视频解决方案,打造安全畅通的园区交通环境

一、背景需求分析 随着企业园区的快速发展和扩张&#xff0c;道路车辆管理成为了保障园区秩序、提升运营效率及确保员工安全的重要任务。针对这一需求&#xff0c;旭帆科技TSINGSEE青犀提出了一种企业园区道路车辆管控的解决方案&#xff0c;通过整合视频监控、智能识别等技术…

opencv—常用函数学习_“干货“_9

目录 二五、霍夫变换 检测图像中的直线 (HoughLines) 检测图像中的直线段 (HoughLinesP) 检测图像中的圆 (HoughCircles) 解释 二六、傅里叶变化 获取最优的DFT大小 (getOptimalDFTSize) 执行离散傅里叶变换 (dft) 和 逆变换 (idft) 解释 实际应用 图像滤波示例 http…

Qt6 OpenCV4视频监控系统项目源码解析——附源码及编译运行步骤

很多刚毕业&#xff0c;或者想着转行到C Qt方向的小伙伴&#xff0c;平时可能拿不出比较像样的项目。这里你可要好好收藏啦。自己拿回去好好改改&#xff0c;就可以成为自己的项目经历了。祝各位找工作顺利呀。 好了。废话不多说。 这个项目架构采用的是MVC架构&#xff0c;结…

比较RMI、HTTP+JSON/XML、gRPC

RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;、HTTPJSON/XML、gRPC是三种不同的技术或协议&#xff0c;它们各自在远程通信、数据传输和服务交互方面有不同的特点和应用场景。以下是对这三种技术的详细比较&#xff1a; 1. RMI&#xff08;R…

Porfinet从转DeviceNet从总线协议转换网关

产品功能 1. 远创智控YC-DNT-PN型是Porfinet从转Devicenet从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Devicenet网络中&#xff0c;‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口&#xff0c;‌分别用于连接Po…

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现&#xff1a;实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…

【verilog语法】$clog2(IEEE Std 1364-2005)

一、前言 在进行Verilog设计时&#xff0c;有时需要根据内存大小来计算地址的位宽&#xff0c;或者根据变量的值来确定变量的位宽&#xff0c;这时可以自己编写相关的可综合函数&#xff0c;或者verilog-2005起开始支持的$clog2系统函数。 二、自己编写的function function i…

代码规范性

代码规范性 命名规范代码格式注释代码结构异常处理代码复用代码审查空格的用法代码示例 命名规范 ​ 1、变量和函数名&#xff1a;使用驼峰命名法&#xff08;camelCase&#xff09;&#xff0c;如userName、getUserInfo。 ​ 2、常量&#xff1a;使用全大写字母&#xff0c;…

VSCode安装以及安装你需要的插件的保姆级教程

文章目录 前言vscode的简介安装vscode下载安装包 安装中文插件安装C/C插件总结 前言 Visual Studio Code&#xff08;VSCode&#xff09;是一款免费、开源且强大的代码编辑器&#xff0c;它具有易于使用的界面和丰富的功能&#xff0c;包括高级代码编辑、导航、调试等功能。VS…

linux高级编程(广播与组播)

广播与组播&#xff1a; 广播&#xff1a; 局域网&#xff0c;一个人发所有人都能收&#xff08;服务器找客户端&#xff09;&#xff0c;&#xff08;发给路由器的广播地址后后路由器自动给所有人发&#xff0c;可用于服务器找客户端&#xff09; 只能udp来做 setsocketopt…

远程访问及控制(ssh)

目录 一、OpenSSH服务器 1.1 SSH&#xff08;Secure Shell&#xff09;协议 1.2 OpenSSH 2.1 SSH原理 2.1 1 公钥传输原理 2.1.2 加密原理 2.1.3 SSHD服务的两种验证方式 二、SSH命令中的基本操作 2.1 构建密钥对验证的SSH 2.1.1 公钥和密钥的关系 2.1.2 构建密钥对…

找不到d3dx9_43.dll怎么办,总结5种解决d3dx9_43.dll丢失的方法

很多人经常使用电脑的时候可能遇到过电脑缺失d3dx9_43.dll的情况。这种情况通常是由于不当操作导致病毒感染或软件误删等原因引起的。今天&#xff0c;我将为大家详细讲解电脑缺失d3dx9_43.dll的原因以及几种解决方法。 一、了解d3dx9_43.dll是什么及作用 d3dx9_43.dll 是一个…

腾讯开源 tlbs-map 地图组件库

腾讯宣布开源 tlbs-map&#xff0c;一个基于腾讯位置服务地图 API 开发的 web 端地图组件库&#xff0c;支持在网页绘制地图并在地图上绘制点、线、面、热力图等效果&#xff0c;支持 Vue2、Vue3、React 等业界主流技术栈&#xff0c;旨在帮助开发者低成本开发地图业务 Javascr…