This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| de:examples:display:segment_display [2011/08/20 15:25] – wittkoepper | de:examples:display:segment_display [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== 7-Segment-LED-Anzeige ====== | ||
| + | // | ||
| + | |||
| + | ===== Theorie ===== | ||
| + | |||
| + | Die 7-Segment-LED-Zifferanzeige ist ein Display, welches aus sieben, in Form einer Acht angeordneten, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Elektrisch werden alle Anoden der LEDs an einer Anode am Pin //ca// angeschlossen. Die LEDs leuchten durch Schalten ihrer Kathoden (//a, b, c ...//). Es gibt auch andere Verbindungen, | ||
| + | |||
| + | LED number-indicators are easy to use, they can be controlled directly from the pins of the microcontroller, | ||
| + | |||
| + | Die Benutzung von LED Zifferanzeigen ist recht einfach. Sie können direkt über die Pins des Mikrocontrollers kontrolliert werden. Es gibt jedoch auch spezielle Treiber, die dafür sorgen, dass für die Nutzung der Anzeige weniger Pins des Mikrocontrollers benötigt werden. Es gibt zwei verschiedene Farben von LED-Zifferanzeigen, | ||
| + | |||
| + | ===== Übung ===== | ||
| + | |||
| + | Am digitalen I/O Modul befindet sich eine 7-Segment-LED-Zifferanzeige. Sie wird über einen Treiber mit der seriellen Schnittstelle A6275 kontrolliert. Die serielle Schnittstelle des Treibers ist dem SPI ähnlich, bei dem sowohl Taktsignal als auch Datensignale genutzt werden. Anders als beim SPI wird // | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | * Latch-Signal (//latch//) - PG2 | ||
| + | * Taktsignal (//clock//) - PC7 | ||
| + | * Datensignal (//data//) - PC6 | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | Die Daten werden in Form von Bits über den Datenpin gesendet. Immer, wenn das Taktsignal high wird, wird der Inhalt des Verschiebungsindexes nach rechts geschoben und das Bit vom Datenpin wird in die Zelle ganz links gelesen. So werden 8 Bits in den Verschiebungsindex geladen. Wenn das Latch-Signal high gesetzt wird, wird der Wert des Verschiebungsindexes in den Latch-Index geladen, und verbleibt dort bis zu einem erneuten Laden. Jedes Bit des Latch-Indexes ist durch eine Spannungsschaltung mit einem Segment der Zifferanzeige verbunden. Das Segment leuchtet während die Bitrate high ist. | ||
| + | |||
| + | Zur Darstellung von Ziffern auf der digitalen I/O Modulanzeige des HomeLab sind die folgenden Funktionen in der Bibliothek von HomeLab enthalten: | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Einrichtung der Pins | ||
| + | // | ||
| + | static pin segment_display_latch = PIN(G, 2); | ||
| + | static pin segment_display_data_out = PIN(C, 6); | ||
| + | static pin segment_display_clock = PIN(C, 7); | ||
| + | |||
| + | // | ||
| + | // Markierung der Karte. | ||
| + | // Die Bits markieren Segmente. Ein niedriger Rang wird mit A, ein hoher mit DP gekennzeichnet. | ||
| + | // | ||
| + | static const unsigned char segment_char_map[11] = | ||
| + | { | ||
| + | 0b00111111, | ||
| + | 0b00000110, | ||
| + | 0b01011011, | ||
| + | 0b01001111, | ||
| + | 0b01100110, | ||
| + | 0b01101101, | ||
| + | 0b01111100, | ||
| + | 0b00000111, | ||
| + | 0b01111111, | ||
| + | 0b01100111, | ||
| + | 0b01111001 | ||
| + | }; | ||
| + | |||
| + | // | ||
| + | // Start der 7-Segment-Anzeige. | ||
| + | // | ||
| + | void segment_display_init(void) | ||
| + | { | ||
| + | // Set latch, data out and clock pins as output | ||
| + | pin_setup_output(segment_display_latch); | ||
| + | pin_setup_output(segment_display_data_out); | ||
| + | pin_setup_output(segment_display_clock); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // Darstellung einer Ziffer auf der 7-Segment-Anzeige. | ||
| + | // | ||
| + | void segment_display_write(unsigned char digit) | ||
| + | { | ||
| + | unsigned char map; | ||
| + | signed char i; | ||
| + | |||
| + | // Überprüfung der Ziffer | ||
| + | if (digit > 9) | ||
| + | { | ||
| + | digit = 10; | ||
| + | } | ||
| + | |||
| + | // Ziffer wie Segmentkarte. | ||
| + | map = segment_char_map[digit]; | ||
| + | |||
| + | // Latch-Signal aus | ||
| + | pin_clear(segment_display_latch); | ||
| + | |||
| + | // Senden von he Bits. Höherrangige zuerst. | ||
| + | for (i = 7; i >= 0; i--) | ||
| + | { | ||
| + | // Pin entsprechend Bitwert der Karte setzen. | ||
| + | pin_set_to(segment_display_data_out, | ||
| + | |||
| + | // Taktsignal high setzen. | ||
| + | pin_set(segment_display_clock); | ||
| + | _delay_us(1); | ||
| + | |||
| + | // Taktsignal low setzen. | ||
| + | pin_clear(segment_display_clock); | ||
| + | _delay_us(1); | ||
| + | } | ||
| + | |||
| + | // Latch-Signal ein. | ||
| + | pin_set(segment_display_latch); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Um Ziffern und den Buchstaben " | ||
| + | |||
| + | Das nachfolgende Beispielprogramm beschreibt die Nutzung der Zifferanzeige. Die zuvor beschriebene Funktion der Bibliothek wird in dem Programm erläutert. Das Programm Zählt Ziffern von 0 bis 9 mit einem Intervall von etwa einer Sekunde. Dieses wird dadurch erreicht, dass ein Modul mit einer weitaus größeren Ziffer verwendet wird. | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Das Beispielprogramm der 7-Segment-LED-Anzeige des I/O-Moduls des HomeLab | ||
| + | // | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Hauptprogramm. | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | int counter = 0; | ||
| + | |||
| + | // Einrichtung der 7-Segment-Anzeige. | ||
| + | segment_display_init(); | ||
| + | |||
| + | // Endlosschleife. | ||
| + | while (true) | ||
| + | { | ||
| + | // Anzeige der Werte des Timers. | ||
| + | segment_display_write(counter % 10); | ||
| + | |||
| + | // Lange zählen. | ||
| + | counter++; | ||
| + | |||
| + | // Verzögerung von 1 Sekunde. | ||
| + | sw_delay_ms(1000); | ||
| + | } | ||
| + | } | ||
| + | </ | ||