Skocz do zawartości

Kurs Arduino II - #6 - wyświetlacze 7-segmentowe


Pomocna odpowiedź

@PanMajster Fajnie, że dałeś mi coś do przemyślenia ! W sobotę po południu się napisze. Powiedz tylko, czy ma to być jak zadanie 6.3 czy może chcesz coś innego osiągnąć ?

@Santiago Tak to zadanie 6.3 jedyne co chciałem zrobić to zabiegi "kosmetyczne" które mi nie wyszły. Chciałem tylko zrobić żeby cyferki wolniej leciały ale tak jak pisałem zmienna która to miała kontrolować u mnie całkowicie nie działa.  Fajne rozwiązanie zarzucił @jand 

Cytat

Żeby całkiem nie burzyć Twojej koncepcji - dodaj jeszcze jeden stopień zliczania (jakby następną cyfrę}. Potraktuj nowe dziesiątki jako jednostki, a nowych jednostek nie wyświetlaj. Twój licznik będzie chodził 10 razy wolniej.

niestety tego jeszcze nie sprawdziłem bo zdążyłem rozebrać układ i musze go na nowo złożyć. 

(edytowany)
11 godzin temu, PanMajster napisał:

Niestety ale to nie działa zmieniałem na 2 i na 500 nie ma dosłownie żadnej różnicy. 

Wkleiłem kod, który u mnie działał.

#define segF 2
#define segA 3
#define segG 4
#define segB 5
#define segD 6
#define segC 7
#define segE 8

#define wys1 11 //wyjścia wyświetlaczy
#define wys2 10

int i = 0; //jedynki
int j = 0; //dziesiatki

void setup() {
  pinMode (segA, OUTPUT);
  pinMode (segB, OUTPUT);
  pinMode (segC, OUTPUT);
  pinMode (segD, OUTPUT);
  pinMode (segE, OUTPUT);
  pinMode (segF, OUTPUT);
  pinMode (segG, OUTPUT);

  pinMode(wys1, OUTPUT);
  pinMode(wys2, OUTPUT);
}

void loop() {
  for (j = 0; j < 10; j++) { //pętla dodająca dziesiątki
    for (i = 0; i < 10; i++) { //pętla dodająca cyfry 
      projekcja(); //funkcja odpowiadająca za multipleksowanie
    }
  }
}

void wyswietlacz(int cyfra) {
  switch (cyfra) {
    case 0:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, LOW);
    break;     
    case 1:
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
    break;   
    case 2:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, LOW);
      digitalWrite(segG, HIGH);
    break;    
    case 3:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, HIGH);
    break;  
    case 4:
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 5:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 6:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 7:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
    break;  
    case 8:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 9:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
  
  }
}

void projekcja() { //funkcja multipleksowania i regulacji czasu
  for (int k = 0; k < 10; k++) {
    digitalWrite(wys1, HIGH);
    digitalWrite(wys2, LOW);
    wyswietlacz(j);
    delay(10);
    digitalWrite(wys1, LOW);
    digitalWrite(wys2, HIGH);
    wyswietlacz(i);
    delay(10); 
  }  
}

 

Edytowano przez Sylba
  • Lubię! 1

@Sylba najszybciej w sobotę podłączę i sprawdzę, ale jak działa to działa. Jednak z@PanMajster chcę zrobić zawody. Otóż multipleksowanie 4 segmentów , a nie 2 :). Mam nadzieje , że spotkamy się w niedzielę 'W samo południe' ! Kto pierwszy nie mrugnie wyświetlaczem ten przeżyje!

  • Lubię! 2
  • 11 miesiące później...
(edytowany)

@Treker w artykule jest błąd:

wyprowadzenie nr 14 (segment G), do pinu Arduino nr 6,
wyprowadzenie nr 15 (segment A), do pinu Arduino nr 7,
wyprowadzenie nr 16 (segment F), do pinu Arduino nr 8.

wyprowadzenie nr 14 to segment F, a wyprowadzenie 16 to segment G. Powoduje to, ze segmenty F i G wyswietlaja sie niepoprawnie (na odwrót).

 

Powinno byc:

wyprowadzenie nr 14 (segment F), do pinu Arduino nr 6,
wyprowadzenie nr 15 (segment A), do pinu Arduino nr 7,
wyprowadzenie nr 16 (segment G), do pinu Arduino nr 8.

