Witam
Poniżej przedstawiam pełny kod do obsługi wyświetlacza 4-ro cyfrowego.
Program się kompiluje, ale zamiast wyświetlania kolejno cyfr, które zawarte są w tablicy, zapala mi cały wyświetlacz, gdzie jest błąd??
Program zawiera liczne komentarze, także nie będzie większego problemu z domyśleniem się co do czego jest
Z góry dziękuję za odpowiedź
Poniżej przedstawiam pełny kod do obsługi wyświetlacza 4-ro cyfrowego.
Program się kompiluje, ale zamiast wyświetlania kolejno cyfr, które zawarte są w tablicy, zapala mi cały wyświetlacz, gdzie jest błąd??
Program zawiera liczne komentarze, także nie będzie większego problemu z domyśleniem się co do czego jest
#include<avr\io.h>
#include<inttypes.h>
#include<avr\signal.h>
#include<avr\interrupt.h>
#include<avr\pgmspace.h>
#include<avr\delay.h>
#include <util/delay.h>
//////
#define SW1 0
#define SW2 1
volatile uint8_t g_bDelay; //122hz
uint8_t g_DaneWyswietlacza[4];
uint8_t g_DaneCom[4] PROGMEM =
{~(1<<6), ~(1<<5), ~(1<<4), ~(1<<3)};
//tablica cyfr
uint8_t g_WzorCyfr[9] PROGMEM =
{
~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5) /*0*/,
~(1<<1 | 1<<2 )/*1*/, ~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<6)/*2*/,
~(1<<1 | 1<<2 | 1<<5 | 1<<6)/*3*/,
~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5)/*4*/,
~(1<<0 | 1<<2 | 1<<3 | 1<<5 | 1<<6)/*5*/,
~(1<<0 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6)/*6*/,
~(1<<0 | 1<<1 | 1<<2) /*7*/,
~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8) /*8*/,
~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<5 | 1<<9) /*9*/
};
uint16_t g_Licznik=0; //zlicza aktualnie zliczoną wartosc
//Funkcja wysw dana liczbe dziesietnie
void WyswietlDEC(uint16_t vart)
{
uint8_t n;
if(vart >9999)
{
for(n=0; n<4;n++)//czesc odpow za wysw kresek na 4 wyświetlaczach ,
//jesli zakres został przekroczony
{
g_DaneWyswietlacza[n] = ~(1<<6);
}
return;
}
for(n=4; n>0; n--)//petla zbud tak, ze przerwanie nastepuje w chwili,
// gdy zmienna przyjmuje wartosc zero
{
g_DaneWyswietlacza[n-1] = pgm_read_byte(&g_WzorCyfr[vart%10]);
vart /=10;
}
}
int main(void)
{
///////////////////////////////
//inicjacja
DDRB=0xff; //ustawienie prtu "D" jako wyjscia (wszystkie 0-7)
DDRD = 1<<6 | 1<<5 | 1<<4 | 1<<3;////ustaw prtu "B" jako wyjscia(6,5,4,3)
//wlaczenie podciagania ma wyprowadzeniach przycisków
PORTD = 1<<SW1 | 1<<SW2; //SWPORT = PORTD
//Timer0
TCCR0A = 1<<CS01|1; // CK/8 | 1<<CS00; //sygnal takt CK/64, ksiazka s 61
TIMSK = 1<<TOIE0;
//globalne zezw na przerw
sei();
//kon inicjal
for(;;)
{
uint8_t a = 1;
WyswietlDEC(a);
if(!(PIND & 1<<SW1))
{
// usuwanie drgań styków
g_bDelay = 6; //50ms
while(g_bDelay != 0) {}
if(!(PIND & 1<<SW1))
{
uint8_t a = 100;
--a;
WyswietlDEC(a);
// Oczekiwanie na puszczenie
while(!(PIND & 1<<SW1))
{
}
}
}
if(!(PIND & 1<<SW2))
{
// usuwanie drgań styków
g_bDelay = 6; //50ms
while(g_bDelay != 0) {}
if(!(PIND & 1<<SW2))
{
++a;
g_bDelay = 120; //1s
while(!(PIND & 1<<SW2))
{
}
}
}
}
return 0;
}
//---------------------------------------------------------------
//obsługa przerwan
SIGNAL(SIG_OVERFLOW0)
{
static uint8_t AktWyswietlacz = 0;
// Wpisanie do licznika początkowej wartości
TCNT0=128;
//WYGASZENIE WYSW
PORTD |= 1<<6 | 1<<5 | 1<<4 | 1<<3;//tj przelaczanie od 1 -4 wysw (4 nożki ster)
//jest to poczworny wyswietlacz. ja mam potrojny :-)
PORTB = g_DaneWyswietlacza [AktWyswietlacz];
PORTD &= pgm_read_byte (&g_DaneCom[AktWyswietlacz]);//wlaczanie odpow wyswietlacza
// sktuktóra pgm_read_byte (&... ) oznacza, że odwołujemy się do !!!DANYCH PROGRAMU!!!
++AktWyswietlacz;//zwieksz stanu zmienej wsk na obslug wysw
if (AktWyswietlacz > 3)
{
//zmienna zapobiegajaca niepotrzebnemi kopiowaniu
//zmiennej g_bDelay (typ volatile)
uint8_t delay;
AktWyswietlacz = 0;
//obsługa opóźnien
delay = g_bDelay;
if(delay>0)
{
--delay;
g_bDelay = delay;
}
}
}
Z góry dziękuję za odpowiedź
