|
|
AVR的RGB彩灯控制芯片WS2801的控制程序. F2 W2 w" z$ K9 S4 E4 R
; T4 H# s$ U4 `. E) v8 b#include"color.h"6 c# _4 T: r2 `* L+ Z$ j
#include"delay.h", m% p1 J7 c8 {
// 0.18084us
8 c J' e- |$ b6 T P7 D5 i; f0 ?$ Ivoid Sbi_SDI()' s O6 Z: ?& ~; h7 ]: e# B! V
{2 u; A' y6 _8 q
sbi(PORTC,1);- q1 o; D( g; s$ ^+ N! f
}
. B1 ]5 D% h5 Y5 J5 w; m- \void Cbi_SDI()7 _" s, l9 c* p
{' E' V9 q: m6 K$ G
cbi(PORTC,1);
- {( O U. E' C W1 H}
/ i; c5 D% q2 J- n: [void Sbi_CKI()
6 G) `% K {4 @9 M{
% J+ L4 C r- F8 zsbi(PORTC,0);
) l5 K! X- ?; x3 h6 m) l}
% u( E7 k/ {) q% i' Pvoid Cbi_CKI()
) Q" A3 G G+ j- d/ T' o{
; s$ c; K- f5 h' Z' t5 C0 @cbi(PORTC,0);8 d) r' S- i1 \, |& p ]) n$ |2 e
}
- W. z5 q/ L3 C0 yvoid Send_CKI() //WS2801 上升沿
# \2 N% V4 v) G! O2 d" ]$ K# l, h{; j" \$ X9 _ H! T% G
Cbi_CKI(); // 时钟 拉低
! B- a' F9 z5 [9 @8 Q_delay_us(6);
9 W( n" W+ M& n! {! C8 mSbi_CKI(); // 时钟 拉高
+ T1 w6 [( G; r/ w$ n4 |: t7 W_delay_us(6);+ q- z3 H- m% E
Cbi_CKI(); // 时钟 拉低
6 ~5 W; H% \# O1 w7 G}6 p3 [) W" @2 e0 @" R- x2 B, r& T
void Write_WS2801_Data(unsigned char _data) //WS2801( ` H) `1 c+ v0 ?& a
{
% V0 w: S" E5 A& E0 }3 P3 N; [unsigned char dai;
5 u7 M/ F' ?% O- {- Yunsigned char cache;
8 P1 m f2 Q1 b d3 A$ W5 yfor(dai=0;dai<8;dai++)8 V* F: m+ p" b& W
{) J9 {0 C8 P; w. V# R
cache = (_data & 0x80)>>7;
8 p0 T$ m2 I7 W8 n; \8 aif(cache)+ F( g" h9 }( K& C% ^
Sbi_SDI();
|0 l$ d; A4 V2 n, Z4 j t6 Q2 Velse
' u/ \4 H- Y8 a( sCbi_SDI();
$ Y# Z( r# T% a# b* k4 [Send_CKI();3 o' u" T/ y8 Q4 i* q
_data <<= 1;
4 q" z" A! N4 N}! x& B" y* P/ Q% X% U0 F$ X
}
6 s2 [- y+ s% B' X, V5 |void Write_WS2801_ColorData(unsigned char *pd)) d, U8 c3 k/ K! J! P& B
{4 P, L5 c6 D' S; W" N
unsigned char LEDMax = 0; // LED 最大数量' J& k. Z7 I' J9 p
Cbi_CKI();
* v% X* E8 U: C. Y1 V% v! TCbi_SDI();% ?/ s# R6 E" i' p- V
_delay_us(250);) T o5 B; G$ u3 l
_delay_us(250);- Y- _! B7 t0 P" j% W q
for(LEDMax = 0;LEDMax<27;LEDMax++)
2 b. l+ `* I# p7 N6 E* c4 e{
. P9 E( y' M8 R3 E& T0 a1 f p//Write_WS2801_Data(Red);
5 C3 N! |4 U! j* k6 P# n7 s//Write_WS2801_Data(Green);& _8 W7 F( U4 R, t% i3 q
//Write_WS2801_Data(Blue);; F' C$ F& r5 c8 R/ t' @0 R. |
Write_WS2801_Data(*pd);
5 h: A3 V% A7 j& T2 Ipd++;
7 b- b& y; L8 W$ P2 j/ ?}" _5 m4 i R8 I0 G, m, r/ k5 e; Y4 e
} |
|