|
AVR的RGB彩灯控制芯片WS2801的控制程序. X0 [4 n5 S7 K; x, R
& Z4 j; q C* X. @- S5 D5 o6 m
#include"color.h"
# v/ j* _% E4 G0 j- B6 P#include"delay.h"
! i9 g4 {% X* q// 0.18084us1 _) N v a% X6 L/ ~! b
void Sbi_SDI() C8 l$ o! R3 d8 N, W
{
4 m* ~: ^- ~5 u- D- s- }sbi(PORTC,1);
& u6 A; \9 x1 m4 F! _# M7 W6 i}* z. \5 p5 `2 A: {: b7 f
void Cbi_SDI()
1 x' @% a; _. O9 B) h{
. {+ a1 n( b% ~) f% e) t' Q5 Jcbi(PORTC,1);( E! J, }6 ?* j) j
}
$ n& O' J/ L; q$ rvoid Sbi_CKI()
* M( K3 e. Q8 U; i{
* I& g. W5 R5 ?+ D# [2 H% x }sbi(PORTC,0);
/ }( y. g: s- l# G}$ i7 Z6 C6 y3 U- N
void Cbi_CKI()% H1 I: y) ]0 g
{
1 n' x# h Q" O" y: z0 p1 Jcbi(PORTC,0);% {4 H% F: N+ g A0 t* J0 J
}
8 `1 B0 c" W0 E5 x |$ Ovoid Send_CKI() //WS2801 上升沿; {# G7 z2 j( ?, q& \
{
4 N2 l, a- J4 T- k. `" S8 P' T+ l* t" dCbi_CKI(); // 时钟 拉低 ]- p. s0 F( V/ |
_delay_us(6);
1 d1 l1 o. r( R+ n- v) oSbi_CKI(); // 时钟 拉高
; D. C/ U% V/ k& v- |$ y% r_delay_us(6);5 b9 N2 |7 @+ X: ?; A: B
Cbi_CKI(); // 时钟 拉低 T% }1 @, | z0 S7 h3 v, ^! v
}4 Y7 t* u' D/ W5 a) A
void Write_WS2801_Data(unsigned char _data) //WS2801
0 x9 x9 E8 G8 j& P5 s7 k. B# B{
$ A2 X9 d/ `, C9 a' J; tunsigned char dai;
! i* `, t8 t1 I4 D" X) o& _* Aunsigned char cache;3 D8 _2 w4 P4 K
for(dai=0;dai<8;dai++)
% \; P. ~, l3 l) e" Z{. t# ^# t: u3 E5 j p$ ], T" }
cache = (_data & 0x80)>>7;
- w. B+ _# U* q0 Fif(cache)
: g8 M4 H, A+ S( ~/ N0 tSbi_SDI();
; \$ M! e# _) M) b9 Y# Delse
( e5 Y8 j. o3 c: ICbi_SDI();& c. u, D G+ b# |# f5 D
Send_CKI();
: P& b6 V+ ]3 l7 R( K3 __data <<= 1;) s! @0 H( |: V9 t, W
}
% ]! b" Y6 q% ~5 m9 N: L' t7 G}
( W. d# p$ \ D: I2 y- v4 gvoid Write_WS2801_ColorData(unsigned char *pd)
, ?; a; A$ q. z# b7 `2 S) r{
1 d: f6 C2 v! n6 h8 T' Q7 v% [. kunsigned char LEDMax = 0; // LED 最大数量
( l0 a: n, F( H4 i* u$ J! RCbi_CKI();. D; i% w/ @ W% B5 I0 q
Cbi_SDI();
& q: [/ K/ k4 @_delay_us(250);% U' w9 d/ r+ D7 ?! b( z' g
_delay_us(250);" U7 o6 {: S* O8 l2 }
for(LEDMax = 0;LEDMax<27;LEDMax++); z8 R8 o, c4 U- W2 l5 J+ c
{; r) W. X9 }5 b# P+ j+ \
//Write_WS2801_Data(Red);
. B0 {4 V4 m" {0 U4 @//Write_WS2801_Data(Green);, A. v+ C' b% R% A( d" Q/ t
//Write_WS2801_Data(Blue);. ~! y* F( G7 u( ?
Write_WS2801_Data(*pd);+ O9 O5 r$ s" | j
pd++;) H- x: Z. I: p5 [
}
7 u: K9 P* @" A1 `) ]} |
|