|
AVR的RGB彩灯控制芯片WS2801的控制程序
0 f L& ~/ M" N: M* X6 `- q3 Q1 m7 E0 p5 `
#include"color.h", M& t( \/ `! q" ^5 z
#include"delay.h"
/ R* k$ ]8 N$ x1 E// 0.18084us
9 B, p6 T: i& Zvoid Sbi_SDI()3 N# v, T+ x i# k) m6 L% i$ C+ o7 M
{6 J& O$ d& \6 _+ @# D2 b. Y
sbi(PORTC,1);, b% Z" A) S- E- p5 ^/ g* C
}" G4 Y6 r6 `' [! r6 D3 c
void Cbi_SDI()
- P0 |6 f& Q1 R7 ~* E, Y1 {{+ G9 [4 Z$ u3 N( Y# n
cbi(PORTC,1);
' d: x: Z; V2 Y( z' s8 S1 g}
" u; V. ]' |0 n" K/ t- Q: E- Y: ?& cvoid Sbi_CKI()2 _1 N3 G( A# u7 c
{( @$ |: I3 m- e' [
sbi(PORTC,0);( P0 G3 t6 r( M: r' H. B( N0 `" m; W
}
8 U! S" m# l' l$ Lvoid Cbi_CKI()
1 ~) W$ \1 q$ k, \8 U# u" @; p{% C* f- o7 Y7 |4 n
cbi(PORTC,0);8 `9 y' C, k) }# I) O& E
}- D. Z0 u& U5 ?" Y' y/ |. c
void Send_CKI() //WS2801 上升沿& X5 D% ]% W3 `- u% D
{
% W! O, M ~& C$ c7 ZCbi_CKI(); // 时钟 拉低
! t& K. y& h0 G_delay_us(6);
7 r# L; L/ }/ u$ {3 k! s: WSbi_CKI(); // 时钟 拉高1 z; U4 ^! R7 z J8 h8 P
_delay_us(6);8 a9 {4 e/ L( j" ~) l
Cbi_CKI(); // 时钟 拉低
8 R2 ?/ D: g( ^' S}
9 p: k6 X' Z5 n! y( k7 [void Write_WS2801_Data(unsigned char _data) //WS2801
2 j) T' K& @0 G4 I- j{
3 h; q! b0 j) e5 V+ Gunsigned char dai;8 a* i; k# j( E d/ v' R L
unsigned char cache;0 I8 u: d i4 N6 t% _* m) L
for(dai=0;dai<8;dai++)' R2 ]( g1 V" b, E
{: y% |) r3 g9 D+ c% ^8 M4 ^& @0 i
cache = (_data & 0x80)>>7;: S% S4 Y9 _8 C$ Y/ a* U- ?
if(cache)8 G2 B7 j" l5 K# _5 D4 ^) ?
Sbi_SDI();3 i. s/ N3 t4 s; ^, f' L
else
4 D6 j7 O/ o4 v& T5 cCbi_SDI();
$ ]1 e' }+ l1 VSend_CKI();
2 x$ P7 x( Q. G+ f# F0 N4 N_data <<= 1;- E$ r) j1 w! n" a% G. D7 L1 g
}% F/ i6 M ]# g# T A/ Y/ S
}9 i, G' _' P# |
void Write_WS2801_ColorData(unsigned char *pd)
5 b) @7 j+ x% }4 o2 f5 z) \{
. U0 c5 u) z7 W4 O, E( n! J& Gunsigned char LEDMax = 0; // LED 最大数量1 n& M7 Z; t0 ?# g
Cbi_CKI();
& K* z# M! j$ G" }( P2 ?Cbi_SDI();5 ]/ V; Y! V) R7 F
_delay_us(250);) Y" }7 Z# ^( m$ A) x1 R" L4 j: a
_delay_us(250);
9 s1 o0 f! I9 b3 l$ N8 t" d' cfor(LEDMax = 0;LEDMax<27;LEDMax++)
3 r* {; b, G6 f{
- E, k% A4 q7 G//Write_WS2801_Data(Red);& c; i" p0 x- l n* x
//Write_WS2801_Data(Green);
. W7 z, r1 f) r) u//Write_WS2801_Data(Blue);
- O. L# M' f5 l$ jWrite_WS2801_Data(*pd);1 R* p3 n! A$ v% i" {( c
pd++;
% H Q2 ~. h: A% x( t} B' \( P! U6 {! B( U1 U
} |
|