1. Название работы
2. Цель работы
Целью работы является приобретение практических навыков
3. Состав лабораторного комплекта
Схема подключения
TM1638 |
DIO -> Arduino D8 CLK -> Arduino D9 STB -> Arduino D7 GND -> Gng VCC -> 5V |
5. Исходные данные и материалы
Статья, посвященная работе с TM1638
Статья 2, посвященная работе с TM1638
Тест-код
/*===================================================================================== // Author : Handson Technology // Project : Arduino Uno with TM1638 Display+Keypad Module // Description : Display message on 8-digit 7-Segments, switch On LED with each key press. // Source-Code : TM1638_2.ino // ==================================================================================== */ const int strobe = 7; const int clock = 9; const int data = 8; void sendCommand(uint8_t value) { digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, value); digitalWrite(strobe, HIGH); } void reset() { sendCommand(0x40); // set auto increment mode digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); // set starting address to 0 for(uint8_t i = 0; i < 16; i++) { shiftOut(data, clock, LSBFIRST, 0x00); } digitalWrite(strobe, HIGH); } void setup() { pinMode(strobe, OUTPUT); pinMode(clock, OUTPUT); pinMode(data, OUTPUT); sendCommand(0x8f); // activate reset(); } #define COUNTING_MODE 0 #define SCROLL_MODE 1 #define BUTTON_MODE 2 void loop() { static uint8_t mode = COUNTING_MODE; switch(mode) { case COUNTING_MODE: mode += counting(); break; case SCROLL_MODE: mode += scroll(); break; case BUTTON_MODE: buttons(); break; } delay(200); } bool counting() { /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/ uint8_t digits[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; static uint8_t digit = 0; sendCommand(0x40); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); for(uint8_t position = 0; position < 8; position++) { shiftOut(data, clock, LSBFIRST, digits[digit]); shiftOut(data, clock, LSBFIRST, 0x00); } digitalWrite(strobe, HIGH); digit = ++digit % 10; return digit == 0; } bool scroll() { uint8_t scrollText[] = { /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*H*/ /*E*/ /*L*/ /*L*/ /*O*/ /*.*/ /*.*/ /*.*/ 0x76, 0x79, 0x38, 0x38, 0x3f, 0x80, 0x80, 0x80, /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*H*/ /*E*/ /*L*/ /*L*/ /*O*/ /*.*/ /*.*/ /*.*/ 0x76, 0x79, 0x38, 0x38, 0x3f, 0x80, 0x80, 0x80, }; static uint8_t index = 0; uint8_t scrollLength = sizeof(scrollText); sendCommand(0x40); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xc0); for(int i = 0; i < 8; i++) { uint8_t c = scrollText[(index + i) % scrollLength]; shiftOut(data, clock, LSBFIRST, c); shiftOut(data, clock, LSBFIRST, c != 0 ? 1 : 0); } digitalWrite(strobe, HIGH); index = ++index % (scrollLength << 1); return index == 0; } void buttons() { uint8_t promptText[] = { /*P*/ /*r*/ /*E*/ /*S*/ /*S*/ /* */ /* */ /* */ 0x73, 0x50, 0x79, 0x6d, 0x6d, 0x00, 0x00, 0x00, /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*b*/ /*u*/ /*t*/ /*t*/ /*o*/ /*n*/ /*S*/ /* */ 0x7c, 0x1c, 0x78, 0x78, 0x5c, 0x54, 0x6d, 0x00, /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static uint8_t block = 0; uint8_t textStartPos = (block / 4) << 3; for(uint8_t position = 0; position < 8; position++) { sendCommand(0x44); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xC0 + (position << 1)); shiftOut(data, clock, LSBFIRST, promptText[textStartPos + position]); digitalWrite(strobe, HIGH); } block = (block + 1) % 16; uint8_t buttons = readButtons(); for(uint8_t position = 0; position < 8; position++) { uint8_t mask = 0x1 << position; setLed(buttons & mask ? 1 : 0, position); } } uint8_t readButtons(void) { uint8_t buttons = 0; digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0x42); pinMode(data, INPUT); for (uint8_t i = 0; i < 4; i++) { uint8_t v = shiftIn(data, clock, LSBFIRST) << i; buttons |= v; } pinMode(data, OUTPUT); digitalWrite(strobe, HIGH); return buttons; } void setLed(uint8_t value, uint8_t position) { pinMode(data, OUTPUT); sendCommand(0x44); digitalWrite(strobe, LOW); shiftOut(data, clock, LSBFIRST, 0xC1 + (position << 1)); shiftOut(data, clock, LSBFIRST, value); digitalWrite(strobe, HIGH); }
6. Задания к лабораторным работам
Задание 21.01
Получить сигнал с модуля TM1638 при нажатии на кнопку. Вывод информации выполнять в Serial Monitor
Задание 21.02
По очереди включить на 0.5 секунды и выключить каждый светодиод модуля TM1638.
Задание 21.03
По очереди на каждом семисегментном дисплее модуля TM1638 включить и выключить каждый сегмент.
Задание 21.04
Сценарии
Сценарий 21.10. Логическое сложение
Сценарий 21.101. Демонстрационный вариант:
На двух семисегментных дисплеях выводятся два четырехразрядных двоичных числа, а светодиоды отображают сумму двоичным кодом, обозначая единицу включенным светодиодом.
Сценарий 21.102. Контрольный вариант:
Отображение задания: На двух семисегментных дисплеях выводятся два случайных четырехразрядных двоичных числа.
Выполнение задания: Включая и выключая кнопками светодиоды установить на них результат сложения указанных двоичных чисел чисел, обозначая единицу включенным светодиодом.
Процесс работы: Однократное нажатие на кнопки S3-S8 включает соответствующий светодиод LED3-LED8. Повторное нажатие на кнопку выключает соответствующий светодиод.
Нажатие на кнопку S1 означает, что ответ готов, нажатие на кнопку S2 должно выключать все светодиоды и отображать на двух семисегментных дисплеях новое задание.
Если ответ введен правильно, то на двух семисегментных дисплеях выводятся надпись “СУПЕР” или “ВЕРНО“
Если ответ введен неправильно, то на двух семисегментных дисплеях выводится надпись “ГРУСТЬ” или “НЕ ВЕРНО“
Сценарий 21.11. Перевод двоичных чисел в десятичные (демо + контроль)
Сценарий 21.111. Демонстрационный вариант:
На светодиодах отображается двоичное число, обозначая единицу включенным светодиодом. В это же время на семисегментных дисплеях отображается соответствующее десятичное число.
Сценарий 21.112. Контрольный вариант 1:
Отображение задания: На светодиодах отображается двоичное число, обозначая единицу включенным светодиодом.
Выполнение задания: Пользуясь кнопками установить правильное десятичное значение на семисегментных дисплеях.
Процесс работы: В исходном положении на семисегментных дисплеях устанавливается число “0000”. Нажатие на кнопки S5-S8 увеличивает на единицу цифру в соответствующем разряде. При достижении цифрой значения “9” следующее нажатие на кнопку устанавливает данный разряд в значение “0”.
Нажатие на кнопку S1 означает, что ответ готов, нажатие на кнопку S2 должно отображать на светодиодах новое задание и отображать семисегментных дисплеях число “0000”.
Если ответ введен правильно, то на двух семисегментных дисплеях выводятся надпись “СУПЕР” или “ВЕРНО“
Если ответ введен неправильно, то на двух семисегментных дисплеях выводится надпись “ГРУСТЬ” или “НЕ ВЕРНО“
Сценарий 21.112. Контрольный вариант 2:
Отображение задания: На семисегментных дисплеях отображается десятичное значение. светодиодах отображается двоичное число.
Выполнение задания: Пользуясь кнопками установить на светодиодах правильное двоичное значение, обозначая единицу включенным светодиодом.
Процесс работы: В исходном положении все светодиоды выключены. Однократное нажатие на кнопки S3-S8 включает соответствующий светодиод LED3-LED8. Повторное нажатие на кнопку выключает соответствующий светодиод.
Нажатие на кнопку S1 означает, что ответ готов, нажатие на кнопку S2 должно отображать на семисегментных дисплеях новое задание и выключает все светодиоды.
Если ответ введен правильно, то на двух семисегментных дисплеях выводятся надпись “СУПЕР” или “ВЕРНО“
Если ответ введен неправильно, то на двух семисегментных дисплеях выводится надпись “ГРУСТЬ” или “НЕ ВЕРНО“
Сценарий 21.12. Игра по нотам, повтор за лампочками
(требует подключение модуля KY-006 к контакту Arduino D10)
Процесс работы: На светодиодах LED1-LED7 воспроизводится порядок и длительность нажатия соответствующих кнопок S1-S7. Нажатие каждой кнопки вызывает воспроизведение на модуле KY-006 звука, соответствующего тональности одной из семи нот. Соответствие кнопок и нот приведено ниже в таблице:
S1 | S2 | S3 | S4 | S5 | S6 | S7 |
До | Ре | Ми | Фа | Соль | Ля | Си |
Нажатие кнопки S8 приводит к смене музыкального произведения и автоматического запуска его отображения на светодиодах. Каждое музыкальное произведение сопровождается отображением его названия на семисегментных дисплеях бегущей строкой один раз.
Сценарий 21.13. Таймер обратного отсчета
Сценарий 21.14. “Автотрасса с препятствиями”
Сценарий 21.15. Угадай число “горячо/холодно”
Сценарий 21.16. “Лемминги”
Сценарий 21.17. Повторить последовательность
Сценарий 21.18. Время реакции “нажать по команде”
7. Полученные результаты
Результатом выполнения каждого задания является:
- Блок-схема алгоритма работы программы в графическом редакторе (yEd).
- Код программы и результаты ее тестирования на лабораторном комплекте в среде разработки Arduino IDE.
- Отчет по лабораторной работе.
8. Форма и условия сдачи/приема работы.
Каждый этап принимается отдельно.
Задания выполняются последовательно, к выполнению следующего задания ученики приступают только после сдачи предыдущего.