BlueNRG-1控制8颗WS2812B实现摇摇棒显示EEWORLD
[复制链接]
先把点阵显示实现了
手机拍下来的效果不好
实际色彩比这个酷多了
主要代码
- #include "display.h"
- #include "spi.h"
- #include "ws2812b.h"
- #include <stdio.h>
- #include <string.h>
- #define BACKGROUND_COLOR 0x000000
- #define FOREGROUND_COLOR 0x0F2F30
- #define BIT_TO_COLOR(byte,bit_index) (((byte & 1ul<<bit_index) == 1ul<<bit_index)?FOREGROUND_COLOR:BACKGROUND_COLOR)
- #define GET_BIT_OF_BYTE(byte,bit_index) (((byte & 1ul<<bit_index) == 1ul<<bit_index)?1:0)
- #define WS2812B_COUNT 8
- uint32_t color_buffer[WS2812B_COUNT];
- //RGB颜色缓冲转换为WS2812支持的SPI数据缓冲,一个RGB(24位)对应9个字节,WS2812B的一位需要3位,即110=1,100=0
- uint8_t ws2812b_buffer[WS2812B_COUNT * 9];
- //跑马灯那颗灯珠的位置
- uint16_t index = 0;
- //从上向下扫描
- uint8_t table_of_digits[40][8]=
- {
- {0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C},//0
- {0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C},//1
- {0x1C,0x22,0x02,0x02,0x1C,0x20,0x20,0x3E},//2
- {0x1C,0x22,0x02,0x1C,0x02,0x02,0x22,0x1C},//3
- {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4
- {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5
- {0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C},//6
- {0x3E,0x02,0x04,0x08,0x10,0x10,0x10,0x10},//7
- {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8
- {0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C},//9
- {0x00,0x1C,0x22,0x22,0x22,0x3E,0x22,0x22},//A
- {0x00,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C},//B
- {0x00,0x1C,0x22,0x20,0x20,0x20,0x22,0x1C},//C
- {0x00,0x3C,0x22,0x22,0x22,0x22,0x22,0x3C},//D
- {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x3E},//E
- {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x20},//F
- {0x00,0x1C,0x22,0x20,0x3E,0x22,0x22,0x1C},//G
- {0x00,0x22,0x22,0x22,0x3E,0x22,0x22,0x22},//H
- {0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C},//I
- {0x00,0x3E,0x08,0x08,0x08,0x08,0x28,0x18},//J
- {0x00,0x20,0x2C,0x30,0x20,0x30,0x2C,0x20},//K
- {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3E},//L
- {0x00,0x42,0x66,0x5A,0x42,0x42,0x42,0x42},//M
- {0x00,0x00,0x2C,0x32,0x22,0x22,0x22,0x22},//n
- {0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x1C},//O
- {0x00,0x3C,0x22,0x22,0x3C,0x20,0x20,0x20},//P
- {0x00,0x1C,0x22,0x22,0x22,0x2A,0x26,0x1F},//Q
- {0x00,0x38,0x24,0x24,0x38,0x30,0x28,0x24},//R
- {0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C},//S
- {0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08},//T
- {0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//U
- {0x00,0x22,0x22,0x22,0x14,0x14,0x08,0x00},//V
- {0x00,0x41,0x41,0x49,0x55,0x55,0x63,0x41},//W
- {0x00,0x00,0x42,0x24,0x18,0x18,0x24,0x42},//X
- {0x00,0x22,0x22,0x14,0x08,0x10,0x20,0x00},//Y
- {0x00,0x3E,0x02,0x04,0x08,0x10,0x20,0x3E},//Z
- };
- //获取一个字符的点阵,按行扫描,一搬从上至下
- uint8_t get_digit_row(char c,uint8_t row_index)
- {
- uint8_t char_index;
- char_index = (c>='A') ? c-'A'+10 :c-'0';
- return table_of_digits[char_index][row_index];
- }
- //获取一个字符的点阵,按列扫描,一搬从上至下读点,从左至右读列
- uint8_t get_digit_column(char c,uint8_t column_index)
- {
- uint8_t i;
- uint8_t char_index;
- char_index = (c>='A') ? c-'A'+10 :c-'0';
- uint8_t column_code = 0;
- //将行扫转成列扫
- for(i=0;i<8;i++)
- {
- column_code <<= 1;
- column_code |= GET_BIT_OF_BYTE(table_of_digits[char_index][i],7 - column_index);
- }
- return column_code;
- }
- void delay1(uint32_t d)
- {
- uint32_t i,j;
- for(i=0;i<d;i++)
- {
- for(j=0;j<100;j++);
- }
- }
- void ws2812b_string_display(char * str)
- {
- uint16_t i,j,k;
- uint16_t strcount;
- strcount = strlen(str);
- uint8_t y_code;
- uint32_t colors[8];
- int32_t light_count = 8;
- //字符数量
- for(i=0;i<strcount;i++)
- {
- //单字符列数据
- for(j=0;j<8;j++)
- {
- y_code = get_digit_column(str[i],j);
- //单列点数量
- for(k=0;k<8;k++)
- {
- colors[k] = BIT_TO_COLOR(y_code,7-k);
- }
- //填充完一列8个点后显示
- IntColorsToWS2812BBytes(ws2812b_buffer,colors,light_count);
- DMASpi_Sending((uint32_t)ws2812b_buffer,light_count * 9);
- delay1(10);
- }
- }
-
- }
复制代码
工程文件
|