|
|
AVR的RGB彩灯控制芯片WS2801的控制程序
( g6 V% V* s' B2 Q4 |- _2 k0 ^
0 ?% y4 d; D0 H$ I5 y#include"color.h", z* e& ]' w ~8 t& R/ ]
#include"delay.h"! N. o3 @% l- [* k9 Z" \
// 0.18084us
( w& x8 m" M/ \' Ovoid Sbi_SDI() Q5 ]$ e' a. o" G; P5 u. O& n
{
& Q$ p+ Q2 M" s) z0 w2 S usbi(PORTC,1);
6 d0 d4 v/ I0 M, T. e}7 g% c% |+ z. G. ]/ e9 W
void Cbi_SDI()
( S0 f" @. P- c2 z" e0 q/ x, W{! M, }- p8 K1 z3 Y) S1 _3 p# h
cbi(PORTC,1);/ U9 r' O/ Z7 N% f7 e: Q) Z: j& [
}' h" ]+ U4 l0 x$ q# g/ c
void Sbi_CKI()9 Z$ [4 B# e- r# n5 L. b* Z
{4 b% B) K! c9 X/ D
sbi(PORTC,0);, Z2 m j! X6 i& O, N( a4 ~
}: O. F1 L i0 N" ~+ ~) e9 q5 e
void Cbi_CKI()
4 i; T& L; w! c" ~7 L g{; `2 _' @% s$ X6 B2 T& i# m) k( b
cbi(PORTC,0);
0 d. L. I \# R; [* P}
0 K& \5 b: O! T- yvoid Send_CKI() //WS2801 上升沿4 B, I8 A. y9 ^/ U0 i
{. `1 S6 Q2 t) p( R6 k$ j! t
Cbi_CKI(); // 时钟 拉低' l6 E! h7 e' H6 G: x- i
_delay_us(6);
( O Z6 q# U. X. \3 A6 U% f* dSbi_CKI(); // 时钟 拉高& z1 z( I* {+ |) |& ~! U
_delay_us(6);
4 N1 n; N+ u5 M2 U& LCbi_CKI(); // 时钟 拉低
# B' a$ s2 N) E2 X+ {! X}% F% ~- u% |, _) s0 z$ t
void Write_WS2801_Data(unsigned char _data) //WS2801
+ V# X5 T/ x' H$ A# s{1 i* J1 s m1 ^! S5 u, T" f
unsigned char dai;9 K' @0 M& w3 l, M, g O
unsigned char cache;
' u+ s5 e+ J) `/ E7 zfor(dai=0;dai<8;dai++)& N2 K, [# b' |
{
- \7 f2 m' ]* a% A8 Mcache = (_data & 0x80)>>7;: _+ L3 T2 a( P
if(cache)
6 p/ _9 |6 {0 z0 wSbi_SDI();8 q, ~- L0 p+ _1 F
else
$ s* S6 V. |9 Y0 h v: x) aCbi_SDI();% K; V$ H1 W4 F6 s' ]4 G. B
Send_CKI(); u4 M) l+ ]! Y; O8 {
_data <<= 1; V' p7 H7 x& i9 r) V
}4 v4 I( K- f3 W) W! F$ T( [+ q+ e
}. @* ^& \5 g6 |* H
void Write_WS2801_ColorData(unsigned char *pd)( K# H) J. H9 d0 R. g
{0 a5 b5 ?+ R% w' }; x- p
unsigned char LEDMax = 0; // LED 最大数量) f+ L/ W3 p$ H6 ^; A( O: }8 p
Cbi_CKI();
& F& U7 I" m' [9 [: _- ^Cbi_SDI();% U5 n5 j' d9 _; {0 D- {
_delay_us(250);5 K. t% e1 ^' i" X8 I, w, h
_delay_us(250);5 b3 u7 u2 g, j
for(LEDMax = 0;LEDMax<27;LEDMax++)" w3 _2 R& j( x; q% g% Y
{
4 e* b- L9 H) ?& D. k//Write_WS2801_Data(Red);
; U7 V# s6 X% k//Write_WS2801_Data(Green);: V7 _1 G( D9 p! V6 W, ^6 f; h
//Write_WS2801_Data(Blue);
1 v) ~, n3 W" iWrite_WS2801_Data(*pd);' v5 z2 b$ L* A
pd++;, r+ s" ~5 Z% j
}
6 g2 d9 U/ E* T( e} |
|