-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLedDriverDefault.cpp
150 lines (131 loc) · 4.03 KB
/
LedDriverDefault.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/**
* LedDriverDefault.cpp
* Implementierung auf der Basis 74HC595 und UDN2981A.
*
* @mc Arduino/RBBB
* @autor Christian Aschoff / caschoff _AT_ mac _DOT_ com
* @version 1.2
* @created 18.1.2013
* @updated 18.8.2013
*
* Versionshistorie:
* V 1.0: - Erstellt.
* V 1.1: - printSignature() eingefuehrt.
* - Benennung verbessert.
* V 1.2: - Anpassung Helligkeit 0-100%
*/
#include "LedDriverDefault.h"
// #define DEBUG
#include "Debug.h"
#include "Configuration.h"
// Hilfsvariable, um das Display auf den Kopf zu stellen
#ifdef UPSIDE_DOWN
#define DISPLAY_SHIFT 9-
#else
#define DISPLAY_SHIFT 0+
#endif
/**
* Initialisierung.
*
* @param data Pin, an dem die Data-Line haengt.
* @param clock Pin, an dem die Clock-Line haengt.
* @param latch Pin, an dem die Latch-Line haengt.
* @param outputEnable Pin, an dem OutputEnable haengt.
* @param linesToWrite Wieviel Zeilen muessen aus dem Bildspeicher uebernommen werden?
*/
LedDriverDefault::LedDriverDefault(byte data, byte clock, byte latch, byte outputEnable, byte linesToWrite) {
_shiftRegister = new ShiftRegister(data, clock, latch);
_outputEnablePin = outputEnable;
pinMode(_outputEnablePin, OUTPUT);
digitalWrite(_outputEnablePin, HIGH);
_linesToWrite = linesToWrite;
}
/**
* init() wird im Hauptprogramm in init() aufgerufen.
* Hier sollten die LED-Treiber in eine definierten
* Ausgangszustand gebracht werden.
*/
void LedDriverDefault::init() {
}
void LedDriverDefault::printSignature() {
Serial.println(F("Default - 74HC595"));
}
/**
* Den Bildschirm-Puffer auf die LED-Matrix schreiben.
*
* @param onChange: TRUE, wenn es Aenderungen in dem Bildschirm-Puffer gab,
* FALSE, wenn es ein Refresh-Aufruf war.
*/
void LedDriverDefault::writeScreenBufferToMatrix(word matrix[16], boolean onChange) {
word row = 1;
// Jetzt die Daten...
// wir brauchen keine 16, 10 wuerden reichen... dann gehen aber nicht
// mehr alle Modi! Also via Variable, die im Modus-Wechsel geaendert wird...
for (byte k = 0; k < _linesToWrite; k++) {
#ifdef SKIP_BLANK_LINES
if(matrix[DISPLAY_SHIFT k] != 0) {
#endif
// Zeile einschalten...
_shiftRegister->prepareShiftregisterWrite();
_shiftRegister->shiftOut(~matrix[DISPLAY_SHIFT k]);
_shiftRegister->shiftOut(row);
_shiftRegister->finishShiftregisterWrite();
// hier kann man versuchen, das Taktverhaeltnis zu aendern (Anzeit)...
// delayMicroseconds mit Werten <= 3 macht Probleme...
if(_brightness > 3) {
delayMicroseconds(_brightness*PWM_DURATION);
}
// Zeile ausschalten (einfach ganze Matrix gegenlaeufig schalten)...
_shiftRegister->prepareShiftregisterWrite();
_shiftRegister->shiftOut(65535);
_shiftRegister->shiftOut(0);
_shiftRegister->finishShiftregisterWrite();
// hier kann man versuchen, das Taktverhaeltnis zu aendern (Auszeit)...
// delayMicroseconds mit Werten <= 3 macht Probleme...
if(_brightness < 97) {
delayMicroseconds((100-_brightness)*PWM_DURATION);
}
#ifdef SKIP_BLANK_LINES
}
#endif
row = row << 1;
}
}
/**
* Die Helligkeit des Displays anpassen.
*
* @param brightnessInPercent Die Helligkeit.
*/
void LedDriverDefault::setBrightness(unsigned int brightness) {
_brightness = brightness;
}
/**
* Anpassung der Groesse des Bildspeichers.
*
* @param linesToWrite Wieviel Zeilen aus dem Bildspeicher sollen
* geschrieben werden?
*/
void LedDriverDefault::setLinesToWrite(byte linesToWrite) {
_linesToWrite = linesToWrite;
}
/**
* Das Display ausschalten.
*/
void LedDriverDefault::shutDown() {
digitalWrite(_outputEnablePin, HIGH);
}
/**
* Das Display einschalten.
*/
void LedDriverDefault::wakeUp() {
digitalWrite(_outputEnablePin, LOW);
}
/**
* Den Dateninhalt des LED-Treibers loeschen.
*/
void LedDriverDefault::clearData() {
_shiftRegister->prepareShiftregisterWrite();
_shiftRegister->shiftOut(65535);
_shiftRegister->shiftOut(0);
_shiftRegister->finishShiftregisterWrite();
}