К которой ножке нашего семисегментного индикатора нужно подключать землю?
Выводы 3 и 8 семисегментного индикатора оба являются катодами, к земле можете подключать любой из них.
Как мы храним закодированные символы цифр?
Закодированными двоичным кодом.
Каким образом мы выводим символ на индикатор?
Символы арабских цифр закодированы состоянием пинов, которые соединены с выводами соответствующих сегментов: 0, если сегмент должен быть выключен, и 1, если включен.
Задания для самостоятельного решения
Измените код, чтобы индикатор отсчитывал десятые секунды.
Листинг:
1. #define FIRST_SEGMENT_PIN 2
2. #define SEGMENT_COUNT 7
3. // префикс «0b» означает, что целое число за ним записано в
4. // в двоичном коде. Единицами мы обозначим номера сегментов
5. // индикатора, которые должны быть включены для отображения
6. // арабской цифры. Всего цифр 10, поэтому в массиве 10 чисел.
7. // Нам достаточно всего байта (англ. byte, 8 бит) для хранения
8. // комбинации сегментов для каждой из цифр.
9. byte numberSegments[10] = {
10. 0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
11. 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110
12. };
13. void setup()
14. {
15. for (int i = 0; i < SEGMENT_COUNT; ++i)
16. pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
17. }
18. voidloop()
19. {
20. // определяем число, которое собираемся отображать.
21. //Пусть им
22. // будет номер текущей секунды, зацикленный на десятке
23. intnumber = (millis() / 100) % 10;
24. // получаем код, в котором зашифрована арабская цифра
25. intmask = numberSegments[number];
26. // для каждого из 7 сегментов индикатора...
27. for (int i = 0; i < SEGMENT_COUNT; ++i) {
28. // ...определяем: должен ли он быть включен. Для этого
29. // считываем бит (англ. readbit), соответствующий текущему
30. // сегменту «i». Истина — он установлен (1), ложь — нет (0)
31. boolean enableSegment = bitRead(mask, i);
32. // включаем/выключаем сегмент на основе
33. //полученного значения
34. digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
35. }
36. }
Поменяйте программу так, чтобы вместо символа «0» отображался символ «А».
Листинг:
1. #define FIRST_SEGMENT_PIN 2
2. #define SEGMENT_COUNT 7
3. // префикс «0b» означает, что целое число за ним записано в
4. // в двоичном коде. Единицами мы обозначим номера сегментов
5. // индикатора, которые должны быть включены для отображения
6. // арабской цифры. Всего цифр 10, поэтому в массиве 10 чисел.
7. // Нам достаточно всего байта (англ. byte, 8 бит) для хранения
8. // комбинации сегментов для каждой из цифр.
9. byte numberSegments[10] = {
10. 0b01111011, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
11. 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110
12. };
13. void setup()
14. {
15. for (int i = 0; i < SEGMENT_COUNT; ++i)
16. pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
17. }
18. voidloop()
19. {
20. // определяем число, которое собираемся отображать.
21. //Пусть им
22. // будет номер текущей секунды, зацикленный на десятке
23. intnumber = (millis() / 1000) % 10;
24. // получаем код, в котором зашифрована арабская цифра
25. intmask = numberSegments[number];
26. // для каждого из 7 сегментов индикатора...
27. for (int i = 0; i < SEGMENT_COUNT; ++i) {
28. // ...определяем: должен ли он быть включен. Для этого
29. // считываем бит (англ. readbit), соответствующий текущему
30. // сегменту «i». Истина — он установлен (1), ложь — нет (0)
31. boolean enableSegment = bitRead(mask, i);
32. // включаем/выключаем сегмент на основе
33. //полученного значения
34. digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
35. }
36. }
Дополните схему и программу таким образом, чтобы сегмент-точка включался при прохождении четных чисел и выключался на нечетных
Листинг:
1. #define FIRST_SEGMENT_PIN 2
2. #define SEGMENT_COUNT 8
3. byte numberSegments[10] = {
4. 0b10111111, 0b00001010, 0b11011101, 0b01011110, 0b11101010,
5. 0b01110110, 0b11110111, 0b00011010, 0b11111111, 0b01111110,
6. };
7. void setup()
8. {
9. for (int i = 0; i < SEGMENT_COUNT; ++i)
10. pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
11. }
12. void loop()
13. {
14. int number = (millis() / 1000) % 10;
15. int mask = numberSegments[number];
16. for (int i = 0; i < SEGMENT_COUNT; ++i) {
17. boolean enableSegment = bitRead(mask, i);
18. digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
19. }
20.}
Эксперимент 14. Счётчик нажатий
В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).
Принципиальная схема
Код
1. #define DATA_PIN 13
2. #define LATCH_PIN 12
3. #define CLOCK_PIN 11
4. #define BUTTON_PIN 10
5. int clicks = 0;
6. boolean buttonWasUp = true;
7. byte segments[10] = {
8. 0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111,
9. 0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111
10. };
11. void setup()
12. {
13. pinMode(DATA_PIN, OUTPUT);
14. pinMode(CLOCK_PIN, OUTPUT);
15. pinMode(LATCH_PIN, OUTPUT);
16. pinMode(BUTTON_PIN, INPUT_PULLUP);
17. pinMode(8, OUTPUT);
18. }
19. void loop()
20. {
21. digitalWrite (8, HIGH);
22. if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
23. delay(10);
24. if (!digitalRead(BUTTON_PIN))
25. clicks = (clicks + 1) % 10;
26. }
27. buttonWasUp = digitalRead(BUTTON_PIN);
28. digitalWrite(LATCH_PIN, LOW);
29. shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);
30. digitalWrite(LATCH_PIN, HIGH);
31. }
Вопросы для проверки себя