|
AVR的RGB彩灯控制芯片WS2801的控制程序
' r3 E, E; Q$ }+ R- T6 t
. t, R, F. E: J#include"color.h"7 o3 F M, R) D" j7 Z
#include"delay.h") d0 C( f- Z" n$ t. t6 d
// 0.18084us
* Z. `7 J: D6 a+ cvoid Sbi_SDI()
, {+ E+ R: w) J/ M: I/ }{+ i: A/ }- z% z
sbi(PORTC,1);; A+ C0 \8 a5 \% I1 ^
}
/ D1 p. i, V2 i `: K9 M3 H5 Qvoid Cbi_SDI()5 T k0 e8 J: n5 \: ~
{9 u5 ^1 E% n' Y y4 l, h
cbi(PORTC,1);
3 b1 t. l0 \) W4 U, t8 n% n) @. c/ k6 }}: I. g y, h6 Z' ^) ~
void Sbi_CKI(), m* F6 N) H8 V2 Y4 F3 F. j
{
4 b2 c" |! b- K5 ssbi(PORTC,0);5 V1 ?4 z) m8 O, ^& y
}
$ n' y; E! {6 s9 Bvoid Cbi_CKI()$ F: G5 G& a9 j: N4 B3 S9 a3 u1 H4 A
{; W! G# }& H' X q5 x5 [( p8 ~
cbi(PORTC,0);
1 y6 z. c c% \7 i6 N" r; x2 L}
, a' J/ J! w+ n. T# M" evoid Send_CKI() //WS2801 上升沿+ {4 j- F6 P- B) c, E
{
* ^0 v. z6 i' u7 P: \# y. |Cbi_CKI(); // 时钟 拉低
; [3 P- p1 M* I, y- u T_delay_us(6);: o6 O1 }9 s% n' N b/ I% t
Sbi_CKI(); // 时钟 拉高
% L2 q+ Z+ X9 `_delay_us(6);
+ _* g! Q& |5 ^& L8 WCbi_CKI(); // 时钟 拉低( C/ ]9 ~6 A1 M2 c6 h
}0 ~. _' D( W" O9 d3 g0 C7 B
void Write_WS2801_Data(unsigned char _data) //WS2801
3 R4 k+ N y3 I{
% z/ v% h) k1 L$ k6 W# o3 dunsigned char dai;
. E0 l6 B1 F& I+ N1 g* ?' O- F% Q2 Uunsigned char cache;% r8 G- u' v3 W* @# i
for(dai=0;dai<8;dai++)
+ n0 a" h# r& X7 r& {9 f5 J" X8 a0 J& \{$ t: @, ^; l2 r' g
cache = (_data & 0x80)>>7;% t9 d' P) x6 b' F. M
if(cache)
) c0 i' r) Z2 l& Y( t1 u2 M1 FSbi_SDI();
) V* H1 v' X" x$ c, C2 N' Kelse
+ b U8 K0 z5 I+ `. qCbi_SDI();
0 j% |# G( b2 ]2 kSend_CKI();4 J. X+ L) L7 H, z: ^- j3 D
_data <<= 1;' @& m4 O- ]' n5 r' j6 w- o
}
5 Y+ q& K4 E+ h$ `" u9 R( [- T N}
1 d# b, I/ F% j" U1 ^, j$ Mvoid Write_WS2801_ColorData(unsigned char *pd): Z9 i) n0 q) e' S7 o8 z* Z
{
- ^! }# j7 {& V/ Uunsigned char LEDMax = 0; // LED 最大数量* G$ x& t5 f: y6 k5 D
Cbi_CKI();/ c$ J' X' v, V) O- [, [& O" p
Cbi_SDI();& Y0 H& I7 `6 s" v) X
_delay_us(250);
* W+ B8 v* f* \$ M% G3 f; Z_delay_us(250);, n9 X# y( w$ g( `" }
for(LEDMax = 0;LEDMax<27;LEDMax++)% b7 k4 z+ H8 w e7 R) Y
{
; U8 ^8 n7 ]- s, ?! l1 Z//Write_WS2801_Data(Red);
2 l% W: G& X1 a' x$ A) M) I//Write_WS2801_Data(Green);+ G! I9 r: d& g/ Q
//Write_WS2801_Data(Blue);
3 c) U. M: P8 u; |4 ~# |. kWrite_WS2801_Data(*pd);
; {$ Y+ @) q* C/ p* W( Spd++;+ R5 I( r, _, G, j5 F
}
1 I/ t- T/ W( G2 T& a} |
|