Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

х разрядный 7-ми сегментный индикатор

Читайте также:
  1. Денежные индикаторы
  2. Динамика целевых индикаторов и показателей эффективности реализации федеральной целевой программы
  3. ЖИДКОКРИСТАЛЛИЧЕСКИЕ ИНДИКАТОРЫ
  4. И некоторые другие "старые и надежные" индикаторы.
  5. Индикатор поля частотомер ST-007
  6. Индикатор скорости изменения цены (Price Rate-of- Change).
  7. Индикатора

4-х разрядный 7-ми сегментный индикатор как бы состоит из 4-х 1-но разрядных индикаторов, которые вы уже знаете как работают. Особенность 4-х разрядного индикатора в следующем: аноды («+») одинаковых сегментов разных разрядов соединены параллельно, а катод («-») у всех сегментов одного разряда – общий, но у разных разрядов они разные. Таким образом, для управления сегментами - подаем +5В на определенные пины («зажигаем» определенные сегменты), чтобы выбрать определенный разряд – подаем 0В (GND) на определенный пин, отвечающий за катод. Чтобы отобразить число на всех четырех разрядах, сначала устанавливаем +5В на пинах, соответствующих цифре на первом разряде, затем подаем на первый разряд «землю» - светодиоды загораются, делаем задержку, отключаем «землю» от первого разряда (светодиоды гаснут); далее устанавливаем +5В на пинах, соответствующих цифре на втором разряде, затем подаем на второй разряд «землю» - светодиоды загораются, делаем задержку, отключаем «землю» от второго разряда и т. д. со всеми четырьмя разрядами: как только дошли до 4-го – переключаемся на первый и цикл повторяется. Если делать это переключение очень быстро, то человеческий глаз не заметит его, и для него все цифры будут гореть постоянно.

Следующие рисунки поясняют сказанное:

Подключение индикатора к Arduino:

 

Номер пина Arduino Номер пина индикатора Сегмент индикатора
    e
    d
    dp (точка)
    c
    g
    Катод 1-го разряда (GND)
    b
    Катод 2-го разряда (GND)
    Катод 3-го разряда (GND)
    f
    a
    Катод 4-го разряда (GND)

Исходный код программы:

 

#define DELAY 5 // время в мс, на которое включается один разряд

byte razrPins[] = {6, 8, 9, 12}; // пины, отвечающие за разряды (к ним подключаются

// катоды разрядов)

byte segPins[] = {11, 7, 4, 2, 13, 10, 5, 3}; // пины, отвечающие за сегменты:

// A, B, C, D, E, F, G, DP соответственно

byte i = 0;

byte digits[10] = { // Биты соответствуют: DP, G, F, E, D, C, B, A

0b00111111, // 0

0b00000110, // 1

0b01011011, // 2

0b01001111, // 3

0b01100110, // 4

0b01101101, // 5

0b01111101, // 6

0b00000111, // 7

0b01111111, // 8

0b01101111 // 9

};

byte charC = 0b00111001; // "C" // символы, которые пригодятся потом

byte charGrad = 0b01100011; //"o"

byte charProc = 0b01011100; //"%"

/*

numRabSeg - количество сегментов, которые будут работать (от 1 до 4) (считая от правого края)

point - какая точка горит (от 1 до 4) (считая от правого края)

seg1, seg2, seg3, seg4 - сегменты (считая от правого края)

time - время вывода числа в мс

*/

void ledDisplayPrint(byte numRabSeg, byte point, byte seg4, byte seg3, byte seg2, byte seg1, float time)

{

unsigned long ltime = millis();

i = 0;

while (millis() - ltime <= time)

{

if(i == numRabSeg)

i = 0;

digitalWrite(segPins[7], LOW);

switch (i)

{

case 0: // самый правый разряд

for(int i = 0; i < 7; i++)

if(seg1 & (1 << i)) // очень важно, разберитесь! (вспомните, объяснение на

// занятии: на каждой итерации сдвиг единицы

// влево и логическое умножение на число, биты которого

// соответствуют сегментам: если бит установлен (1) –

// зажигаем сегмент, если нет (0) - гасим)

digitalWrite(segPins[i], HIGH);

else

digitalWrite(segPins[i], LOW);

if (point == (i+1)) // если точка

digitalWrite(segPins[7], HIGH);

pinMode(razrPins[0], OUTPUT);

delay(DELAY);

pinMode(razrPins[0], INPUT);

break;

case 1: // второй разряд (справа)

for(int i = 0; i < 7; i++)

if(seg2 & (1 << i))

digitalWrite(segPins[i], HIGH);

else

digitalWrite(segPins[i], LOW);

if (point == (i+1))

digitalWrite(segPins[7], HIGH);

pinMode(razrPins[1], OUTPUT);

delay(DELAY);

pinMode(razrPins[1], INPUT);

break;

case 2: // третий разряд (справа)

for(int i = 0; i < 7; i++)

if(seg3 & (1 << i))

digitalWrite(segPins[i], HIGH);

else

digitalWrite(segPins[i], LOW);

if (point == (i+1))

digitalWrite(segPins[7], HIGH);

pinMode(razrPins[2], OUTPUT);

delay(DELAY);

pinMode(razrPins[2], INPUT);

break;

case 3: // самый левый разряд

for(int i = 0; i < 8; i++)

if(seg4 & (1 << i)) // вот это обязательно прошарь и объясни

digitalWrite(segPins[i], HIGH);

else

digitalWrite(segPins[i], LOW);

if (point == (i+1))

digitalWrite(segPins[7], HIGH);

pinMode(razrPins[3], OUTPUT);

delay(DELAY);

pinMode(razrPins[3], INPUT);

break;

}

digitalWrite(segPins[7], LOW);

i++;

}

}

void setup()

{

for(i = 0; i < 8; i++)

pinMode(segPins[i], OUTPUT);

}

void loop()

{

ledDisplayPrint(3, 3, 0, digits[3], digits[1], digits[4], 5000); // вывести "3.14"

ledDisplayPrint(4, 0, digits[2], digits[5], charGrad, charC, 5000); // вывести "25oC"

ledDisplayPrint(4, 0, digits[3], digits[3], charGrad, charProc, 5000); // вывести "33%"

}

Домашнее задание:

Подумайте над тем, как сделать часы на основе данного индикатора.


Дата добавления: 2015-07-20; просмотров: 603 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Цена земли| СМЫСЛ ХРИСТИАНСКОЙ ЛЮБВИ И СУЩНОСТЬ ИДЕИ АНДРОГИНИЗМА В ФИЛОСОФИИ Н.А. БЕРДЯЕВА.

mybiblioteka.su - 2015-2024 год. (0.023 сек.)