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. Логическое сложение

На двух семисегментных дисплеях выводятся два четырехразрядных двоичных числа, а светодиоды отображают сумму двоичным кодом, обозначая единицу включенным светодиодом.

Отображение задания: На двух семисегментных дисплеях выводятся два случайных четырехразрядных двоичных числа.
Выполнение задания: Включая и выключая кнопками светодиоды установить на них результат сложения указанных двоичных чисел чисел, обозначая единицу включенным светодиодом.

Процесс работы: Однократное нажатие на кнопки S3-S8 включает соответствующий светодиод LED3-LED8. Повторное нажатие на кнопку выключает соответствующий светодиод.

Нажатие на кнопку S1 означает, что ответ готов, нажатие на кнопку S2 должно выключать все светодиоды и отображать на двух семисегментных дисплеях новое задание.

Если ответ введен правильно, то на двух семисегментных дисплеях выводятся надпись “СУПЕР” или “ВЕРНО

Если ответ введен неправильно, то на двух семисегментных дисплеях выводится надпись “ГРУСТЬ” или “НЕ ВЕРНО

Сценарий 21.11. Перевод двоичных чисел в десятичные (демо + контроль)

На светодиодах отображается двоичное число, обозначая единицу включенным светодиодом. В это же время на семисегментных дисплеях отображается соответствующее десятичное число.

Отображение задания: На светодиодах отображается двоичное число, обозначая единицу включенным светодиодом.

Выполнение задания: Пользуясь кнопками установить правильное десятичное значение на семисегментных дисплеях.

Процесс работы: В исходном положении на семисегментных дисплеях устанавливается число “0000”. Нажатие на кнопки S5-S8 увеличивает на единицу цифру в соответствующем разряде. При достижении цифрой значения “9” следующее нажатие на кнопку устанавливает данный разряд в значение “0”.

Нажатие на кнопку S1 означает, что ответ готов, нажатие на кнопку S2 должно отображать на светодиодах новое задание и отображать семисегментных дисплеях число “0000”.

Если ответ введен правильно, то на двух семисегментных дисплеях выводятся надпись “СУПЕР” или “ВЕРНО

Если ответ введен неправильно, то на двух семисегментных дисплеях выводится надпись “ГРУСТЬ” или “НЕ ВЕРНО

Отображение задания: На семисегментных дисплеях отображается десятичное значение. светодиодах отображается двоичное число.

Выполнение задания: Пользуясь кнопками установить на светодиодах правильное двоичное значение, обозначая единицу включенным светодиодом.

Процесс работы: В исходном положении все светодиоды выключены. Однократное нажатие на кнопки S3-S8 включает соответствующий светодиод LED3-LED8. Повторное нажатие на кнопку выключает соответствующий светодиод.

Нажатие на кнопку S1 означает, что ответ готов, нажатие на кнопку S2 должно отображать на семисегментных дисплеях новое задание и выключает все светодиоды.

Если ответ введен правильно, то на двух семисегментных дисплеях выводятся надпись “СУПЕР” или “ВЕРНО

Если ответ введен неправильно, то на двух семисегментных дисплеях выводится надпись “ГРУСТЬ” или “НЕ ВЕРНО

Сценарий 21.12. Игра по нотам, повтор за лампочками

(требует подключение модуля KY-006 к контакту Arduino D10)

Процесс работы: На светодиодах LED1-LED7 воспроизводится порядок и длительность нажатия соответствующих кнопок S1-S7. Нажатие каждой кнопки вызывает воспроизведение на модуле KY-006 звука, соответствующего тональности одной из семи нот. Соответствие кнопок и нот приведено ниже в таблице:

S1S2S3S4S5S6S7
ДоРеМиФаСольЛяСи

Нажатие кнопки S8 приводит к смене музыкального произведения и автоматического запуска его отображения на светодиодах. Каждое музыкальное произведение сопровождается отображением его названия на семисегментных дисплеях бегущей строкой один раз.

Сценарий 21.13. Таймер обратного отсчета

Сценарий 21.14. “Автотрасса с препятствиями”

Сценарий 21.15. Угадай число “горячо/холодно”

Сценарий 21.16. “Лемминги”

Сценарий 21.17. Повторить последовательность

Сценарий 21.18. Время реакции “нажать по команде”

7. Полученные результаты

Результатом выполнения каждого задания является:

  1. Блок-схема алгоритма работы программы в графическом редакторе (yEd).
  2. Код программы и результаты ее тестирования на лабораторном комплекте в среде разработки Arduino IDE.
  3. Отчет по лабораторной работе.

8. Форма и условия сдачи/приема работы.

Каждый этап принимается отдельно.

Задания выполняются последовательно, к выполнению следующего задания ученики приступают только после сдачи предыдущего.

Для сдачи каждого задания создается отчет по лабораторной работе в виде HTML-документа, сверстанный с помощью HTML и CSS по следующему макету:

Каждое задание оформляется отдельным документом. Все HTML-отчеты с графическими файлами объединяются в архив и передаются преподавателю указанным способом.