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.101. Контрольный вариант:

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

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

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

Если ответ введен правильно, то на двух семисегментных дисплеях выводятся выводится надпись “”

Перевод двоичных чисел в десятичные (демо + контроль)

Игра по нотам, повтор за лампочками

Таймер обратного отсчета

“Автотрасса с препятствиями”

Угадай число “горячо/холодно”

Лемминги

Повторить последовательность

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

Визуализация двоичного кода (лед в 01)