Hallo Allerseits,
Ich habe mir ein 8X8-Modul mit MAXIM7219 gekauft und an einen uno r3 angeschlossen.
den folgenden Sketch habe ich aus dem Internet und selbst ein wenig angepasst:
/**********************
* C O N S T A N T S *
**********************/
// Register
const byte NO_OP = 0x00;
const byte DECODE_MODE = 0x09;
const byte INTENSITY = 0x0a;
const byte SCAN_LIMIT = 0x0b;
const byte SHUTDOWN = 0x0c;
const byte DISPLAY_TEST = 0x0f;
/***************************
* D E C L A R A T I O N S *
***************************/
// PIN 2 : CLK (Clock)
int clkPin;
// PIN 3 : LOAD
int loadPin;
// PIN 4 : DIN (Data)
int dataPin;
// PIN 13 : monitor
int outPin;
// number of digits / lines (+ 1)
byte digits;
// line
byte line;
// column
byte column;
/***********************
* P R O C E D U R E S *
***********************/
// send data
void send16Bit(word data)
{
// Mask for single bit
// start with MSB
// 1000 0000 0000 0000
word mask = 0x8000;
// for each bit
do
{
digitalWrite(clkPin, LOW);
if((data & mask) > 0)
digitalWrite(dataPin, HIGH);
else
digitalWrite(dataPin, LOW);
digitalWrite(clkPin, HIGH);
// shift one bit
mask = mask >> 1;
}while(mask > 0);
}
// Command register and data
void sendCommand(byte address, byte data)
{
// load to 1 for sending
digitalWrite(loadPin, 1 );
// send
send16Bit((address<<8) | data);
// load to 0 for latch
digitalWrite(loadPin, 0);
}
// test display
void testDisplay(boolean test)
{
if(test)
sendCommand(DISPLAY_TEST, 1);
else
sendCommand(DISPLAY_TEST, 0);
}
// all off
void clearDisplay()
{
// all lines
sendCommand(SCAN_LIMIT, 7);
for(int line=1; line<=8; ++line)
{
sendCommand(line, 0);
}
// reset scan limit
sendCommand(SCAN_LIMIT, digits);
}
// brightness
// 0 .. 15
void setBrightness(byte value)
{
sendCommand(INTENSITY, value);
}
// switch LED in line and col
void switchLED(byte line, byte column, boolean on)
{
if(on)
sendCommand(line, 1<<column);
else
sendCommand(line, 0);
}
/***********************
* I N I T I A L I Z E *
***********************/
void setup()
{
// Clock
clkPin = 2;
pinMode(clkPin, OUTPUT);
// Load
loadPin = 3;
pinMode(loadPin, OUTPUT);
// Data
dataPin = 4;
pinMode(dataPin, OUTPUT);
outPin = 13;
pinMode(outPin, OUTPUT);
// number of digits / lines (+ 1)
digits = 7;
sendCommand(SHUTDOWN, 1);
// clear all LED's
clearDisplay();
// set number of digits / lines
sendCommand(SCAN_LIMIT, digits);
// matrix
sendCommand(DECODE_MODE, 0);
line = 1;
column = 1;
}
// the loop routine runs over and over again forever:
void loop()
{
delay(100);
column = ++column%8;
digitalWrite(outPin, column%2);
if(column == 0)
{
switchLED(line, column, false);
++line;
if(line>8)
{
line = 1;
}
}
switchLED(line, column, true);
}
da soll dann, so als ersten einstieg eine LED durchlaufen.
Meist funktioniert es gut, aber manchmal passiert nach dem einschalten gar nichts, oder alle leuchten gleichzeitig.
Hat jemand eine Idee?
Was habe ich falsch gemacht?