i poprawka w kodzie:

#define SEG_G 6  // -> powinien byc pin nr 8
#define SEG_A 7
#define SEG_F 8 // -> powinien byc pin nr 6

 

Edytowano przez swirus
  • 1 miesiąc później...

Poniżej wstawiam kody zadań a w załączniku programy wraz z filmikami.

Zad 6.1

#define SEG_C 2
#define SEG_E 3
#define SEG_D 4
#define SEG_B 5
#define SEG_G 6
#define SEG_A 7
#define SEG_F 8

void setup() {
  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
}

void loop() {
  int i = 0;
  //Petla od 0 do 9
  for (i = 0; i < 15; i++) {
    wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
    delay(500); //Poczekaj 500 ms
  }
}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case 0:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 1:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 2:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, LOW);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 3:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 4:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 5:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 6:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
   
    case 7:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break;
    
    case 8:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
    
    case 9:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
    default:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, LOW);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break;
  }
}

Zad 6.2

#define SEG_C 2
#define SEG_E 3
#define SEG_D 4
#define SEG_B 5
#define SEG_G 6
#define SEG_A 7
#define SEG_F 8

#define SEG_INC 10
#define SEG_DEC 11
#define SEG_RES 12


//Zmienne globalne
int i = 0;

//Zmienne służące do rozpoznania czy przycisk został wciśnięty
bool wcisniecieINC = false; 
bool wcisniecieDESC = false;
bool wcisniecieRES = false;

void setup() {
  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(SEG_INC, INPUT_PULLUP);
  pinMode(SEG_DEC, INPUT_PULLUP);
  pinMode(SEG_RES, INPUT_PULLUP);
}

void loop() {

    //Zwiększanie wartości
    if(digitalRead(SEG_INC) == LOW) //Rozpoznanie wciśnięcia przycisku
        wcisniecieINC = true;
    if(digitalRead(SEG_INC) == HIGH && wcisniecieINC == true) //Rozpoznanie zwolnienia przycisku
    {
        wcisniecieINC = false;
        i++;
    }

    //Zmniejszanie wartości - działanie analogiczne jak dla zwiększania
    if(digitalRead(SEG_DEC) == LOW)
        wcisniecieDESC = true;
    if(digitalRead(SEG_DEC) == HIGH && wcisniecieDESC == true)
    {
        wcisniecieDESC = false;
        i--;
    }

    //Resetowanie wartości
    if(digitalRead(SEG_RES) == LOW)
        wcisniecieRES = true;
    if(digitalRead(SEG_RES) == HIGH && wcisniecieRES == true)
    {
        wcisniecieRES = false;
        i=0;
    }

    delay(20); //Malutkie opóźnienie dla pewności przetworzenia przycisku
    wyswietlacz(i);
}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case 0:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 1:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 2:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, LOW);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 3:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 4:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 5:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 6:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
   
    case 7:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break;
    
    case 8:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
    
    case 9:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
    default:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, LOW);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break;
  }
}

Zad 6.3 - automatycznie

#define SEG_C 2
#define SEG_E 3
#define SEG_D 4
#define SEG_B 5
#define SEG_G 6
#define SEG_A 7
#define SEG_F 8

#define WYSW_1 9
#define WYSW_2 10

int czas = 0;

void setup() {
  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);

  pinMode(WYSW_1, OUTPUT);
  pinMode(WYSW_2, OUTPUT);  
}

void loop() {

    //Podwójna pętla for do wygodnego inkrementowania wartości
    for(int i = 0; i<10; i++)
    {  
        for(int j = 0; j<10; j++)
        {
            digitalWrite(WYSW_1, HIGH); //Włącz pierwszy wyświetlacz
            digitalWrite(WYSW_2, LOW); //Wyłącz drugi
            wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
            delay(10);
            digitalWrite(WYSW_1, LOW); //Wyłącz pierwszy wyświetlacz
            digitalWrite(WYSW_2, HIGH); //Włącz drugi
            wyswietlacz(j); //Wyswietl wartosc na wyswietlaczu
            delay(10);
            czas += 20;
            if(czas < 200) //Regulacja czasu wyswietlania poprzez cofanie inkrementacji liczby do momentu upłynięcia czasu
                j--;
            else
                czas = 0;
        }
    }


}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case 0:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 1:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 2:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, LOW);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 3:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 4:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 5:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 6:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
   
    case 7:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break;
    
    case 8:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
    
    case 9:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
  }
}

