|
AVR的RGB彩灯控制芯片WS2801的控制程序
7 G# L f/ \3 Y+ z! A+ A4 P: K: D$ B. f5 d' s
#include"color.h") q ?6 u2 B* V' R
#include"delay.h"
$ i) l: L% B% h3 m% C# ^. {- E) p! r, s// 0.18084us
2 U0 ^: S; P% ` H% h7 rvoid Sbi_SDI()
3 f1 d$ l5 J% @) o{4 ?) S* O! D7 H9 A7 g
sbi(PORTC,1);
. @9 I, F. n4 }7 x2 d}
% l% m+ G: [, I. M% H7 ]* F" Wvoid Cbi_SDI()* R$ x" p% @7 }6 C0 p
{" `7 |! l+ P9 s" f2 D8 G
cbi(PORTC,1);
# n; G6 d7 ^1 n% s6 M" O}
; A3 y: t2 ^# f. i, a X0 D7 Uvoid Sbi_CKI()
7 Z; w2 Q+ J: A9 K% |* j8 A* i{7 A. c5 I) \* @) B& q& K4 _! p3 A
sbi(PORTC,0);8 H/ Y% P7 p( s; a, s2 b- P
}8 }1 I" H$ v& D& G: S
void Cbi_CKI()
# b. o T j% C2 V4 r% |{$ g- A. U* e1 u7 E% }
cbi(PORTC,0);5 i1 ^2 ]* i L* k2 x; @
}8 W: R- X8 F! ]1 j3 P
void Send_CKI() //WS2801 上升沿$ K' o! L* J2 b. n' C3 K+ E( X* k
{
' ^* ]. n1 w# R4 @( Z% v0 k2 ECbi_CKI(); // 时钟 拉低# ?2 h8 [* @' O, p7 `
_delay_us(6);, S/ G- U5 e% r
Sbi_CKI(); // 时钟 拉高
1 j% S% T5 k* g" M_delay_us(6);
4 V5 q* O! `% o$ W" U$ g* F* ?' pCbi_CKI(); // 时钟 拉低
$ Q: K1 v5 |$ V: \}( o( j; u" ^( a) l% u) I y' d
void Write_WS2801_Data(unsigned char _data) //WS2801
# f! Q9 a) K" L3 L0 @) Q/ N{$ W8 z4 M, F& l+ x$ E! t
unsigned char dai;
- {. [7 w* r3 j: J; M3 I. t) dunsigned char cache;
- O( V7 d9 s ~ T1 ~for(dai=0;dai<8;dai++). `0 n; ?5 k) p6 J$ c! @3 e# a( L
{
1 V9 I. b* R$ W9 t" _) Kcache = (_data & 0x80)>>7;. p: D1 q+ B: H- s
if(cache)
+ D; y0 d P: B v7 O0 nSbi_SDI();6 r2 S& A: B4 }/ t3 ~
else. P/ z; W" l+ ?5 `1 t' ]0 G I( z
Cbi_SDI();
. ~5 i9 m- B! F% A) X! x% OSend_CKI();: i. p. f$ h' s) }0 [. A, b
_data <<= 1;; r/ U; c) | J' Q
}
+ `3 w P/ F: b}; R0 b: W" b7 d
void Write_WS2801_ColorData(unsigned char *pd)( Q. O+ b/ o3 l- S4 P; `
{+ o s, m) T. c8 E9 ?3 Q
unsigned char LEDMax = 0; // LED 最大数量
M( U' w% { U* k- Q0 E: V8 |( y9 OCbi_CKI();2 q; t: V( G4 h% A# K
Cbi_SDI();9 |0 e+ e: {/ K
_delay_us(250);7 N! c% q7 I- d( m( k
_delay_us(250);
/ I1 `+ s0 G' n) Vfor(LEDMax = 0;LEDMax<27;LEDMax++)
5 ^/ a0 K0 h/ c% I3 d$ _{5 [5 v# I7 C1 R9 i/ O& \
//Write_WS2801_Data(Red);$ r3 L h' H! S% d7 f5 m' S
//Write_WS2801_Data(Green);
; T: k+ j8 d1 n! |: K//Write_WS2801_Data(Blue);( I, n d) l J; c' o
Write_WS2801_Data(*pd);9 f7 Y& y& X) S: k, B/ w
pd++;
8 n+ o4 r% F$ ?& ^. ?}
6 o: a0 _% w/ K; {2 O% y} |
|