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

[atmega8][C/winAvr]Dekoder bin2led

bomblik09 05 Lut 2009 12:55 1565 2
REKLAMA
  • #1 6105925
    bomblik09
    Poziom 10  
    Język C znam, ale nigdy wcześniej nie pisałem programów na AVR'y. Mój program ma być dekoderem, który zamienia liczbę binarną (ustawianą switchami) na jej odpowiednik heksadecymalny widoczny na wyświetlaczy 7 segmentowym.
    Napisałem taki program:
    
    #include <avr/io.h>
    #include <util/delay.h>         
    
    int main(void)
    {
    	// tablica z kodami znaków dla wyświetlacza
    	char znaki[17] = {2,158,36,12,152,72,64,30,0,8,16,192,98,132,96,224};
    	
    	DDRC= 0x00;	  // PORTC - wejścia z przełącznika
    	PORTC=0xff;
    	
    	DDRD= 0xff;	  // PORTD - wyjścia na wyświetlacz .. a - g
    	PORTD=0x00;
    	
    	
    	while (1){
    		_delay_ms(20);
    		switch (PORTC){
    			case 0: PORTD = znaki[0];		// 0000 0010			- 0
    					break;
    			case 1: PORTD = znaki[1];		// 1001 1110			- 1
    					break;
    			case 2: PORTD = znaki[2];		// 0010 0100			- 2
    					break;
    			case 3: PORTD = znaki[3];		// 0000 1100			- 3
    					break;
    			case 4: PORTD = znaki[4];		// 1001 1000			- 4
    					break;
    			case 5: PORTD = znaki[5];		// 0100 1000			- 5
    					break;		
    			case 6: PORTD = znaki[6];		// 0100 0000			- 6
    					break;
    			case 7: PORTD = znaki[7];		// 0001 1110			- 7
    					break;
    			case 8: PORTD = znaki[8];		// 0000 0000			- 8
    					break;
    			case 9: PORTD = znaki[9];		// 0000 1000			- 9
    					break;
    			case 10: PORTD = znaki[10];		// 0001 0000			- A
    					break;
    			case 11: PORTD = znaki[11];		// 1100 0000			- B
    					break;
    			case 12: PORTD = znaki[12];		// 0110 0010			- C
    					break;
    			case 13: PORTD = znaki[13];		// 1000 0100			- D
    					break;
    			case 14: PORTD = znaki[14];		// 0110 0000			- E
    					break;
    			case 15: PORTD = znaki[15];		// 0111	0000			- F
    					break;
    			default: PORTD = 252;			// 1111 1100			- -
    					
    		}
    		_delay_ms(20);	
    	}	
    	
        return 0;
    }
    


    Tutaj jest schemat mojego układu.
    [atmega8][C/winAvr]Dekoder bin2led
    Narazie nie wstawiłem wejścia programatora, dodam też, że układ HDSP 5321 to wyświetlacz 7 segmentowy ze wspólna anodą.
    Proszę bardziej doświadczonych użytkowników o opinie czy to zadziała :)
  • REKLAMA
  • #2 6106236
    don diego
    Poziom 32  
    Brak kondensatorów 100nF na VCC i AVCC. Po co ten rezystor na anodzie wyświetlacza?
  • Pomocny post
    #3 6106245
    Jerzy_W
    Poziom 14  
    Pewnie nie zadziała

    1) Stan przełącznika czytaj z rejestru PINC, a nie PORTC

    2)zamaskuj 4 nieużywane starsze bity

    3)wyrzuć ten cały switch, chyba wystarczy to:

    
      PORTD = znaki[PINC & 0x0F]
    
    


    Uwaga do sprzętu : rezystor na wspólnej anodzie niepotrzebny.
REKLAMA