Управління сегментним цифровим індикатором "Секундомір"

Способи підключення світлодіодів, біжучих вогнів, світлодіодних панелей та індикаторів, гирдлянди, світлодіодні стрічки та керування ними. Дисплеї та цифрові сегментні індикатори
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 98
З нами з: 16 травня 2017 18:18

Управління сегментним цифровим індикатором "Секундомір"

Повідомлення Arduino » 25 травня 2017 19:21

В цьому прикладі розглядається простий секундомір, який рахує до 10.

Комутація
Виводи 3 і 8 семисегментного індикатору є катодами, до землі можа підключати будь-який з них.
Уважно розгляньте схему, співставте сегменти індикатора з номерами його ніжок, а ті, в свою чергу, з пінами Arduino, до яких ми їх підключаємо.
Вивід 5 індикатора - це "крапка". Ми не використовуємо її в цьому експерименті
Сегменти індикатора за конструкцією є просто світлодіодами, тому ми використовуємо резистор з кожним з них для обмеження струму.
l13-sekundomer1.jpg

#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7

// префікс «0b» означає, що ціле число за ним записано в
// в двійковому коді. Одиницями ми позначимо номера сегментів
// індикатора, які повинні бути включені для відображення
// арабської цифри. Всього цифр 10, тому в масиві 10 чисел.
// Нам достатньо всього байта (англ. Byte, 8 біт) для зберігання
// комбінації сегментів для кожної з цифр.
byte numberSegments [ 10 ] = {
0b00111111 , 0b00001010 , 0b01011101 , 0b01011110 , 0b01101010 ,
0b01110110 , 0b01110111 , 0b00011010 , 0b01111111 , 0b01111110 ,
} ;

void setup ( )
{
for ( int i = 0 ; i < SEGMENT_COUNT ; ++ i )
pinMode ( i + FIRST_SEGMENT_PIN, OUTPUT ) ;
}

Void loop ( )
{
// визначаємо число, яке збираємося відображати. Нехай їм
// буде номер поточної секунди, зациклений на десятці
int number = ( millis ( ) / 1 000 ) % 10 ;
// отримуємо код, в якому зашифрована арабська цифра
int mask = numberSegments [ number ] ;
// для кожного з 7 сегментів індикатора ...
for ( int i = 0 ; i < SEGMENT_COUNT ; ++ i ) {
// ... визначаємо: чи повинен він бути включений. Для цього
// зчитуємо біт (англ. Read bit), що відповідає поточному
// сегменту «i». Істина - він встановлений (1), брехня - немає (0)
boolean enableSegment = bitRead ( mask, i ) ;
// включаємо / вимикаємо сегмент на основі отриманого значення
digitalWrite ( i + FIRST_SEGMENT_PIN, enableSegment ) ;
}
}


Розяснення до коду роботи семисегментного індикатора
  • Ми створили масив типу byte: кожен його елемент це 1 байт, 8 біт, може приймати значення від 0 до 255.
  • Символи арабських цифр закодовані станом пинов, які з'єднані з висновками відповідних сегментів: 0, якщо сегмент повинен бути вимкнений, і 1, якщо включений.
  • У змінну maskми поміщаємо той елемент масиву numberSegments, який відповідає поточній секунді, обчисленої в попередньої інструкції.
  • У циклі forми пробігаємо по всіх сегментах, витягуючи з допомогою вбудованої функції bitRead потрібний стан для поточного Піна, в яке його і наводимо за допомогою digitalWriteі змінної enableSegment
  • bitRead(x, n) повертає boolean значення: n -ний біт праворуч в байті x

Відповісти

Повернутись до “Індикація та LED, дисплеї”