Witam! Próbuje zaimplementować obsługę wyświetlacza multipleksowo. Poprawnie wyświetla się wartość początkowa, ale kiedy chce zmienić wartość wyświetlanej liczby w pętli while to nic się nie zmienia.
#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>
#include <avr\io.h>
#include <avr\signal.h>
#include <avr\interrupt.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#define A PB1
#define B PB2
#define C PB3
#define D PB4
#define E PB5
#define F PB0
#define G PB6
#define Kropka PB7
uint8_t g_AktWyswietlacz ;
uint16_t g_WzoryCyfr[10] ;
uint8_t g_DaneCom[4] ;
uint8_t g_Czas[4] ;
uint8_t g_Ustawienie ;
volatile uint8_t wysw=1; // zmienna oznaczająca numer aktywnego wyświetlacza
uint8_t liczba = 24;
uint8_t dziesiatki=4;
uint8_t jednostki=3;
uint8_t setki=2;
uint8_t tysiace=1;
int main(void)
{
g_WzoryCyfr[0] = ~(1<<A | 1<<B | 1<<C | 1<<D | 1<<E | 1<<F); //0
g_WzoryCyfr[1] = ~(1<<B | 1<<A) ; //1
g_WzoryCyfr[2] = ~(1<<A| 1<<G | 1<<D | 1<<C | 1<<F) ; //2
g_WzoryCyfr[3] = ~(1<<A | 1<<B | 1<<C | 1<<F | 1<<G) ; //3
g_WzoryCyfr[4] = ~(1<<B | 1<<A | 1<<E | 1<<G) ; //4
g_WzoryCyfr[5] = ~(1<<C | 1<<B | 1<<E | 1<<F | 1<<G) ; //5
g_WzoryCyfr[6] = ~(1<<B | 1<<C | 1<<D | 1<<E | 1<<F | 1<<G) ; //6
g_WzoryCyfr[7] = ~(1<<A | 1<<B | 1<<F) ; //7
g_WzoryCyfr[8] = ~(1<<A | 1<<B | 1<<C | 1<<D | 1<<E | 1<<F | 1<<G) ; //8
g_WzoryCyfr[9] = ~(1<<A | 1<<B | 1<<C | 1<<E | 1<<F | 1<<G) ; //9
DDRB = 255; //cały port jako wyjściowy
DDRD |= (1<<2)|(1<<1)|(1<<4)|(1<<3); //porty PD0 i PD1 również jako wyjścia
TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
OCR1A = 100; // Ustawia wartość pożądaną na 1Hz dla preskalera 64
TCCR1B |= ((1 << CS10) | (1 << CS11)); // Ustawia timer z preskalerem Fcpu/1
TIMSK |= (1 << OCIE1A);
sei();
while(1)
{
jednostki=5;
dziesiatki=4;
setki=3;
tysiace=2;
}
return 0;
}
ISR(TIMER1_COMPA_vect)
{
if(wysw==5) wysw=1;
switch(wysw)
{
case 1:
PORTD |= (1 << 1);//zeruje bit 1 portu D - wyłącza wyświetlacz nr 1
PORTD |= (1 << 2);//zeruje bit 2 portu D - wyłącza wyświetlacz nr 2
PORTD |= (1 << 4); //zeruje bit 4 portu D - wyłącza wyświetlacz nr 3
PORTD &= ~(1 << 3); //ustawia bit 3 portu D - włącza wyświetlacz nr 4
PORTB = g_WzoryCyfr[jednostki];
break;
case 2:
PORTD |= (1 << 1);//zeruje bit 1 portu D - wyłącza wyświetlacz nr 1
PORTD |= (1 << 2);//zeruje bit 2 portu D - wyłącza wyświetlacz nr 2
PORTD &= ~(1 << 4); //zeruje bit 4 portu D - wyłącza wyświetlacz nr 3
PORTD |= (1 << 3); //ustawia bit 3 portu D - włącza wyświetlacz nr 4
PORTB = g_WzoryCyfr[dziesiatki];
break;
case 3:
PORTD |= (1 << 1);//zeruje bit 1 portu D - wyłącza wyświetlacz nr 1
PORTD &= ~(1 << 2);//zeruje bit 2 portu D - wyłącza wyświetlacz nr 2
PORTD |= (1 << 4); //zeruje bit 4 portu D - wyłącza wyświetlacz nr 3
PORTD |= (1 << 3); //ustawia bit 3 portu D - włącza wyświetlacz nr 4
PORTB = g_WzoryCyfr[setki];
break;
case 4:
PORTD &= ~(1 << 1);//zeruje bit 1 portu D - wyłącza wyświetlacz nr 1
PORTD |= (1 << 2);//zeruje bit 2 portu D - wyłącza wyświetlacz nr 2
PORTD |= (1 << 4); //zeruje bit 4 portu D - wyłącza wyświetlacz nr 3
PORTD |= (1 << 3); //ustawia bit 3 portu D - włącza wyświetlacz nr 4
PORTB = g_WzoryCyfr[tysiace];
break;
}
wysw++;
}