|
|
AVR的RGB彩灯控制芯片WS2801的控制程序1 N1 H2 t3 o0 p2 H' [
. |% g# E! V1 ]2 a* c+ W) H#include"color.h"6 F# x+ D# Y$ u. @2 a
#include"delay.h"' g P: J n/ v4 A. S
// 0.18084us
) a2 O) D/ J" w3 a1 B# H% kvoid Sbi_SDI()
) P2 j5 Y% D8 j- J0 V$ P% B{2 F Y4 N. M8 [ q6 y+ i$ s; W1 c
sbi(PORTC,1);
: g0 M u% S; s7 M& S% I}
$ l. Q' ]0 s8 J2 A# {' q' ]. \1 V% Mvoid Cbi_SDI()
/ I# w( v4 \% n* d$ N{: D1 m0 ~7 w' a" v! I4 ]2 j
cbi(PORTC,1);% I; e/ M3 N9 [* M5 s$ z
}
8 H% Z, V, I( T- q2 k: ]) ?" mvoid Sbi_CKI()
! ~' A) y- y3 g) U- [. ~9 ]{
# b& X+ E5 X+ Osbi(PORTC,0);/ k$ ~4 J# e& k+ ~' E/ O
}
- N% s) I8 E" m4 W+ I, y2 \void Cbi_CKI()0 u& z1 D. c7 X0 e9 h
{3 Y5 L, x: p# O
cbi(PORTC,0);
/ d: {# @5 J) M# N}
& i) O/ k2 k( j& m0 Y5 ^5 e# w- Avoid Send_CKI() //WS2801 上升沿
6 P8 X1 G5 q) Z% B* m5 M{7 u5 X3 U, V. I/ E
Cbi_CKI(); // 时钟 拉低
; G: ?) e8 u7 s* B2 A1 m8 u_delay_us(6);; N! ?; _- Q) Y0 o
Sbi_CKI(); // 时钟 拉高7 _- w3 \9 g9 u! V7 w
_delay_us(6);! R+ p ?5 E# V3 g1 m
Cbi_CKI(); // 时钟 拉低- Z* _6 b% X. n' Y6 _+ u: E( j8 P7 K
}/ l( B; g$ A/ T! k) _: [6 t
void Write_WS2801_Data(unsigned char _data) //WS2801
5 p1 q- ?( W) i% l! n |{1 z" Q7 G! A4 L+ R8 k6 K
unsigned char dai;
2 d/ B4 K( \" x3 \unsigned char cache;1 l7 t6 R: s/ p* J# {7 i
for(dai=0;dai<8;dai++)
& S' e' j/ T- ]" Y% f S8 [ d3 p{! F! P: H* E% _/ r$ _
cache = (_data & 0x80)>>7;* v+ \6 r" E+ M
if(cache)
6 X: [* r5 v6 nSbi_SDI();# d' g0 v# `1 b% m
else
( A. I _4 V$ N% wCbi_SDI();7 m5 E3 j5 J1 L! O7 C" Z
Send_CKI();
6 z4 r# e7 t; d* y+ J! R_data <<= 1;
" \' |5 x7 u5 Z) I1 t3 }7 f$ h5 Z}
* a: ^( B7 x& E}
) |$ R( S R( F7 x M/ ]void Write_WS2801_ColorData(unsigned char *pd)7 w1 l" q3 K' W* X/ e) U! ~3 M: T
{3 J5 E; J1 _8 n4 d! e) {
unsigned char LEDMax = 0; // LED 最大数量
% y, D6 ~* V) m; k4 |+ K+ o; x) Z( dCbi_CKI();
' w, M+ z; X! ]+ ?Cbi_SDI();2 z& Z8 {( _! M+ z( C% w5 [9 j0 y
_delay_us(250);
, Q5 V! `: D7 B1 {_delay_us(250);& R" K( Y8 b. i; G7 }
for(LEDMax = 0;LEDMax<27;LEDMax++)
+ S/ j+ y/ P4 V4 J2 m& x{( ?8 e; i' S' a3 l& P3 ^3 F
//Write_WS2801_Data(Red);9 X: ~; {" p: |; A
//Write_WS2801_Data(Green);
1 h5 N D2 s' [% j//Write_WS2801_Data(Blue);& O) w& O; g+ Z p! R
Write_WS2801_Data(*pd);* S W& i' F! h+ H. b! I
pd++;. n# c) c, }5 m$ W0 @
}
2 {( U: D: L* x6 V4 ^/ F} |
|