Zad 6.3 - przyciski

#define SEG_C 2
#define SEG_E 3
#define SEG_D 4
#define SEG_B 5
#define SEG_G 6
#define SEG_A 7
#define SEG_F 8

#define WYSW_1 9
#define WYSW_2 10

#define SEG_INC 11
#define SEG_DEC 12
#define SEG_RES 13

//Zmienne globalne
int i = 0;
int j = 0;

//Zmienne służące do rozpoznania czy przycisk został wciśnięty
bool wcisniecieINC = false;
bool wcisniecieDESC = false;
bool wcisniecieRES = false;

void setup() {
  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(WYSW_1, OUTPUT);
  pinMode(WYSW_2, OUTPUT);
  pinMode(SEG_INC, INPUT_PULLUP);
  pinMode(SEG_DEC, INPUT_PULLUP);
  pinMode(SEG_RES, INPUT_PULLUP);  
}

void loop() {

    //Zwiększanie wartości
    if(digitalRead(SEG_INC) == LOW) //Rozpoznanie wciśnięcia przycisku
        wcisniecieINC = true; 
    if(digitalRead(SEG_INC) == HIGH && wcisniecieINC == true) //Rozpoznanie zwolnienia przycisku
    {
        wcisniecieINC = false;
        i++;
        if(i > 9) //Rozpoznanie czy cyfra jedności przekroczyła wartość 9. Jak tak to resetuj jej wartość i zwiększ cyfrę dziesiątek.
        {
            j++;
            i=0;
        }
        if(j > 9) //Jeśli mamy wartość wyższą od 99 (cyfra dziesiątek wyższa niż 9) to wyzeruj wartość
        {
            i = 0;
            j = 0;
        }
    }

    //Zmniejszanie wartości - działanie analogiczne jak dla zwiększania
    if(digitalRead(SEG_DEC) == LOW)
        wcisniecieDESC = true;
    if(digitalRead(SEG_DEC) == HIGH && wcisniecieDESC == true)
    {
        wcisniecieDESC = false;
        i--;
        if(i < 0) //Rozpoznanie czy cyfra jedności osiągnęła wartość mniejszą od 0. Jak tak to ustaw jej wartość na 9 i zmniejsz cyfrę dziesiątek.
        {
            j--;
            i=9;
        }
        if(j < 0) //Jeśli mamy wartość niższą od 0 (cyfra dziesiątek niższa niż 0) to wyzeruj wartość
        {
            i = 0;
            j = 0;
        }
    }

    //Reset wartości
    if(digitalRead(SEG_RES) == LOW)
        wcisniecieRES = true;
    if(digitalRead(SEG_RES) == HIGH && wcisniecieRES == true)
    {
        wcisniecieRES = false;
        i=0, j=0;
    }

    digitalWrite(WYSW_1, HIGH); //Włącz pierwszy wyświetlacz
    digitalWrite(WYSW_2, LOW); //Wyłącz drugi
    wyswietlacz(j); //Wyswietl wartosc na wyswietlaczu
    delay(10);
    digitalWrite(WYSW_1, LOW); //Wyłącz pierwszy wyświetlacz
    digitalWrite(WYSW_2, HIGH); //Włącz drugi
    wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
    delay(10);
    
}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case 0:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 1:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break; 
    
    case 2:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, LOW);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 3:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 4:
        digitalWrite(SEG_A, LOW);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 5:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break; 
    
    case 6:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, LOW);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
   
    case 7:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, LOW);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, LOW);
        digitalWrite(SEG_G, LOW);
    break;
    
    case 8:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, HIGH);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
    
    case 9:
        digitalWrite(SEG_A, HIGH);
        digitalWrite(SEG_B, HIGH);
        digitalWrite(SEG_C, HIGH);
        digitalWrite(SEG_D, HIGH);
        digitalWrite(SEG_E, LOW);
        digitalWrite(SEG_F, HIGH);
        digitalWrite(SEG_G, HIGH);
    break;
  }
}

Wyświetlacze 7-segmentowe - zadania.zip

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...