7 szegmenses kijelző



Ebben a cikkben egy közös katódos hétszegmenses kijelzővel íratjuk ki a
számokat 0-9-ig. Minden gombnyomásra eggyel nagyobb szám jelenik meg,
kilenc útán újra kezdi a számlálást.

Alkatrészek:

- Arduino Uno

- Usb kábel

- Próbapanel

- Összekötő vezetékek

- 7 szegmenses kijelző(közös katódos)

- Nyomógomb

- 10kohm-os ellenállás

- 230ohm-os ellenállás

- 10uF/16V -os Elko kondi

Építsük meg az áramkört:

A nyomógombhoz tartozik a negatívra húzó 10k-os ellenállás ami a bemenet jelszintjét stabilizálja,
valamint hozzá tartozik egy 10uF kondi ami a nyomógombot pergés mentesíti.
A 7szegmenses kijelző közös katódja és a GND közé pedig beépítünk egy áramkorlátozó ellenállást
ami a kijelző ledjeit hivatott védeni.
A Lábkiosztás a következő:

Arduino láb         7seg láb

       2                  7(A)led

       3                  6(B)

       4                  4(C)

       5                  2(D)

       6                  1(E)

       7                  9(F)

       8                  10(G)

      N/C               DP(pont)

A kijelzőkön a lábkiosztás különböző lehet a lényeg a szegmenseket jelölő
betűjelzések, ezeknek kell mindig stimmelni az arduino kivezetésekhez.

A kód:

/*
Arduino Pins: 2,3,4,5,6,7,8
Display Pins: 7,6,4,2,1,9,10
Display Pins 3&8 should go to GND
Switch Input is at Pin 9
Source: http://www.electroschematics.com/9636/arduino-segment-display-counter/
*/
byte numbers[10] = {
B11111100, B01100000, B11011010, B11110010, B01100110, //kijelző számainak eltárolása
B10110110, B10111110, B11100000, B11111110, B11100110 //bináris számokként
};
void setup() {
for(int i = 2; i <= 8; i++) {
pinMode(i, OUTPUT); // arduino 2-8-ig kimenet
}
pinMode(9, INPUT);//arduino 9-es láb bemenet
}
int counter = 0;// counter változó értékadása
bool go_by_switch = true;//kapcsolás értéke igaz
int last_input_value = LOW;//bemeneti szint alacsony
void loop() {
if(go_by_switch) {
int switch_input_value = digitalRead(9);//ha kapcs értéke igaz akkor leolvasa a bemenet értékét
if(last_input_value == LOW && switch_input_value == HIGH) {
counter = (counter + 1) % 10;//ha az utolsó leolvasott érték alacsony és a most le
//olvasott bemeneti érték magas akkor counter változó értéke egyel nől
}
last_input_value = switch_input_value;//utolsó értékbe bekerül a most leolvasott
} else {
delay(500);
counter = (counter + 1) % 10;//különben csak counter változó értéke nől
}
writeNumber(counter);// függvény meghívása counter értékátadásával
}
void writeNumber(int number) {
if(number < 0 || number > 9) {
return;//ha number(counter) értéke kisebb mint 0 vagy nagyobb mint 9 akkor visszatér
}//a program a loop ciklusba
byte mask = numbers[number];//mask változó tárolja a numbers változó number-edik
//byte értékét
byte currentPinMask = B10000000;//értékadás
for(int i = 2; i <= 8; i++) {
if(mask & currentPinMask) digitalWrite(i,HIGH); //kiíratja a kimenetre a bitértékeket
else digitalWrite(i,LOW);
currentPinMask = currentPinMask >> 1;
}
}


A kód minden gombnyomásra egyel nagyobb számot ír ki a kijelzőre.


Itt egy másik kód talán kicsit egyszerűbb:
// Arduino 7 segment display example software
// http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)

// Define the LED digit patters, from 0 - 9
// Note that these patterns are for common cathode displays
// For common anode displays, change the 1's to 0's and 0's to 1's
// 1 = LED on, 0 = LED off, in this order:
// Arduino pin: 2,3,4,5,6,7,8

byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,0,0,1,1 } // = 9
};

void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
writeDot(0); // start with the "dot" off
}

void writeDot(byte dot) {
digitalWrite(9, dot);
}

void sevenSegWrite(byte digit) {
byte pin = 2;
for (byte segCount = 0; segCount < 7; ++segCount) {
digitalWrite(pin, seven_seg_digits[digit][segCount]);
++pin;
}
}

void loop() {
for (byte count = 10; count > 0; --count) {
delay(1000);
sevenSegWrite(count - 1);
}
delay(4000);
}


Jó Programozást!