Читайте также: |
|
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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Цена земли | | | СМЫСЛ ХРИСТИАНСКОЙ ЛЮБВИ И СУЩНОСТЬ ИДЕИ АНДРОГИНИЗМА В ФИЛОСОФИИ Н.А. БЕРДЯЕВА. |