|
|
AVR的RGB彩灯控制芯片WS2801的控制程序
$ t4 F# |4 h& w: w! a8 [
5 ~- l h3 ]; x9 d- Q#include"color.h"
& S+ {2 X% ]6 @, x, U#include"delay.h"
5 J& q5 }8 ]0 J) t8 C- y- \$ W; h9 |// 0.18084us
v& e# c' ^9 b/ ~! Z& Q; [' Fvoid Sbi_SDI()7 a! K6 S1 V6 ~! i
{; G- I, M/ _5 w! Y) F$ j6 p
sbi(PORTC,1);1 X1 h1 c2 ]+ T* X1 \' z8 y( h
}
5 |* j1 H2 F4 f4 T, x' K4 r- ^void Cbi_SDI()4 |: @% T3 [; |- Y. r
{
6 M* c: l, \% |3 Xcbi(PORTC,1);2 S% W. g* l5 X7 W2 _2 ^( ]
}
: g( [* I( P+ ^: D3 t5 t9 x" |void Sbi_CKI()
8 A2 n$ k2 v$ t{
3 k& o. B1 K' ?$ m3 ysbi(PORTC,0);
( r! M" F/ u, M3 s}
+ G7 k2 g# T- Z# Y. f5 Uvoid Cbi_CKI()
2 ^- q+ u5 S& f! h# P+ j( ~, j( k{
# A0 R* B9 H% L9 w% R, W9 Acbi(PORTC,0);
: @! T: c$ a5 I0 F}) n& U7 f# S% |) z: |
void Send_CKI() //WS2801 上升沿6 y+ q! [3 [7 G! b! i9 S1 Q
{) w8 ~, f3 _+ }# T/ }* Y9 {9 T0 c% G; T
Cbi_CKI(); // 时钟 拉低! Y4 y: U. z: ?/ H( |& s9 Y
_delay_us(6);+ U0 D. l9 I$ V% g0 r
Sbi_CKI(); // 时钟 拉高# v- M) Y% z: g3 H( B) E. ?
_delay_us(6);& p' P( a. N. ?2 w- Q
Cbi_CKI(); // 时钟 拉低
8 X9 I S9 s' c6 K. x5 g" s}
9 u7 v4 D. x; A" [void Write_WS2801_Data(unsigned char _data) //WS2801
3 c- g$ x2 }$ x{
8 @1 J. }3 [0 d Funsigned char dai;
) ~9 R! x4 T8 N. w8 cunsigned char cache;
7 ~+ J& g/ O6 f' N9 p# Tfor(dai=0;dai<8;dai++)' F! ^$ S2 X6 S: f
{
# M. s* ~* u/ V- f y# zcache = (_data & 0x80)>>7;
9 ?1 J3 p A4 X0 S# Eif(cache)- a9 D/ y+ r5 j O+ }& p& W
Sbi_SDI();
; L* v! n2 N8 Welse f' D5 y2 ~: g) z. V7 m
Cbi_SDI();
& Q0 b y u* @' O/ zSend_CKI();
& G Y0 e6 z8 m% v+ ^" N& f% D6 H_data <<= 1;
, e0 r U" E3 W7 K7 f# p& G}! c" o: U* j- |, |6 s% [8 ]- i; a
}
1 q& ]& J6 o! A7 \. a3 {void Write_WS2801_ColorData(unsigned char *pd); @( J# n: x6 p4 q+ P3 i+ [, c
{
% S; l; I- J# ~unsigned char LEDMax = 0; // LED 最大数量5 R k1 V) `) {5 d# b$ N
Cbi_CKI();
n; ?$ A( G/ q1 q& ]Cbi_SDI();0 G( Q4 p ^/ c$ q
_delay_us(250);
6 Y! Y n; H( {7 Y0 p_delay_us(250);$ M) n* S# |& a% y1 i
for(LEDMax = 0;LEDMax<27;LEDMax++)0 X: Q! j9 q$ Q$ @8 m
{
& Z5 a8 _! {6 X//Write_WS2801_Data(Red);
5 l9 C4 \! o4 o1 B: y//Write_WS2801_Data(Green);8 z0 H- o/ P. f6 J8 x* A
//Write_WS2801_Data(Blue);
k. C m5 V7 E2 E4 ?& ^" V# gWrite_WS2801_Data(*pd);
( z- K% t: ^1 s2 [# f' kpd++;5 ~. O1 H- M- p" A! x' Z
}% y# V3 a ^( R) b' r* L' R
} |
|