К которой ножке нашего семисегментного индикатора нужно подключать землю?

Выводы 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» отображался символ «А».

К которой ножке нашего семисегментного индикатора нужно подключать землю? - student2.ru

Листинг:

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. Счётчик нажатий

В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).

Принципиальная схема

К которой ножке нашего семисегментного индикатора нужно подключать землю? - student2.ru

К которой ножке нашего семисегментного индикатора нужно подключать землю? - student2.ru

Код

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. }

Вопросы для проверки себя

Наши рекомендации