32*16 RGB LED点阵32*16 RGB LED点阵
老外设计的32*16 RGB LED点阵先看看Youtube。LED置入乒乓球里,变成大屏幕了
http://www.solderlab.de/images/led-projects/modular-plasma-wall/Mainboard_Schematics.png
http://www.solderlab.de/images/led-projects/modular-plasma-wall/Segment_Schematics.png
http://www.solderlab.de/images/led-projects/modular-plasma-wall/Schema_02.jpg
http://www.solderlab.de/images/led-projects/modular-plasma-wall/Schema_03.jpg
http://www.solderlab.de/images/led-projects/modular-plasma-wall/Schema_01.jpg
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Definitions
#define number_of_gray_scale_values 4 // corresponds to 6 Gray-Scale-Levels
#define Latch 2 // PIN number on PORTC
#define Clock 1 // PIN number on PORTC
#define Enable 0 // PIN number on PORTC
#define Clear 3 // PIN number on PORTC
#define Debug 2 // PIN number on PORTB
#define Data_r_u 2 // PIN number on PORTD
#define Data_g_u 3 // PIN number on PORTD
#define Data_b_u 4 // PIN number on PORTD
#define Data_z_u 5 // PIN number on PORTD
#define Data_r_d 6 // PIN number on PORTD
#define Data_g_d 7 // PIN number on PORTD
#define Data_b_d 0 // PIN number on PORTB
#define Data_z_d 1 // PIN number on PORTB
#define Latch_Low PORTC &=~(1 << Latch)
#define Latch_High PORTC |= (1 << Latch)
#define Clock_Low PORTC &=~(1 << Clock)
#define Clock_High PORTC |= (1 << Clock)
#define Enable_Low PORTC &=~(1 << Enable)
#define Enable_High PORTC |= (1 << Enable)
#define Clear_Low PORTC &=~(1 << Clear)
#define Clear_High PORTC |= (1 << Clear)
#define Debug_Low PORTB &=~(1 << Debug)
#define Debug_High PORTB |= (1 << Debug)
#define Data_r_u_Low PORTD &=~(1 << Data_r_u)
#define Data_r_u_High PORTD |= (1 << Data_r_u)
#define Data_g_u_Low PORTD &=~(1 << Data_g_u)
#define Data_g_u_High PORTD |= (1 << Data_g_u)
#define Data_b_u_Low PORTD &=~(1 << Data_b_u)
#define Data_b_u_High PORTD |= (1 << Data_b_u)
#define Data_z_u_Low PORTD &=~(1 << Data_z_u)
#define Data_z_u_High PORTD |= (1 << Data_z_u)
#define Data_r_d_Low PORTD &=~(1 << Data_r_d)
#define Data_r_d_High PORTD |= (1 << Data_r_d)
#define Data_g_d_Low PORTD &=~(1 << Data_g_d)
#define Data_g_d_High PORTD |= (1 << Data_g_d)
#define Data_b_d_Low PORTB &=~(1 << Data_b_d)
#define Data_b_d_High PORTB |= (1 << Data_b_d)
#define Data_z_d_Low PORTB &=~(1 << Data_z_d)
#define Data_z_d_High PORTB |= (1 << Data_z_d)
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Global variables
unsigned char dispmem; //Display Memory
static unsigned char *ptr_dispmem; //Pointer to Display Memory used in ISR-Funktion
//Color-Look-Up-Table for full Color Scale --> 216 colors (6xR + 6xG + 6xB)
unsigned char LUT_r;
unsigned char LUT_g;
unsigned char LUT_b;
//Reduced Color-Look-Up-Table - Contains only Colors within the topmost Color-Cycle
unsigned char LUT_r_reduced;
unsigned char LUT_g_reduced;
unsigned char LUT_b_reduced;
//Pointers to dispmem
static unsigned char *ptr_dispmem_u;
static unsigned char *ptr_dispmem_d;
unsigned char compare_value = 0;
unsigned char row = 0;
unsigned char x = 0;
byte remote = 0;
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Initialize USART Comunication
void uart_init(void)
{
UCSR0A |= (1<<U2X0); // Double up UART
UCSR0B |= (1<<RXEN0)| (1<<TXEN0) | (1<<RXCIE0); // UART RX, TX und RX Interrupt enable
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) ; // Asynchrous 8N1
UBRR0H = 0;
UBRR0L = 16; //Baud Rate 115200 --> 2.1% Error at 16MHz
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Initialize Look Up Tables
void LUT_init(void)
{
//Full LUT with 216 colors
for (byte i = 0; i < 216; i++)
{
LUT_r = (byte)(i/36);
LUT_g = (byte)((i%36)/6);
LUT_b = i%6;
}
//Reduced LUT with 30 colors
for (byte k=0; k<5; k++)
{
LUT_r_reduced = 5; // R: 5
LUT_g_reduced = k+1; // G: 1 --> 5
LUT_b_reduced = 0; // B: 0
LUT_r_reduced = 4-k; // R: 4 --> 0
LUT_g_reduced = 5; // G: 5
LUT_b_reduced = 0; // B: 0
LUT_r_reduced = 0; // R: 0
LUT_g_reduced = 5; // G: 5
LUT_b_reduced = k+1; // B: 1 --> 5
LUT_r_reduced = 0; // R: 0
LUT_g_reduced = 4-k; // G: 4 --> 0
LUT_b_reduced = 5; // B: 5
LUT_r_reduced = k+1; // R: 1 --> 5
LUT_g_reduced = 0; // G: 0
LUT_b_reduced = 5; // B: 5
LUT_r_reduced = 5; // R: 5
LUT_g_reduced = 0; // G: 0
LUT_b_reduced = 4-k; // B: 4 --> 0
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Interrupt Service Function which is called everytime a byte is recieved
ISR(USART_RX_vect)
{
unsigned char b;
b=UDR0;
if (b == 255) {ptr_dispmem = dispmem;}
else
{
*ptr_dispmem = b;
ptr_dispmem++;
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Refresh Function - refreshes one ROW each time called (time apprx. 175 猀)
void refresh_leds(void)
{
unsigned char temp_u;
unsigned char temp_d;
//Clear Latch
Latch_Low;
for (x = 0; x < 32; x++)
{
//Clear Clock in advance
Clock_Low;
//Clear all Data Outputs in advance
PORTD &=B00000011;
PORTB &=B11111100;
//Copy current color value only once from dispmem
temp_u = *ptr_dispmem_u;
temp_d = *ptr_dispmem_d;
//Set Data Outputs if necessary
if (LUT_r > compare_value) {Data_r_u_High;}
if (LUT_g > compare_value) {Data_g_u_High;}
if (LUT_b > compare_value) {Data_b_u_High;}
if (LUT_r > compare_value) {Data_r_d_High;}
if (LUT_g > compare_value) {Data_g_d_High;}
if (LUT_b > compare_value) {Data_b_d_High;}
if ((x == row) || (x == row + 8) || (x == row + 16) || (x == row + 24)) {Data_z_u_High; Data_z_d_High;}
if (row == 8) {Data_z_u_Low; Data_z_d_Low;}
//Set Clock and thus shift out current bits
Clock_High;
//Increment Pointers
ptr_dispmem_u++;
ptr_dispmem_d++;
}
//Set Latch
Latch_High;
//Row is done --> Increment Row Number
row++;
//If Frame is done
if (row == 9)
{
row = 0;
ptr_dispmem_u = dispmem;
ptr_dispmem_d = dispmem + 256;
compare_value++;
if (compare_value > number_of_gray_scale_values) {compare_value = 0;}
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Does the same as the refresh-funcition above but with the reduced color LUT
void refresh_leds_with_reduced_colors(void)
{
unsigned char temp_u;
unsigned char temp_d;
//Clear Latch
Latch_Low;
for (x = 0; x < 32; x++)
{
//Clear Clock in advance
Clock_Low;
//Clear all Data Outputs in advance
PORTD &=B00000011;
PORTB &=B11111100;
//Copy current color value only once from dispmem
temp_u = *ptr_dispmem_u;
temp_d = *ptr_dispmem_d;
//Set Data Outputs if necessary
if (LUT_r_reduced > compare_value) {Data_r_u_High;}
if (LUT_g_reduced > compare_value) {Data_g_u_High;}
if (LUT_b_reduced > compare_value) {Data_b_u_High;}
if (LUT_r_reduced > compare_value) {Data_r_d_High;}
if (LUT_g_reduced > compare_value) {Data_g_d_High;}
if (LUT_b_reduced > compare_value) {Data_b_d_High;}
if ((x == row) || (x == row + 8) || (x == row + 16) || (x == row + 24)) {Data_z_u_High; Data_z_d_High;}
if (row == 8) {Data_z_u_Low; Data_z_d_Low;}
//Set Clock and thus shift out current bits
Clock_High;
//Increment Pointers
ptr_dispmem_u++;
ptr_dispmem_d++;
}
//Set Latch
Latch_High;
//Row is done --> Increment Row Number
row++;
//If Frame is done
if (row > 8)
{
row = 0;
ptr_dispmem_u = dispmem;
ptr_dispmem_d = dispmem + 256;
compare_value++;
if (compare_value > number_of_gray_scale_values) {compare_value = 0;}
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Setup Function called once at the beginning
void setup()
{
//Set PINs as OUTPUTs
DDRD = DDRD | B11111100;
DDRB = DDRB | B00000111;
DDRC = DDRC | B00001111;
//Set Select_Button_Pin as Input
pinMode(19, INPUT);
delay(10);
if (digitalRead(19)) {remote = 1;}
Debug_High;
delay(50);
Debug_Low;
Enable_Low;
Clear_High;
for (int i=0; i<512; i++){dispmem=0;}
uart_init();
LUT_init();
ptr_dispmem = dispmem;
ptr_dispmem_u = dispmem;
ptr_dispmem_d = dispmem + 256;
sei();
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Loop Function called over and over again
void loop()
{
if (remote == 1)
{
refresh_leds();
}
else
{
byte do_plasma = random(100);
//Plasma should be the most significant secence on the wall cause this is what it was made for, so 50% seems a fair number
if (do_plasma < 50)
{
plasma(random(5,40),random(25, 050));
}
//if sequence is not plasma than its randomly choosen from a repertoir
else
{
byte sequence = random(4);
byte duration = random(5,40); //How long the sequence should last
byte frame_time = random(60,100); //Speed of the sequence
switch (sequence)
{
case 0: falling_points(duration, frame_time); break;
case 1:random_points(duration, frame_time); break;
case 2: pong(duration, frame_time); break;
case 3: boxes(duration, frame_time); break;
}
}
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
//Sequences//
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
void plasma (unsigned long duration, unsigned long frame_time)
{
//Variables
unsigned long end_time = millis() + (duration * 1000);
byte pixel_size_x = random(2,7);
byte pixel_size_y = random(2,7);
//Pointer to frame
static unsigned char *ptr_frame;
//Calculate Plasma Geometry only ONCE
for(byte y = 0; y < 16;y++)
{
for(byte x = 0; x < 32; x++)
{
dispmem = (byte) ((15+15*(sin(((float)x)/pixel_size_x)) + 15+15*(sin(((float)y)/pixel_size_y))) / 2);
}
}
do
{
ptr_frame = dispmem;
for (byte y = 0; y < 16; y++)
{
for (byte x = 0; x < 32; x++)
{
if (*ptr_frame == 29) {*ptr_frame = 0;} else {*ptr_frame = *ptr_frame + 1;}
ptr_frame++;
}
}
unsigned long frame_end_time = millis() + frame_time;
Enable_Low;
while (frame_end_time > millis())
{
for (byte x=0; x<8; x++){refresh_leds_with_reduced_colors();}
}
Enable_High;
} while (millis() <= end_time);
//At the end of the plasma sequence fade all LEDs smoothly to red
frame_time = 80;
for (byte c=0; c < 30; c++)
{
ptr_frame = dispmem;
for (byte y = 0; y < 16; y++)
{
for (byte x = 0; x < 32; x++)
{
if (*ptr_frame < 29) {*ptr_frame = *ptr_frame + 1;}
ptr_frame++;
}
}
unsigned long frame_end_time = millis() + frame_time;
Enable_Low;
while (frame_end_time > millis())
{
for (byte x=0; x<8; x++){refresh_leds_with_reduced_colors();}
}
Enable_High;
}
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
void falling_points (unsigned long duration, unsigned long frame_time)
{
//Variables
unsigned long end_time = millis() + (duration * 1000);
//Clear Dispmem first
for (byte y = 0; y < 16; y++)
{
for (byte x = 0; x < 32; x++)
{
dispmem = 0;
}
}
do
{
for (byte y = 15; y > 0; y--)
{
for (byte x = 0; x < 32; x++)
{
dispmem = dispmem[(y-1)*32+x];
}
}
for (byte i=0; i<32; i++) {dispmem = 0;}
byte dummy = random(100);
if (dummy <= 20) {dummy =0;}
if (dummy >20) {dummy =3;}
if (dummy >30) {dummy =2;}
if (dummy >40) {dummy =5;}
if (dummy >50) {dummy =6;}
if (dummy >60) {dummy =7;}
if (dummy >70) {dummy =8;}
if (dummy >80) {dummy =9;}
if (dummy >90) {dummy = 10;}
for (byte i=0; i < dummy; i++)
{
dispmem = random(216);
}
unsigned long frame_end_time = millis() + frame_time;
Enable_Low;
while (frame_end_time > millis())
{
for (byte x=0; x<8; x++){refresh_leds();}
}
Enable_High;
} while (millis() <= end_time);
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
void pong (unsigned long duration, unsigned long frame_time)
{
//Variables
unsigned long end_time = millis() + (duration * 1000);
//Pointer to frame
static unsigned char *ptr_frame;
byte pos_x;
byte pos_y;
byte dir_x;
byte dir_y;
byte color;
for (byte i=0; i<7; i++)
{
pos_x=random(1,31);
pos_y=random(1,15);
dir_x=random(2);
dir_y=random(2);
color=random(215);
}
do
{
ptr_frame = dispmem;
//clear matrix
for (byte y = 0; y < 16; y++)
{
for (byte x = 0; x < 32; x++)
{
*ptr_frame = 0;
ptr_frame++;
}
}
for (byte i=0; i<7; i++)
{
if (dir_x == 1){pos_x++;} else {pos_x--;}
if (dir_y == 1){pos_y++;} else {pos_y--;}
if (pos_x == 31) {dir_x = 0;}
if (pos_y == 15) {dir_y = 0;}
if (pos_x ==0) {dir_x = 1;}
if (pos_y ==0) {dir_y = 1;}
dispmem*32+pos_x] = color;
}
unsigned long frame_end_time = millis() + frame_time;
Enable_Low;
while (frame_end_time > millis())
{
for (byte x=0; x<8; x++){refresh_leds();}
}
Enable_High;
} while (millis() <= end_time);
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
void random_points (unsigned long duration, unsigned long frame_time)
{
//Variables
unsigned long end_time = millis() + (duration * 1000);
byte number_of_points = random(5,20);
byte color_of_points;
//Pointer to frame
static unsigned char *ptr_frame;
for (byte i=0; i < number_of_points; i++)
{
color_of_points = random(216);
}
//Animate Points
do
{
ptr_frame = dispmem;
//clear matrix
for (byte y = 0; y < 16; y++)
{
for (byte x = 0; x < 32; x++)
{
*ptr_frame = 0;
ptr_frame++;
}
}
for (byte i=0; i < number_of_points; i++)
{
ptr_frame = dispmem + random(512);
*ptr_frame = color_of_points;
}
unsigned long frame_end_time = millis() + frame_time;
Enable_Low;
while (frame_end_time > millis())
{
for (byte x=0; x<8; x++){refresh_leds();}
}
Enable_High;
} while (millis() <= end_time);
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
void boxes (unsigned long duration, unsigned long frame_time)
{
//Variables
unsigned long end_time = millis() + (duration * 1000);
//Pointer to frame
static unsigned char *ptr_frame;
byte pos[] = {0,2,4,6,8,10,12,10};
byte dir[] = {1,1,1,1,1,1,0,0};
byte color[] = {180,210,30,35,5,185,180,210};
do
{
ptr_frame = dispmem;
//clear matrix
for (byte y = 0; y < 16; y++)
{
for (byte x = 0; x < 32; x++)
{
*ptr_frame = 0;
ptr_frame++;
}
}
for (byte i=0; i<8; i++)
{
if (dir ==1) {pos++;} else {pos--;}
if (pos == 12) {dir = 0;}
if (pos ==0) {dir = 1;}
dispmem[(pos+0)*32+4*i+0] = color;
dispmem[(pos+0)*32+4*i+1] = color;
dispmem[(pos+0)*32+4*i+2] = color;
dispmem[(pos+0)*32+4*i+3] = color;
dispmem[(pos+1)*32+4*i+0] = color;
dispmem[(pos+1)*32+4*i+1] = color;
dispmem[(pos+1)*32+4*i+2] = color;
dispmem[(pos+1)*32+4*i+3] = color;
dispmem[(pos+2)*32+4*i+0] = color;
dispmem[(pos+2)*32+4*i+1] = color;
dispmem[(pos+2)*32+4*i+2] = color;
dispmem[(pos+2)*32+4*i+3] = color;
dispmem[(pos+3)*32+4*i+0] = color;
dispmem[(pos+3)*32+4*i+1] = color;
dispmem[(pos+3)*32+4*i+2] = color;
dispmem[(pos+3)*32+4*i+3] = color;
}
unsigned long frame_end_time = millis() + frame_time;
Enable_Low;
while (frame_end_time > millis())
{
for (byte x=0; x<8; x++){refresh_leds();}
}
Enable_High;
} while (millis() <= end_time);
}
/*-------------------------------------------------------------------------------------------------------------------------------------------*/
还得翻墙。。。 ro0t 发表于 2013-6-13 09:52 static/image/common/back.gif
还得翻墙。。。
用web freer浏览器自带代理服务器 这次大家不用费心找这个教程了,例程都有了。。。。 ro0t 发表于 2013-6-13 09:52 static/image/common/back.gif
还得翻墙。。。
我是马来西亚人。为何要翻墙? interrgned 发表于 2013-6-13 19:01 static/image/common/back.gif
用web freer浏览器自带代理服务器
谢谢我学习一下 smching 发表于 2013-6-13 22:43 static/image/common/back.gif
我是马来西亚人。为何要翻墙?
我在中国大陆。。。。。 他这是,三色点阵,每个595控制一种颜色,另一个595控制行,那是不是说列全部都接地了
还有,这个如何改成单色点阵的程序呢?最近刚好在研究这个 是的,全部列都得通过NPN晶体管接地,但並非同时接通,而是经过扫描方式接通。 糯米基 发表于 2013-6-14 14:26 static/image/common/back.gif
他这是,三色点阵,每个595控制一种颜色,另一个595控制行,那是不是说列全部都接地了
还有,这个如何改成 ...
我只找到8x8和48x8单色点阵
8x8单色点阵
http://playground.arduino.cc/uploads/Main/Matrix.gif
/*
* _8x8 LED matrix
*
* (c) 2009 BlushingBoy.net
*/
#include "TimerOne.h"
byte rows = {9, 14, 8, 12, 1, 7, 2, 5};
byte cols = {13, 3, 4, 10, 6, 11, 15, 16};
byte pins = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
byte screen = {0, 0, 0, 0, 0, 0, 0, 0};
volatile byte screenRow = 0;
volatile byte screenCol = 0;
void setup() {
Timer1.initialize(100);
for (int i = 2; i <= 17; i++)
pinMode(i, OUTPUT);
Timer1.attachInterrupt(doubleBuffer);
}
// interrupt routine
void doubleBuffer() {
// reset the previous iteration
digitalWrite(translatePin(rows), HIGH); // set previous off
digitalWrite(translatePin(cols), LOW);// set previous off
// go to the next iteration...
// go to the next screenCol, wrap if necessary
screenCol++;
if (screenCol >= 8) {
screenCol = 0;
// when screenCol wraps, go to the next screenRow, wrap if necessary
screenRow++;
if (screenRow >= 8) {
screenRow = 0;
}
}
// set this iteration
if((screen>>screenCol)&B1 == B1) {
digitalWrite(translatePin(rows), LOW);// set this on
digitalWrite(translatePin(cols), HIGH); // set this on
} else {
digitalWrite(translatePin(rows), HIGH); // set this off
digitalWrite(translatePin(cols), LOW);// set this off
}
}
byte translatePin(byte original) {
return pins;
}
void allOFF() {
for (int i = 0; i < 8; i++)
screen=0;
}
void on(byte row, byte column) {
screen |= (B1<<(row-1));
}
void off(byte row, byte column) {
screen &= ~(B1<<(row-1));
}
// looping some LEDs routine
void loop() {
allOFF();
delay(1000);
on(3,3); on(3,4); on(3,5); on(3,6);
delay(400);
allOFF();
delay(1000);
on(4,4);
delay(400);
}
8x48单色点阵
http://www.instructables.com/files/deriv/FX8/LXF6/HFPTEZIF/FX8LXF6HFPTEZIF.LARGE.jpg
http://www.instructables.com/files/deriv/FJN/C5OP/HFPTEZIP/FJNC5OPHFPTEZIP.LARGE.jpg
http://www.instructables.com/files/deriv/FV9/F39W/HFPTEZJ8/FV9F39WHFPTEZJ8.LARGE.jpg
int x;
int y;
int latchPin1 = 5; //Arduino pin connected to blue 12 RCLK of 74HC595
int clockPin1 = 6; //Arduino pin connected to green 11 SRCLK of 74HC595
int dataPin1 = 7;//Arduino pin connected to violet 14 SER of 74HC595
//-- Rows (Positive Anodes) --
int latchPin2 = 9; //Arduino pin connected to yellow Latch 12 RCLK of 74HC595
int clockPin2 = 10; //Arduino pin connected to white Clock 11 SRCLK of 74HC595
int dataPin2 = 8;//Arduino pin connected to grey Data 14 SER of 74HC595
//=== B I T M A P ===
//Bits in this array represents one LED of the matrix
// 8 is # of rows, 7 is # of LED matrix we have
byte bitmap; // Change the 7 to however many matrices you want to use.
int numZones = sizeof(bitmap) / 8;
int maxZoneIndex = numZones-1;
int numCols = numZones * 8;
byte alphabets[] = {
{0,0,0,0,0},
{31, 36, 68, 36, 31},
{127, 73, 73, 73, 54},
{62, 65, 65, 65, 34},
{127, 65, 65, 34, 28},
{127, 73, 73, 65, 65},
{127, 72, 72, 72, 64},
{62, 65, 65, 69, 38},
{127, 8, 8, 8, 127},
{0, 65, 127, 65, 0},
{2, 1, 1, 1, 126},
{127, 8, 20, 34, 65},
{127, 1, 1, 1, 1},
{127, 32, 16, 32, 127},
{127, 32, 16, 8, 127},
{62, 65, 65, 65, 62},
{127, 72, 72, 72, 48},
{62, 65, 69, 66, 61},
{127, 72, 76, 74, 49},
{50, 73, 73, 73, 38},
{64, 64, 127, 64, 64},
{126, 1, 1, 1, 126},
{124, 2, 1, 2, 124},
{126, 1, 6, 1, 126},
{99, 20, 8, 20, 99},
{96, 16, 15, 16, 96},
{67, 69, 73, 81, 97},
};
//=== S E T U P ===
void setup() {
pinMode(latchPin1, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(dataPin1, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
//-- Clear bitmap --
for (int row = 0; row > 8; row++) {
for (int zone = 0; zone <= maxZoneIndex; zone++) {
bitmap = 0;
}
}
}
//=== F U N C T I O N S ===
// This routine takes whatever we've setup in the bitmap array and display it on the matrix
void RefreshDisplay()
{
for (int row = 0; row < 8; row++) {
int rowbit = 1 << row;
digitalWrite(latchPin2, LOW);//Hold latchPin LOW for as long as we're transmitting data
shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit); //Transmit data
//-- Start sending column bytes --
digitalWrite(latchPin1, LOW);//Hold latchPin LOW for as long as we're transmitting data
//-- Shift out to each matrix (zone is 8 columns represented by one matrix)
for (int zone = maxZoneIndex; zone >= 0; zone--) {
shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap);
}
//-- Done sending Column bytes, flip both latches at once to eliminate flicker
digitalWrite(latchPin1, HIGH
digitalWrite(latchPin2, HIGH
//-- Wait a little bit to let humans see what we've pushed out onto the matrix --
delayMicroseconds(500);
}
}
// Converts row and colum to actual bitmap bit and turn it off/on
void Plot(int col, int row, bool isOn)
{
int zone = col / 8;
int colBitIndex = x % 8;
byte colBit = 1 << colBitIndex;
if (isOn)
bitmap =bitmap | colBit;
else
bitmap =bitmap & (~colBit);
}
// Plot each character of the message one column at a time, updated the display, shift bitmap left.
void AlphabetSoup()
{
char msg[] = "YOUR TEXT ";
for (int charIndex=0; charIndex < (sizeof(msg)-1); charIndex++)
{
int alphabetIndex = msg - '@';
if (alphabetIndex < 0) alphabetIndex=0;
//-- Draw one character of the message --
for (int col = 0; col < 6; col++)
{
for (int row = 0; row < 8; row++)
{
bool isOn = 0;
if (col<5) isOn = bitRead( alphabets, 7-row ) == 1;
Plot( numCols-1, row, isOn
}
//-- The more times you repeat this loop, the slower we would scroll --
for (int refreshCount=0; refreshCount < 7; refreshCount++) //changethis value to vary speed
RefreshDisplay();
//-- Shift the bitmap one column to left --
for (int row=0; row<8; row++)
{
for (int zone=0; zone < numZones; zone++)
{
bitmap = bitmap >> 1;
// Roll over lowest bit from the next zone as highest bit of this zone.
if (zone < maxZoneIndex) bitWrite(bitmap, 7,
bitRead(bitmap,0));
}
}
}
}
}
//=== L O O P ===
void loop() {
AlphabetSoup();
}
楼主,我对那个32*8的例子很感兴趣,能否给出这个教程的链接,先谢谢了 糯米基 发表于 2013-6-16 08:23 static/image/common/back.gif
楼主,我对那个32*8的例子很感兴趣,能否给出这个教程的链接,先谢谢了
不是已经有链接了吗。一开始就是了。
没关係,这里再放一次。
http://www.solderlab.de/index.php/led-projects/modular-plasma-wall 糯米基 发表于 2013-6-16 08:23 static/image/common/back.gif
楼主,我对那个32*8的例子很感兴趣,能否给出这个教程的链接,先谢谢了
除了32*8,在他们的网站里还有一个12*8 RGB矩阵
http://www.solderlab.de/index.php/led-projects/rgb-matrix-12x8
我已经改成8*8,且每粒LED更换成两尺的LED Strip。总共用了64条LED Strip,安置在墙上。
data:image/jpeg;base64,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
页:
[1]