logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Obsługa wyświetlacza LED

mongoł2000 19 Lis 2010 14:37 2573 3
REKLAMA
  • #1 8763071
    mongoł2000
    Poziom 18  
    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++;
    }     
        
  • REKLAMA
  • Pomocny post
    #2 8763141
    gaskoin
    Poziom 38  
    o ile wszystko jest dobrze to brakuje Ci magicznego słowa "volatile"
  • REKLAMA
  • #3 8763146
    adazm
    Poziom 12  
    mongoł2000 napisał:
    Poprawnie wyświetla się wartość początkowa, ale kiedy chce zmienić wartość wyświetlanej liczby w pętli while to nic się nie zmienia.
       while(1)
        {
    	
    	jednostki=5;
    	dziesiatki=4;
    	setki=3;
    	tysiace=2;
    	
    	}
    


    Spróbuj dodać pętlę opóźniającą - np. coś takiego:
    #include <util/delay.h>
    
        ...
    
       while(1)
        {
    	
    	jednostki=5;
    	dziesiatki=4;
    	setki=3;
    	tysiace=2;
    
    	_delay_ms(200);  // opóźnienie 200ms
    	}
    

    Pozdrawiam, ADAZM
  • #4 8763168
    mongoł2000
    Poziom 18  
    Już ok...zapomniałem o volatile;/ eh
REKLAMA