| 
 | 
	
    
AVR的RGB彩灯控制芯片WS2801的控制程序 
( f& Q1 T+ o- g* ? 
- \+ s# b6 m- j2 H#include"color.h"9 f, w8 l) J; O6 ] 
#include"delay.h" 
+ N. h& w" {& E  I+ |// 0.18084us 
# ^& i* R! U5 q- W* Y8 evoid Sbi_SDI()% T2 P( m* `7 i( X! R 
{( e( t; z3 e, k5 Y% D& N$ W 
sbi(PORTC,1); 
+ s* I& r! ^, h4 t}) L: s$ X% F' V0 K( a0 f 
void Cbi_SDI() 
+ K9 [$ X7 s; p( I{9 [6 L# O5 ~+ q# ]  z 
cbi(PORTC,1);, j8 C9 d/ z% }& Q4 V6 r( I 
}5 c1 ^9 ^! g# n  n. S- _# y 
void Sbi_CKI()" |: J7 J0 [3 C8 y 
{ 
; P3 g, @- X. d; qsbi(PORTC,0);' ^! F- _# ?* Q2 u( w* L1 Z 
} 
: a( c' d4 y5 S' z8 R+ ]  e# K) Lvoid Cbi_CKI() 
" O5 V0 h! w5 I9 x' {7 Y{ 
- x# Z* R% l/ x0 ~0 ]: Dcbi(PORTC,0); 
. F$ \+ g, o. G; _# l* h}( C7 R) s/ [' E% D* X 
void Send_CKI()  //WS2801 上升沿 
: t7 B# A# D/ Z3 f1 R6 B* U% C{. r; t3 f4 }) U2 e6 }, m 
Cbi_CKI();      // 时钟 拉低 
* j7 d, u0 x( ^/ ?/ y, ^- U_delay_us(6);9 j7 t! T8 m# I, o. B" i9 g 
Sbi_CKI();      // 时钟 拉高0 F: i/ s( E4 D2 R 
_delay_us(6);/ y- {6 [- @! g3 B( n$ d 
Cbi_CKI();      // 时钟 拉低 
2 [" r2 a- a( ~} 
' @' ~1 l, f- d; Z' Avoid Write_WS2801_Data(unsigned char _data)  //WS2801$ N8 `. @- y/ X9 z/ Q" ?5 ?! x& | 
{ 
3 E6 {! g  f$ Runsigned char dai; 
$ _0 m; l; F- Yunsigned char cache;5 ~2 V0 p- {. `' l% J% x; \ 
for(dai=0;dai<8;dai++) 
6 c% U7 u7 t0 ]! r, Y6 k{" |: V* Q/ j& G" \! e! `7 { 
cache = (_data & 0x80)>>7;: ^1 L9 M. {" k" ]' p 
if(cache)" O5 c2 U) U) H1 e2 H 
Sbi_SDI(); 
# ]+ ?. K4 b% W6 [2 Celse 
: m$ j+ W$ s, K2 \+ b( u4 g6 aCbi_SDI();% e7 M) D8 n0 U" V$ \ 
Send_CKI();& L0 U% M. k1 U) U% H6 H 
_data <<= 1; 
* H2 L. @5 e: C. u/ r9 a} 
6 ~4 P! S' C/ ]; h} 
, T7 M3 }9 T! v* o, xvoid Write_WS2801_ColorData(unsigned char *pd): P) i7 [" I: z# K# ^ 
{ 
( p) V, `% j* v  Lunsigned char LEDMax = 0; // LED 最大数量% m: m/ P0 o- o) _8 p- W& q  H" l: @ 
Cbi_CKI();$ n( V; Q9 b5 L4 S# O 
Cbi_SDI();8 A% W, e- `! W( z1 t- u4 ^+ g& \ 
_delay_us(250); 
- S% M$ E2 U2 F& H5 c. ~_delay_us(250);5 n4 B# c) r5 p) x+ y 
for(LEDMax = 0;LEDMax<27;LEDMax++): }  V7 y  k# L) Z4 A 
{5 f! B# K6 A  W 
//Write_WS2801_Data(Red); 
- z1 a# H/ g6 Z//Write_WS2801_Data(Green);# e% r3 j5 g+ a4 U, N8 h 
//Write_WS2801_Data(Blue); 
! W# E9 `4 e1 e. N$ f0 g9 fWrite_WS2801_Data(*pd); 
; P$ @6 `9 `2 x2 Z9 o2 h, Tpd++; 
- j( r. l! @5 }# Y/ c} 
  G, V! a3 K* i} |   
 
 
 
 |