|
单片机在频率较高的情况,完全可以使用软件延时的方式来驱动WS2812,但网上一般都不采用这种方式。 - void PWMA5_Init(void)
- {
- P4M1 &= ~0x40;P4M0 |= 0x40;//P46
- PWMA_PSCRH = 0;PWMA_PSCRL = 0;//分频
- PWMA_CCMR5 = 0x60;
- PWMA_CCER3 = 0x03;
- PWMA_ARRH = 0x00;
- PWMA_ARRL = 30;
- PWMA_CCR5H = 0x00;
- PWMA_CCR5L = 0x55;
- PWMA_ENO2 |=0x01;
- PWMA_PS2 = 0x00; //选择P4.6
- PWMA_BKR = 0x80;
- PWMA_CR1 |= 0x09;
- }
复制代码
发送八位数据函数:
- void SendData(u8 dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- if(dat & 0x80)
- PWMA_CCR5L = 8;
- else
- PWMA_CCR5L = 22;
- PWMA_CR1 |= 0x01;
- dat = dat<<1;
- while(PWMA_CR1 &0x01);
- }
- }
复制代码
发送24位数据函数:
- void WS2812_rand_color(u8 R,u8 G,u8 B)
- {
- SendData(G);
- SendData(R);
- SendData(B);
- }
复制代码
延时函数: - void Delay1ms(void) //@48.000MHz
- {
- unsigned long edata i;
- _nop_();
- _nop_();
- _nop_();
- i = 11998UL;
- while (i) i--;
- }
- void delay_ms(unsigned int ms) //@48.000MHz
- {
- while (ms--) Delay1ms();
- }
复制代码
主函数:
- void main(void)
- {
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
- PWMA5_Init(); // 初始化 PWMA5
- while(1)
- {
- WS2812_rand_color(1,0,0);
- delay_ms(500);
- WS2812_rand_color(0,1,0);
- delay_ms(500);
- WS2812_rand_color(0,0,1);
- delay_ms(500);
- }
- }
复制代码
欢迎各位大神指教,谢谢! 2026.7.17
|