找回密码
 立即注册
查看: 1839|回复: 23

8H系列 直接驱动 WS2812

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-8-29 14:52:35 | 显示全部楼层 |阅读模式
我测量了下24MHz下I/O的翻转速度能到3MHz,所以直接I/O驱动是足够的。废话不多说直接上代码

  1. #include <AI8H.H>
  2. #include <intrins.h>
  3. typedef unsigned char uint8_t;
  4. #define ZERO_CODE() P21=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P21=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  5. #define ONE_CODE() P21=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();P21=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  6. #define LED_NUMBER 2
  7. #define BRIGHTNESS 2
  8. #define MAX_BRIGHTNESS 255
  9. void Delay55us(void)        //@24.000MHz
  10. {
  11.     unsigned char data i, j;
  12.     _nop_();
  13.     i = 2;
  14.     j = 180;
  15.     do
  16.     {
  17.         while (--j);
  18.     } while (--i);
  19. }
  20. void reset_all()
  21. {
  22.     uint8_t index;
  23.     for (index = 0; index < 24 * LED_NUMBER; index++)
  24.     {
  25.         ZERO_CODE();
  26.     }
  27.     Delay55us();
  28. }
  29. void Delay1000ms(void)        //@24.000MHz
  30. {
  31.     unsigned char data i, j, k;
  32.     _nop_();
  33.     _nop_();
  34.     i = 122;
  35.     j = 193;
  36.     k = 128;
  37.     do
  38.     {
  39.         do
  40.         {
  41.             while (--k);
  42.         } while (--j);
  43.     } while (--i);
  44. }
  45. void set_led_color(uint8_t led_index, uint8_t green, uint8_t red, uint8_t blue)
  46. {
  47.     uint8_t i;
  48.     uint8_t mask, number;
  49.     green = (green * BRIGHTNESS) / MAX_BRIGHTNESS;
  50.     red = (red * BRIGHTNESS) / MAX_BRIGHTNESS;
  51.     blue = (blue * BRIGHTNESS) / MAX_BRIGHTNESS;
  52.     led_states[led_index][0] = green;
  53.     led_states[led_index][1] = red;
  54.     led_states[led_index][2] = blue;
  55.     for (number = 0; number < LED_NUMBER; number++)
  56.     {
  57.         for (i = 0; i < 8; i++)
  58.         {
  59.             mask = 0x80 >> i;
  60.             if (led_states[number][0] & mask)
  61.             {
  62.                 ONE_CODE();
  63.             }
  64.             else
  65.             {
  66.                 ZERO_CODE();
  67.             }
  68.         }
  69.         for (i = 0; i < 8; i++)
  70.         {
  71.             mask = 0x80 >> i;
  72.             if (led_states[number][1] & mask)
  73.             {
  74.                 ONE_CODE();
  75.             }
  76.             else
  77.             {
  78.                 ZERO_CODE();
  79.             }
  80.         }
  81.         for (i = 0; i < 8; i++)
  82.         {
  83.             mask = 0x80 >> i;
  84.             if (led_states[number][2] & mask)
  85.             {
  86.                 ONE_CODE();
  87.             }
  88.             else
  89.             {
  90.                 ZERO_CODE();
  91.             }
  92.         }
  93.     }
  94.     Delay55us();
  95. }
  96. void main()
  97. {
  98.     P2M0 |= 0x02;
  99.     P2M1 &= ~0x02;
  100.     set_led_color(0, 255, 0, 0);
  101.     set_led_color(1, 0, 255, 0);
  102.     Delay1000ms();
  103.     Delay1000ms();
  104.     Delay1000ms();
  105.     Delay1000ms();
  106.     Delay1000ms();
  107.     reset_all();
  108.     while (1)
  109.     {
  110.     }
  111. }
复制代码


自信就会温和,温和就会坚定!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-8-29 15:35:27 | 显示全部楼层
我修改了一下代码,打包了工程
自信就会温和,温和就会坚定!
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-8-29 15:35:43 | 显示全部楼层
工程如下:

ws2812.zip

56.11 KB, 下载次数: 88

自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:101
  • 最近打卡:2025-06-18 14:57:36

734

主题

1万

回帖

1万

积分

管理员

积分
16728
发表于 2024-8-29 15:53:33 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:471
  • 最近打卡:2025-06-19 00:01:43
已绑定手机

79

主题

5148

回帖

9164

积分

超级版主

DebugLab

积分
9164
发表于 2024-8-29 15:55:40 | 显示全部楼层
void WS2812_Reset(void)
{
        WS2812=0;
        Delay_100us();
}

void WS2812_Write_Byte(unsigned char data temp)        //AI8@24MHz 0:340ns+1400ns 1:1000ns+1400ns
{
        unsigned char data i=8;
        while(i)
        {
                temp<<=1;
                WS2812=1;
                NOP(4);
                if(CY)
                {
                        NOP(18);
                }
                WS2812=0;
                NOP(27);
                i--;
        }
}

void WS2812_Write(void)
{
        unsigned char i;
        WS2812_Reset();
        for(i=0;i<LED_Number;i++)
        {
                WS2812_Write_Byte(G);
                WS2812_Write_Byte(R);
                WS2812_Write_Byte(B);
        }
}

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-8-29 17:34:26 | 显示全部楼层
神*** 发表于 2024-8-29 15:53
帮检查下这个演示程序

晚上烧录上看看
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:470
  • 最近打卡:2025-06-19 00:01:06
已绑定手机

19

主题

3233

回帖

5297

积分

论坛元老

积分
5297
发表于 2024-8-29 17:55:23 来自手机 | 显示全部楼层
8h不是有nop(n)快捷函数,为什么写那么多nop。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-8-29 20:50:23 | 显示全部楼层
so*** 发表于 2024-8-29 17:55
8h不是有nop(n)快捷函数,为什么写那么多nop。

学到了,我还不知道呢. 我是用逻辑分析仪调的
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-06-16 09:07:17

17

主题

533

回帖

1398

积分

金牌会员

积分
1398
发表于 2024-8-29 20:56:27 | 显示全部楼层

试了,稳定的很, 我用的DIP40, 明天补上个视频
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:419
  • 最近打卡:2025-06-18 15:02:09
已绑定手机

8

主题

148

回帖

1203

积分

金牌会员

积分
1203
发表于 2024-8-29 22:36:48 | 显示全部楼层
//STC8G1K08A 22.1184MHz
//STC8G1K08A 22.1184MHz

void nop(void)
{
}
void sendbyte(unsigned char byte)
{
        unsigned char i;
        i=8;
        EA=0;
                do
                {
                        ws2812pin=1;nop();
                        ws2812pin=byte&0x80;nop();
                        ws2812pin=0;nop();
                        byte=(byte<<1);                 //左移位
                }while(--i);
        EA=1;
}
void SetLed(unsigned char R_,G_,B_)
{
        sendbyte(G_);
        sendbyte(R_);
        sendbyte(B_);
}
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 01:18 , Processed in 0.129300 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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