|
AVR的RGB彩灯控制芯片WS2801的控制程序
7 u6 N k0 v' h, U. t* S4 N x( v- g$ ~4 b
#include"color.h"2 e8 \1 {- \. U. N) y9 h! u0 k H
#include"delay.h"5 H9 S4 @; n' Y3 W4 e$ H' h+ X5 d
// 0.18084us
4 o& e8 H$ P/ C4 I; A" [6 h! rvoid Sbi_SDI(). g$ c7 d" N2 |4 y+ P* S
{
: o) A: D9 I2 g% k" _3 J+ gsbi(PORTC,1);7 p7 B. d1 r2 ~2 m+ D
}% s/ ] l' `( J I5 a0 l7 u/ [
void Cbi_SDI()+ r7 Y7 m3 s3 b: y4 n
{
( k3 K' S7 p8 r$ icbi(PORTC,1);: |" w3 Q6 i9 ~
}
2 S5 V7 T/ @7 w% `7 v7 Lvoid Sbi_CKI(): V7 W& H' j7 s+ ^
{; G: |1 d7 U! f4 h4 u" w( z
sbi(PORTC,0);' U0 m5 q. u3 s
}' D) S2 ^ G& D$ b/ \1 U
void Cbi_CKI()
3 h- P7 J) e4 u" S. t7 I{& T3 t8 ]# g! K3 z8 y1 N& u
cbi(PORTC,0);; n# ^1 O% o% ~3 P9 N7 P
}
( |3 _* D, f- ~void Send_CKI() //WS2801 上升沿7 K: m6 G! K0 j1 i# J
{
" i: F2 ^- K; s1 pCbi_CKI(); // 时钟 拉低
& y1 H& H* V G1 _. P1 z; a_delay_us(6);
1 ~( O; K' f; [5 E) T1 d0 USbi_CKI(); // 时钟 拉高" y4 g5 T6 _3 \( R; Y$ Q" L0 s
_delay_us(6);% B- J# R( m4 D$ U" E# ]9 u' ~
Cbi_CKI(); // 时钟 拉低
; i* n5 m! i$ D}2 \& e/ U( Q M
void Write_WS2801_Data(unsigned char _data) //WS2801
: ]# i+ ]3 p; O/ v& B+ L6 l{ k" ^3 X a) L2 D. C# Z2 P
unsigned char dai;
, F* T4 b* ]& M8 M: {unsigned char cache;) S/ t- M+ U4 X" Z4 D
for(dai=0;dai<8;dai++)
( I6 u2 _1 q( {7 ~{$ g x2 |/ j$ y( J" y
cache = (_data & 0x80)>>7;( V% n) b4 T0 l" {3 D& ~& Z
if(cache)% V! U T S0 T3 Z) h- J6 [
Sbi_SDI();
8 @: P$ Z+ }/ {% h+ Kelse% K; V* ^( V( r4 K% w/ V
Cbi_SDI();' y1 o2 I& l2 }) m& q7 Y+ ^# p
Send_CKI();
! b: V- B& h/ O* W8 y1 `_data <<= 1;/ g& o4 f6 S9 r# Q7 H5 Y' h& c
}. {0 `8 z3 W, F6 W; f2 ]
}
0 k% A& g8 o( u- }! D( Dvoid Write_WS2801_ColorData(unsigned char *pd)4 m( S2 V" k" M$ v' j# s/ x
{
7 ~+ O2 }3 V- v6 wunsigned char LEDMax = 0; // LED 最大数量
. ?5 i2 N8 U- u6 ]" Z8 ?Cbi_CKI();
8 t# D- d, x2 |* ~# oCbi_SDI();
5 v4 @9 B0 Z- O_delay_us(250);
* U0 g, ?( m1 b% q/ ]_delay_us(250);
6 T# v% L m; S* m. gfor(LEDMax = 0;LEDMax<27;LEDMax++)
& c9 s1 c7 a0 n{
7 d8 Z* C1 K) C1 H//Write_WS2801_Data(Red);5 {$ t1 ~) O' @5 B
//Write_WS2801_Data(Green);& z3 r: |4 B( H7 e9 l
//Write_WS2801_Data(Blue);
8 u& o/ H; M$ e, f7 G* N& K6 QWrite_WS2801_Data(*pd);
3 k, ^2 w9 ^+ gpd++;4 X9 ], d6 u1 P8 U7 X$ |. M0 a' e. M
}2 x$ ^' g' i' x( A
} |
|