- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 2 von 2

Thema: LED Matrix Display die zweite

  1. #1
    Benutzer Stammmitglied Avatar von Jackeder
    Registriert seit
    08.02.2015
    Ort
    Chemnitz, Germany
    Beiträge
    53

    LED Matrix Display die zweite

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich hab mir vor einiger Zeit ein Matrix-LED-Display zusammen gebaut aus 4 5x7 Matrixmodulen. Den Schaltplan und Quelcode hab ich aus dem Buch "AVR Hardeware und C-Programmierung in der Praxis" von Florian Schäffer.
    Der Quelcode funktioniert und ist für mich, als Anfänger, einfach und zu verstehen.

    Code:
    /***************************************************
     *  Textausgabe auf 4 LED Modulen am Atmega 8      *
     *  5x7 Matrixmodule mit gemeinsamer Anode         *
     *  angesteuert über ULN2003A an PortB PB0 - PB6   *
     *  Multiplexing über 3 Schieberegister 74HCT164   *
     *  PC4 --> Bit setzen  ;  PC5 --> Tackt schieben  *
     *                                                 *
     * Created: 13.02.2016 18:23:54                    *
     *  Author: Hendrik                                *
     ***************************************************/ 
    
    #define F_CPU 8000000UL
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include "charset.h"			// beinhaltet Zahlen, keine und große Buchstaben sowie Sonderzeichen
    #include "lcd-routines.c"
    
    void set_row (uint8_t);
    void write_row (uint8_t);
    int main (void);
    
    #define DISPCOLS 20			// Anzahl der Spalten
    #define MEMCOLS 200			// Displayspeicher fuer 200 Spalten reservieren (>= 6 x Anzahl der Zeichen in Zeichenkette + 2 x DISPCOLS)
    #define CHARWIDTH 5			// Spalten je Zeichen
    #define CHARHEIGHT 7		// Zeilen je Zeichen
    #define DELAY 50			// Textgeschwindigkeit (ca. 10..200: schnell..langsam)
    
    volatile uint8_t memory[DISPCOLS];		// Speicher für Display, spaltenweise orientiert, Index 0=links
    volatile uint8_t pos=0;					// ab welcher Speicherposition soll dargestellt werden
    volatile uint8_t zeile=0;				// Zeilenzähler welche Zeile aktuell ist
    volatile uint8_t durchlauf=0;			// Anzahl der Durchlaeufe
    volatile uint8_t chars=0;				// Anzahl der Zeichen in Zeichenkette
    
    // *** Textausgabe *** 
    uint8_t text[]= " Hallo Roboternetz ";	// Zeichenkette Ausgabe
    
    
    
    
    void set_row (uint8_t row)
    {
    	int8_t i;
    	
    	// Alle Spalten des Displays durchlaufen. Mit rechter Spalte beginnen
    	for (i = DISPCOLS-1; i>=0; i--)
    	{
    		// Bit in der Spalte + Verschiebungswert pos an der übergebenden Zeile gesetzt?
    		if ((memory[i+pos] >> (6-row)) & 1)	//
    			{
    				PORTC |= (1 << PC4);	// Data Bit setzen
    			}
    		else
    			{
    				PORTC &= ~(1 << PC4);	// Data Bit löschen
    			}
    		PORTC |= (1 << PC5);	// Takt HIGH -> Flanke
    		PORTC &= ~(1 << PC5);	// Takt LOW
    	}
    }
    
    void write_row (uint8_t row)
    {
    	PORTB = 0;			// alle Zeilen aus
    	set_row (row);		// Daten für aktuelle Zeile in Schieberegister schieben
    	PORTB = (1 << row);	// aktuelle Zeile an
    }
    
    
    int main()
    {
    	lcd_init();
    	
    	uint8_t	i, row;
    
    	DDRC  |= (1 << DDC4) | (1 << DDC5);		// PC4, PC5 als Ausgang
    	PORTC &= ~((1 << PC4) | (1 << PC5));	// PC4, PC5 aus
    	DDRB  = 0xFF; 							// PortB als Ausgang
    	PORTB = 0;								// PortB aus
    
    	// Leerspalten am Anfang, damit Text von rechts kommt
    	for (row=0; row<DISPCOLS; row++)
    	memory[row]=1;		// Eigentlich 0 aber für besseres Verständnis 1, damit eine LED leuchtet
    	
    	// Zeichenkette in Spaltenbeschreibung umsetzen
    	while (text[chars] != 0)								// solange Zeichen in Zeichenkette
    	{
    		memory[row]=charset[text[chars]-32][0]; row++;		// aktuelle Spalte = 1. Spalte des Fonts
    		memory[row]=charset[text[chars]-32][1]; row++;		// aktuelle Spalte = 2. Spalte des Fonts
    		memory[row]=charset[text[chars]-32][2]; row++;		// usw.
    		memory[row]=charset[text[chars]-32][3]; row++;
    		memory[row]=charset[text[chars]-32][4]; row++;
    		memory[row]=0; row++;								// Leerspalte: Abstand zwischen 2 Buchstaben
    		chars++;											// Anzahl der Zeichen zählen
    	}
    	
    	// Leerspalten am Ende, damit Textende aus Display geschoben wird
    	for (i=0; i<DISPCOLS; i++)
    	memory[i+row]=1;	// Eigentlich 0 aber für besseres Verständnis 1, damit eine LED leuchtet
    
    	OCR1A = (uint16_t)(F_CPU/1024.0*0.003);			// Vergleichwert für 0,003s laden: Takt= 8MHz/1024 = 7812,5 Zählerschritte pro s
    	TIMSK  |= (1<<OCIE1A); 							// Interrupt wenn Timer Vergleichswert erreicht
    	TCCR1B |= (1<<CS12) | (1<<CS10) | (1<<WGM12);	// Timer mit Div 1024 starten und Clear Counter on Compare Match
    	sei();
    	
    	lcd_clear();
    	lcd_setcursor(0,1);
    	lcd_string("20x7 LED Matrix Text");
    	lcd_setcursor(3,3);
    	lcd_string("Hallo  Thomas!");
    	
        
    	while(1)
        {
    		asm volatile ("nop");		// nichts machen
        }
    	return 0;
    }
    
    // Wird vom 16 Bit Timer ausgelöst, wenn dieser den Vergleichwert erreicht
    
    ISR (TIMER1_COMPA_vect)
    {
    	write_row (zeile);			// schreibe aktuelle Zeile
    	zeile++;					// nächste mal naechste Zeile
    	if (zeile == CHARHEIGHT)	// wenn alle Zeilen ausgegeben, wieder von vorne beginnen
    	zeile = 0;
    	
    	durchlauf++;				// Durchlaufzaehler: wie oft wurde das Display unverändert refresht
    	if (durchlauf == DELAY)		// Anzahl der Durchläufe erreicht
    	{
    		durchlauf = 0;
    		pos++;					// Displayinhalt eins verschieben
    	}
    	
    	// Wenn der gesamte Speicherinhalt einmal durchlaufen wurde
    	if (pos >= (chars*(CHARWIDTH+1)+(DISPCOLS)))
    	pos = 0;				// von vorne beginnen	
    }
    Allerdings wird hier auch nur das auf dem Display angezeigt als Laufschrift,
    was in folgender Zeile eingefügt wird

    Code:
    // *** Textausgabe *** 
    uint8_t text[]= " Hallo Roboternetz ";	// Zeichenkette Ausgabe
    Meine Frage,
    ich würde gerne das Matrix-Display so ansteuern wie ich das LCD ansteuere, sprich einfach write_Matrix(" Hallo Roboternetz "); , oder über UART vom PC Text ans Display senden, oder Werte anzeigen lassen von ADC zum Beispiel ob als Laufschrift oder fest.
    Könnte ich da den obrigen Code weiterhin verwenden und abändern, oder müsste was neues schreiben ?

    LG Hendrik

  2. #2
    Gesperrt
    Registriert seit
    12.08.2017
    Ort
    Schömberg
    Beiträge
    4
    Ich denke ja.Sie können diesen Code verwenden

Ähnliche Themen

  1. [ERLEDIGT] Proplem mit LED Matrix Display
    Von Jackeder im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 31.01.2016, 17:01
  2. DCF77 - Ausgabe auf LED-Matrix-Display
    Von BoondockDuck im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 4
    Letzter Beitrag: 26.10.2008, 21:26
  3. Wie wo was die Zweite
    Von besucherkauf im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 16.04.2007, 13:33
  4. Antworten: 5
    Letzter Beitrag: 14.04.2007, 19:03
  5. suche matrix display emulator
    Von mojo777 im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 13.12.2005, 16:46

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen