|
|
AVR的RGB彩灯控制芯片WS2801的控制程序3 R v2 D: |- z! G, _% }
: h" v" A$ n A3 ^9 C#include"color.h". b, P+ p( f& F% H
#include"delay.h"
' B& [: t( q. h// 0.18084us% b% T/ G; y X/ `/ W6 [! e
void Sbi_SDI()
2 M" n/ K5 S4 X+ h A( g I% r{
# f2 }1 _' z4 H osbi(PORTC,1); T7 P2 b! |; y' ?8 h" i0 i
}3 j7 |! s( G; ^* v3 z3 h
void Cbi_SDI()% ?3 @- d; b2 \6 I0 v
{
6 ~0 h: T# S0 K) m- B5 k6 D4 z, xcbi(PORTC,1);
5 c C8 G9 O3 V0 p" h1 c7 ?6 k" P}5 S; _- c4 t( I2 f+ J
void Sbi_CKI()# c8 R( R `# s4 @2 \
{
2 G9 N7 Q; a# a2 ?2 U) [: T! @& `sbi(PORTC,0);( s4 @: |1 u9 ^$ @6 ^
}
: x7 V, X9 m$ s! v' wvoid Cbi_CKI()( z; w' H S# b
{% q! M7 P; ?& I9 K% x4 ~4 W$ @
cbi(PORTC,0);
- f" T) Q u' _4 L}# o6 h) d* `. m: j9 ^
void Send_CKI() //WS2801 上升沿
: G9 b8 v2 E+ K) f8 }% i{
* p2 B6 ~! W1 i4 {$ ^Cbi_CKI(); // 时钟 拉低% O0 A/ B& T B' y0 J6 h
_delay_us(6);/ L0 D' e; n7 o, _+ i- I3 c% Y7 u5 G
Sbi_CKI(); // 时钟 拉高
& L ~- h9 e" D# W$ Q( r# w_delay_us(6);
1 |3 i& _2 X o6 @2 x$ jCbi_CKI(); // 时钟 拉低
# ~5 q2 z. D% [8 i3 P}
+ `) l" u H+ t" Y2 uvoid Write_WS2801_Data(unsigned char _data) //WS2801
* k" P, h0 d# ?9 t# W{
4 s/ @4 f! {+ Q1 G% vunsigned char dai;
. ]. _+ d: i9 D7 l0 {& @6 j7 iunsigned char cache;0 g9 A* S6 W% K1 m7 K4 _7 `
for(dai=0;dai<8;dai++)
+ z' O2 X! Z, I% c# k$ e% }2 _{0 |, d' M# a- S! m. S
cache = (_data & 0x80)>>7;
. e& `; u9 f4 G) y2 l' R6 z, u* pif(cache)
* i0 J9 S( A% g) PSbi_SDI();" S* @; F& c1 k3 `$ P
else: Q# _5 U1 {% W; q* S6 f0 A& c
Cbi_SDI();5 _, P/ _* d2 p9 O# S1 K1 p
Send_CKI();8 v' S5 Q9 P3 L+ S. m/ ]
_data <<= 1;
8 e3 b! O- v7 _( C( |+ N}" r* h) ?# H" B: m5 b
}
9 s3 g. k/ u. E/ e+ Pvoid Write_WS2801_ColorData(unsigned char *pd): L" T% u! ^* X' ?! V: h! p4 d
{: l, f0 b! H/ C1 r3 A
unsigned char LEDMax = 0; // LED 最大数量
4 X8 b9 P) _' s) O( @. [1 hCbi_CKI();) f G, ^ l# @" y# m! s
Cbi_SDI();( D8 k. S( Z C! ^7 ~! \" h# x
_delay_us(250);
! F6 y# q/ [/ ?0 n6 w8 _( E7 C_delay_us(250);: }! {" ~8 M9 y% U. m
for(LEDMax = 0;LEDMax<27;LEDMax++)
7 i3 o: J* C- i- E{
" }4 e$ w/ c9 U" h9 b# u+ }1 e1 w% j//Write_WS2801_Data(Red);
4 w' x& s4 P4 x% z B; O//Write_WS2801_Data(Green);8 @' W$ R2 f, s
//Write_WS2801_Data(Blue);2 p: ?* \1 G% M+ H% I* ^* @6 Q- e# b
Write_WS2801_Data(*pd);1 O, h4 S, r" N u6 l7 D
pd++;1 S' P4 L3 A% A% _
}' Q# h: y) D1 v$ I( S" {
} |
|