Probleme mit Steuerprogramm für 104x7 Pixel LED-Anzeige
Hallo zusammen , das ist mein erster Post hier.
Zu meine Problem ich hab hier Zuhaus eine LED-Anzeige liegen für die ich ein Steuerprogramm geschrieben habe.
Wenn ich Zeilen einzeln anspreche funktioniert das auch so wie es soll , nur sobald ich alle Zeilen anspreche "flackert" jede zweite Zeile.
Vieleicht sehr ihr da in meinem Programmcode ihrgend etwas was man anders machen sollte.
main.c
Code:
int main(void)
{
init_display();
printf("Programm gestartet !\n");
uint8_t text[7][56] =
{{0,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} };
while(1)
{
uint8_t i;
for(i=0;i<7;i++)
{
anzeigen(text[i],i);
}
}
return 0;
}
led.c
Code:
/*
7 Zeilen
8 Spalten
14 Segmente:
0| x x x x x x x x
Z 1| x x x x x x x x
e 2| x x x x x x x x
i 3| x x x x x x x x
l 4| x x x x x x x x
e 5| x x x x x x x x
n 6| x x x x x x x x
-------------------
| 0 1 2 3 4 5 6 7 . . .
Spalten
PORTA
PA0 Clock
PA1 Daten
PA2 Enable Zeilen
PA3-PA5 Binär Zeile 1-7
*/
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define TOGGLEBIT(ADDRESS, BIT) ((ADDRESS) ^= (1 << (BIT)))
#define MAX_ZEICHEN 56
#define CLOCK PA0
#define DATEN PA1
#define ENABLE PA2
#define ZEILE2_0 PA3
#define ZEILE2_1 PA4
#define ZEILE2_2 PA5
void init_display()
{
// Pin 0 bis 5 als Ausgangdefinieren
DDRA = (1<<DDA0) | (1<<DDA1) | (1<<DDA2) | (1<<DDA3) | (1<<DDA4) | (1<<DDA5);
CLEARBIT(PORTA,ENABLE);// Enable auf 0 setzen -> Zeilen deaktiviert.
CLEARBIT(PORTA,CLOCK); // Clock auf 0
CLEARBIT(PORTA,DATEN); // Daten auf 0
SETBIT(PORTA,ZEILE2_0); //1
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 0 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}
void select_zeile(uint8_t zeile)
{
if(zeile == 0)
{
SETBIT(PORTA,ZEILE2_0); //1
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 0 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}
if(zeile == 1)
{
CLEARBIT(PORTA,ZEILE2_0); //0
SETBIT(PORTA,ZEILE2_1); //1 Zeile 1 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}
if(zeile == 2)
{
SETBIT(PORTA,ZEILE2_0); //1
SETBIT(PORTA,ZEILE2_1); //1 Zeile 2 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}
if(zeile == 3)
{
CLEARBIT(PORTA,ZEILE2_0); //0
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 3 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}
if(zeile == 4)
{
SETBIT(PORTA,ZEILE2_0); //1
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 4 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}
if(zeile == 5)
{
CLEARBIT(PORTA,ZEILE2_0);//0
SETBIT(PORTA,ZEILE2_1); //1 Zeile 5 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}
if(zeile == 6)
{
SETBIT(PORTA,ZEILE2_0); //1
SETBIT(PORTA,ZEILE2_1); //1 Zeile 5 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}
}
void anzeigen(uint8_t data[], uint8_t zeile)
{
uint8_t k;
//Daten in Register laden
for (k = MAX_ZEICHEN; k!=0; k--)
{
if (data[k] !=0) //Welchen Status hat das nächste Bit
{
SETBIT(PORTA,DATEN); //PORT high, falls Bit == 1;
}
else
{
CLEARBIT(PORTA,DATEN); //PORT low, sonst
}
SETBIT(PORTA,CLOCK); //CLOCK AN, Pegel übernehmen
_delay_us(20);
CLEARBIT(PORTA,CLOCK); //CLOCK AUS
}
//Zeile wählen und anzeigen
select_zeile(zeile); //Zeile wählen
_delay_ms (20);
SETBIT(PORTA,ENABLE); //Gewählte Zeile einschalten
_delay_ms (20);
CLEARBIT(PORTA,ENABLE); //Gewählte Zeile ausschalten
}
Es funktioniert alles soweit, es geht halt nur um "logischefehler" die ich so nicht sehe.
Wäre nett wenn sich das mal jemand mit mehr ahnung als ich ansehen könnte.