Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[AVR][C] wyswietlanie liczb binarnie (na diodach)

qw3r 27 Oct 2009 23:03 3344 6
  • #1
    qw3r
    Level 10  
    mam taki kod:
    
    #include <avr/io.h> 				// dostep do rejestrów
    
    #define F_CPU 6000000   			 /* 6MHz zegar procesora */ 
    #define cbi(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit)) //makro Clear Bit
    #define sbi(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit))  //makro Set Bit
    
    #define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) 	// adr. rej. kier. PORTx
    #define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) 	// adr. rej. wej. PORTx
    #define LEDY 			0xFF
    #define PRZYCISKI 		0xFF
    
    #define LEDY_PORT 		DDR(a)
    #define PRZYCISKI_PORT 	PIN(b)
    
    
    
    #define a PORTD
    #define b PINB
    
    int main( void ) 				// program główny
    {
    
    sbi(LEDY_PORT,LEDY);
    sbi(PRZYCISKI_PORT,PRZYCISKI); 	 	
    
    while(1){
    
    PORTD &= ~0xFF;
    
    		switch (PINB)
    		{
    			case 0x00:
    			break;
    
    			case 0x01:
    				PORTD |= 0x01;
    			break;
    
    			case 0x02:
    				PORTD |= 0x02;
    			break;
    
    			case 0x04:
    				PORTD |= 0x03;
    			break;
    		
    			case 0x08:
    				PORTD |= 0x06;
    			break;
    
    			case 0x10:
    				PORTD |= 0x08;
    			break;
    
    			case 0x20:
    				PORTD |= 0x05;
    			break;
    
    			case 0x40:
    				PORTD |= 0x06;
    			break;
    
    			case 0x80:
    				PORTD |= 0x07;
    	
    			}
    	}
    }
    


    w ogole nie moge zrobic aby dobrze diody swiecily.. dzialam na syulatorze Hapsim, wlaczam atmege 128
    Mozecie jakos podpowiedziec? z gory dziekuje
  • Helpful post
    #2
    ElektroTME
    Level 14  
    Jeżeli Ci to pomoże to mam kod który po naciśnięciu przycisku dodaje wartość do licznika i wyświetla stan licznika binarnie na diodach.
    #include <io.h>
    #include <util/delay.h>//biblioteka funkcji opóźniającej
    
    unsigned char licznik;//deklaracja zmiennej
    
    int main(void){
    
    	DDRB = 0xff;//port b jako wyjście
    	PORTB = 0xff;//port b w stanie wysokim
    	DDRA = 0x00;//port a jako wejście
    	PORTA = 0xff;//port a podciągnięty do '1'
    
    	while(1){//pętla nieskończona
    		if(bit_is_clear(PINA,0)){//jeżeli naciśniemy przycisk
    			PORTB = ~licznik++;//wpisujemy na port b odwrotność licznika, poniewarz diody sterowane stanem niskim
    			_delay_ms(30);//opóźnienie programowe
    		}
    	}
    }
  • #3
    qw3r
    Level 10  
    nie nie potrzebuje żadnych liczników, poprostu po nacisnieciu przycisku (od 0 do 7) zeby wyswietlalo mi postac binarna liczby, np po nacisnieciu 7 aby zapalaly sie 3(trzy) diody.. tylko ze jak odpalam moj program poprawinie dzialaja tylko liczby 5,6,7.. wczesniejsze zle sie wyswietlaja : ( plz help me ; )
  • Helpful post
    #4
    ElektroTME
    Level 14  
    Podmień pętlę switch i powiedz jakie wyniki:

    switch (PINB) 
          { 
             case 0:
    		 	PORTD |= 0x00; 
             break; 
    
             case 1: 
                PORTD |= 0x01; 
             break; 
    
             case 2: 
                PORTD |= 0x02; 
             break; 
    
             case 4: 
                PORTD |= 0x03; 
             break; 
           
             case 8: 
                PORTD |= 0x04; 
             break; 
    
             case 16: 
                PORTD |= 0x05; 
             break; 
    
             case 32: 
                PORTD |= 0x06; 
             break; 
    
             case 64: 
                PORTD |= 0x07; 
             break; 
    
             case 128: 
                PORTD |= 0x08; 
        
             }
  • #5
    qw3r
    Level 10  
    hmm prawie dobrze( ; dla przycisku zero zapala pierwsza diode itd.. dla 6 przycisku zapala trzy diody dla 7 zapala czwarta diode..
  • Helpful post
    #6
    ElektroTME
    Level 14  
    switch (PINB) 
          { 
             case 0: 
              PORTD |= 0x00; 
             break; 
    
             case 1: 
                PORTD |= 0x00; 
             break; 
    
             case 2: 
                PORTD |= 0x01; 
             break; 
    
             case 4: 
                PORTD |= 0x02; 
             break; 
            
             case 8: 
                PORTD |= 0x03; 
             break; 
    
             case 16: 
                PORTD |= 0x04; 
             break; 
    
             case 32: 
                PORTD |= 0x05; 
             break; 
    
             case 64: 
                PORTD |= 0x06; 
             break; 
    
             case 128: 
                PORTD |= 0x07; 
        
             }
  • #7
    qw3r
    Level 10  
    dziękuuuuuuuuuuujęęęęęęę ( : -przepraszam za spam-kod działa ( :
    <seven heaven>