Модуль Metro - LED матрица 8x8.
Техническое описание: Данная страница содержит подробное техническое описание модуля Metro - LED матрица 8x8 и раскрывает работу с модулем через его регистры.
Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_Metro можно на странице Wiki - LED матрица 8x8 (Metro-модуль).
Аналоги: Аналогом модуля Metro LED Матрица 8x8 является Trema модуль LED матрица 8x8 I2C-flash который построен на том же чипе, имеет те же регистры и принцип работы, но выполнен в другом формфакторе, использует только выводы шины I2C и работает с другой библиотекой.
Назначение:
Модуль Metro - LED матрица 8x8 - является цифровой монохромной светодиодной матрицей с подключением по шине I2С.
К одной шине I2C можно подключить более 100 модулей.
Модуль можно использовать в любых проектах где требуется вывод данных на монохромный дисплей размерами 8x8 пикселей. В качестве данных для вывода могут использоваться изображения, символы или бегущая строка.
Описание:
Модуль построен на базе микроконтроллера STM32F030K6 и снабжен собственным стабилизатором напряжения. Модуль отрисовывает изображение последовательно включая по одному светодиоду матрицы с частотой 100 кадров/сек. При такой частоте глаз не замечает мерцаний светодиодов и видит всё изображение матрицы целиком. Для вывода символов в памяти модуля имеется таблица изображений символов в кодировке CP866 (поддерживает Кириллицу). Изображение любого символа таблицы можно заменить на собственное. Так же модуль имеет буфер в 512 символов для хранения текста бегущей строки. Управление дисплеем и запись данных для вывода осуществляется через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.
С помощью регистров модуля можно:
- Изменить адрес данного модуля, обнаружить наличие следующего модуля и изменить адрес следующего модуля.
- Изменить частоту отрисовки матрицы от 10 до 255 кадров/сек.
- Установить яркость матрицы от 0 (0%) до 255 (100%).
- Установить поворот изображений матрицы на 0°, 90°, 180° и 270°.
- Записать/прочитать изображение матрицы в виде массива (8 регистров по 8 бит).
- Залить/стереть изображение матрицы.
- Вывести символ по его коду в кодировке CP866 (в т.ч. Кириллический).
- Изменить изображение любого символа в памяти модуля.
- Стереть/записать текст для бегущей строки (до 512 символов).
- Запустить автопрокрутку бегущей строки с указанием скорости, режима и направления сдвига.
- Выполнять одиночные сдвиги бегущей строки на один шаг или на указанную позицию.
- Включить функцию анимации появления/исчезания изображений матрицы.
Выводы модуля Metro:
У модуля имеются две колодки выводов: IN - штыревой разъем (вход модуля) и OUT гнездовой разъем (выход для подключения входа следующего модуля Metro). На каждой колодке имеется по пять выводов:
- SCL - вход/выход линии тактирования шины I2C.
- SDA - вход/выход линии данных шины I2C.
- 5V - вход питания.
- GND - общий вывод питания.
- ADR (на колодке IN) - вход установки адреса данного модуля.
- ADR (на колодке OUT) - вывод (вход/выход) обнаружения следующего модуля и установки его адреса.
Выводы SCL, SDA, 5V и GND внутрисхемно соединены с одноимёнными выводами колодок IN и OUT, и предназначены для передачи данных по шине I2C. Выводы SCL и SDA внутрисхемно НЕ подтянуты в модуле до уровня логической 1.
Вход ADR на колодке IN используется для сброса/записи адреса модуля на шине I2C. Данный вход внутрисхемно прижат к GND через резистор номиналом в 1 кОм. Если на вход ADR подать уровень логической 1, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти модуля, а значит после отключения питания, установится прежний адрес. Если при наличии логической 1 на входе ADR, записать адрес в регистр «ADDRESS» с установленным битом «IF_PIN_ADDRESS» то данный адрес станет новым адресом модуля на шине I2C и сохранится во FLASH памяти модуля, а значит сохранится и после отключения питания.
Вывод ADR на колодке OUT является двунаправленным выводом и используется для обнаружения наличия следующего модуля Metro, а также сброса/записи адреса следующего модуля. Данный вывод внутрисхемно подтянут до уровня 3,3 В через резистор в 100 кОм, что позволяет определить наличие следующего модуля Metro. Если вывод сконфигурирован как вход и на нём уровень логической 1 (3,3 В) - значит следующих модулей нет, а если на нём уровень логического 0 (GND) - значит следующий модуль есть. Если вывод сконфигурирован как выход, то установив на нём уровень логической 1 можно сбросить/записать адрес следующего модуля.
Конфигурация, чтение и установка уровней выводов ADR осуществляется через регистры модуля.
Примечание: У Trema-модуля (аналог Metro), вместо колодок IN и OUT, есть только колодка I2C.
Характеристики:
- Напряжение питания: 5 В (постоянного тока)
- Потребляемый ток: до 35 мА.
- Тип матрицы: монохромная.
- Разрешение матрицы: 8x8.
- Количество светодиодов: 64.
- Цвет свечения: красный.
- Развёртка: задаётся от 10 до 255 кадров/сек (по умолчанию 100).
- Шаг регулировки яркости: 1/255.
- Буфер для хранения бегущей строки: до 512 символов.
- Скорость бегущей строки: задаётся от 0,06 до 15 секунд на символ.
- Таблица символов: CP866 (поддерживает Кириллицу).
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
- Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
- Рабочая температура: от -40 до +65 °C.
- Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
- Вес: 7 г.
Установка адреса:
Сброс адреса (без сохранения):
Если физически подать уровень логической 1 на вход модуля ADR, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.
Установка адреса (без сохранения):
Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 0, то указанный адрес станет адресом модуля на шине I2C, но он не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.
Установка адреса (с сохранением):
Для установки адреса с его сохранением в FLASH память модуля необходимо выполнить два действия:
- Установить уровень логической 1 на входе ADR колодки IN (при этом адрес модуля сбросится в значение по умолчанию 0x09), или установить в 1 бит «SET_PIN_ADDRES» в регистре 0x01 «BITS_0» (при этом адрес модуля останется прежним).
- Записать в регистр 0x06 «ADDRESS» значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 1. ВАЖНО: запись адреса занимает не менее 30 мс.
Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 1, при сброшенном бите «SET_PIN_ADDRES» и наличии уровня логического 0 на входе ADR, то указанный адрес проигнорируется и у модуля останется прежний адрес.
Установка адреса для Trema-модуля (аналог модуля Metro):
Так как у Trema-модуля нет выводов ADR, то сбросить адрес Trema-модуля нельзя, а установка адреса осуществляется только через регистры модуля.
- Установка адреса (без сохранения) осуществляется так же как и для модуля Metro.
- Установка адреса (с сохранением) осуществляется так же, в два действия, как и для модуля Metro, но первое действие осуществляется только установкой бита в регистре «BITS_0» (в отличии от модуля Metro, где первое действие можно осуществить, либо установкой бита, либо подачей уровня логической 1 на вход ADR).
Обнаружение следующего модуля Metro:
Модули Metro подключаются друг к другу (вход к выходу) как вагоны метро.
Вход ADR колодки IN внутрисхемно прижат к GND через резистор 1 кОм, значит если данный вход ни к чему не подключён, то на нем присутствует уровень логического 0.
Вывод ADR колодки OUT внутрисхемно подтянут к 3,3 В через резистор 100 кОм, значит если данный вывод сконфигурирован как вход и ни к чему не подключен, то на нем присутствует уровень логической 1.
Следовательно, если вывод ADR колодки OUT сконфигурирован как вход и на нём присутствует уровень логической 1, значит колодка OUT свободна, а если присутствует уровень логического 0, значит к колодке OUT подключена колодка IN следующего модуля.
За конфигурацию вывода ADR колодки OUT отвечает бит «SET_PIN_OUTPUT» регистра 0x01 «BITS_0», а считать логический уровень с этого входа можно через флаг «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».
Значит для обнаружения модуля нужно сбросить бит «SET_PIN_OUTPUT» в регистре 0x01 «BITS_0» и считать бит «GET_PIN_OUTPUT» из регистра 0x00 «FLAGS_0». Если считана 1 значит колодка OUT свободна (следующих модулей нет), а если считан 0, значит к колодке OUT подключен следующий модуль.
Регистры:
Карта регистров модуля:
адрес | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
0x00 | FLG_RESET | FLG_SELF_TEST | - | FLG_GET_NAME | RAND_ADR | FLG_I2C_UP | GET_PIN_ADDRES | GET_PIN_OUTPUT |
0x01 | SET_RESET | SET_SELF_TEST | - | SET_GET_NAME | RESERVED | SET_I2C_UP | SET_PIN_ADDRES | SET_PIN_OUTPUT |
0x02 0x03 |
RESERVED |
|||||||
0x04 | MODEL[7-0] | |||||||
0x05 | VERSION[7-0] | |||||||
0x06 | ADDRESS[6-0] | IF_PIN_ADDRES | ||||||
0x07 | CHIP_ID[7-0] | |||||||
0x08 | FREQUENCY[7-0] | |||||||
0x09 | BRIGHTNESS[7-0] | |||||||
0x0A --- 0x0F |
RESERVED | |||||||
0x10 | TURN[1-0] | FILL_SCR | CLEAR_SCR | CLEAR_STR | STEP_MOD | STEP_ROUTE | ENABLE | |
0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 |
ROW_1[7-0] ROW_2[7-0] ROW_3[7-0] ROW_4[7-0] ROW_5[7-0] ROW_6[7-0] ROW_7[7-0] ROW_8[7-0] |
|||||||
0x19 | SAVE_AS[7-0] | |||||||
0x1A | SYMBOL_INPUT[7-0] | |||||||
0x1B | TEXT_INPUT[7-0] | |||||||
0x1C |
STEP_LEN[7-0] |
|||||||
0x1D | STEP_ONE | STEP_LEN[14-8] | ||||||
0x1E | TIME_STEP[7-0] | |||||||
0x1F | TIME_PAUSE[7-0] | |||||||
0x20 | TIME_START[7-0] | |||||||
0x21 | TIME_STOP[7-0] | |||||||
0x22 | FUNCTIONS[7-0] |
Регистры с адресами 0x02, 0x03, 0x0A - 0x0F зарезервированы, их биты сброшены в 0. Попытка записи данных в эти регистры будет проигнорирована модулем.
Регистр 0x00 «FLAGS_0» - содержит флаги чтения состояния модуля:
Регистр только для чтения.
- FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
- FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
- FLG_GET_NAME - Если флаг установлен, значит модуль поддерживает вывод своего названия установкой бита «SET_GET_NAME» в регистре 0x01 «BITS_0».
- RAND_ADR - Если флаг установлен, значит модуль поддерживает генерацию случайного адреса для шины I2C регистрами 0x64 «RANDOM_NUM», «RANDOM_ADR», «BUN_ADR».
- FLG_I2C_UP - Если флаг установлен, значит модуль позволяет управлять подтяжкой линий шины I2C при помощи бита «SET_I2C_UP» регистра 0x01 «BITS_0».
- GET_PIN_ADDRES - Бит повторяет логический уровень считанный со входа ADR колодки IN модуля.
- GET_PIN_OUTPUT - Бит повторяет логический уровень считанный с вывода ADR колодки OUT модуля.
- Примечание: У Trema-модуля (аналог Metro) отсутствуют флаги «GET_PIN_ADDRES» и «GET_PIN_OUTPUT», так как у этого модуля нет выводов ADR.
Регистр 0x01 «BITS_0» - содержит биты установки состояния модуля:
Регистр для записи и чтения.
- SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
- SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
- SET_GET_NAME - Бит указывает использовать регистр 0x04 «MODEL» для посимвольного вывода названия модуля. Бит сбрасывается автоматически через 300 мс после его установки. Если флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» сброшен, значит модуль не поддерживает посимвольный вывод своего названия.
- RESERVED - Третий бит регистра «BITS_0» который не используется у модулей Metro, но у Trema-модулей (аналог Metro) этот бит носит название «BLOCK_ADR», он блокирует смену и сохранение адреса для шины I2C. Бит устанавливается автоматически при попытке записи данных в регистры предназначенные только для чтения. Это защищает чип от ненамеренной смены адреса шумами на шине I2C.
- SET_I2C_UP - Бит управляет внутрисхемной подтяжкой линий шины I2C. Значение бита сохраняется в FLASH память модуля. Установка бита в «1» приведёт к подтяжке линий SDA и SCL до уровня 3,3 В. На линии I2C допускается устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния текущего бита. Если флаг «FLG_I2C_UP» регистра 0x00 «FLAGS_0» сброшен, значит управление подтяжкой не поддерживается модулем.
- SET_PIN_ADDRES - Бит является альтернативой входа ADR колодки IN. Установка бита в 1 расценивается как наличие логической 1 на входе ADR колодки IN, но не устанавливает этот уровень физически на входе, что позволяет установить и сохранить адрес модуля во FLASH память не используя вход ADR. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. Установка бита в 1 не сбрасывает адрес модуля в значение по умолчанию (0x09), как это делает физическая «1» на входе ADR колодки IN.
- SET_PIN_OUTPUT - Бит конфигурации вывода ADR колодки OUT. Установка бита в 1 сконфигурирует вывод ADR колодки OUT модуля в режим выхода и установит на нём уровень логической 1. Сброс бита в 0 сконфигурирует вывод ADR колодки OUT в режим входа, логический уровень которого можно считать через бит «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».
- Примечание: У Trema-модуля (аналог Metro) отсутствует бит «SET_PIN_OUTPUT», так как у этого модуля нет выхода ADR, а бит «SET_PIN_ADDRES» имеет другое название - «SAVE_ADR_EN».
Регистр 0x04 «MODEL» - содержит идентификатор типа модуля:
Регистр только для чтения.
- MODEL[7-0] - Для модуля Metro - LED матрица 8x8 - идентификатор равен значению 0x08.
- Если установлен флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» значит модуль поддерживает посимвольный вывод своего названия.
- Установка бита «SET_GET_NAME» регистра 0x01 «BITS_0» включает режим посимвольного вывода названия модуля. При этом в регистре 0x04 «MODEL» появится первый символ названия модуля. В процессе чтения регистра 0x04 «MODEL» он будет возвращать очередной символ названия, вплоть до символа конца строки имеющего код 0x00. Далее цикл повторится.
- Сброс бита «SET_GET_NAME» регистра 0x01 «BITS_0» отключает режим посимвольного вывода названия модуля. Регистр 0x04 «MODEL» вновь будет содержать идентификатор.
Регистр 0x05 «VERSION» - содержит версию прошивки модуля:
Регистр только для чтения.
- VERSION[7-0] - Версия прошивки (от 0x01 до 0xFF).
Регистр 0x06 «ADDRESS» - отвечает за чтение/установку адреса модуля на шине I2C:
Регистр для чтения и записи.
- ADDRESS[6-0] - 7 бит адреса модуля на шине I2C. При чтении возвращается текущий адрес модуля, при записи устанавливается указанный адрес модулю.
- IF_PIN_ADDRES - Флаг проверки состояния входа ADR колодки IN для записи адреса в FLASH память модуля.
Флаг имеет значение только при записи данных в регистр.
Если флаг сброшен, то адрес в битах ADDRESS[6-0] будет установлен временно (до отключения питания, или сброса/записи нового адреса). Если флаг «IF_PIN_ADDRES» установлен, то адрес в битах ADDRESS[6-0] будет сохранён в FLASH память модуля (останется и после отключения питания), но только если на входе ADR колодки IN, или в бите «SET_PIN_ADDRES» регистра 0x01 «BITS_0» установлена логическая 1. Если флаг «IF_PIN_ADDRES» установлен, бит «SET_PIN_ADDRES» сброшен и на входе ADR колодки IN установлен уровень логического 0, то адрес в битах ADDRESS[6-0] не будет установлен ни временно, ни постоянно. - Примечание: У Trema-модуля (аналог Metro) флаг «IF_PIN_ADDRES» имеет другое название - «SAVE_FLASH».
Регистр 0x07 «CHIP_ID» - содержит идентификатор общий для всей линейки Metro:
Регистр только для чтения.
У всех модулей линейки метро в регистре «CHIP_ID» содержится значение 0xC3. Если требуется отличить модули Metro на шине I2C от сторонних модулей, то достаточно прочитать значение регистров 0x06 «ADDRESS» и 0x07 «CHIP_ID» всех модулей на шине I2C. Если 7 старших битов регистра 0x06 «ADDRESS» хранят адрес совпадающий с адресом модуля, а в регистре 0x07 «CHIP_ID» хранится значение 0xC3, то можно с большой долей вероятности утверждать, что данный модуль является модулем Metro.
Примечание: У Trema-модуля (аналог Metro), регистр «CHIP_ID» содержит значение 0x3C.
Регистр 0x08 «FREQUENCY» - содержит частоту развертки матрицы:
Регистр только для записи.
- FREQUENCY[7-0] - Частота развертки матрицы в диапазоне от 10 до 255 кадров/сек. Значение по умолчанию 100 кадров в секунду.
Регистр 0x09 «BRIGHTNESS» - содержит яркость матрицы:
Регистр только для записи.
- BRIGHTNESS[7-0] - Яркость всех светодиодов матрицы в диапазоне от 0 (0%) до 255 (100%). Значение по умолчанию 192 (75%).
Регистр 0x10 «REG_DATA» - содержит флаги управления матрицей и бегущей строкой:
Регистр для чтения и записи.
- TURN[1-0] - Биты поворота изображения. Доступные значения от 0 (0b00) до 3 (0b11) поворачивают изображение матрицы по часовой стрелке на TURN[1-0] * 90°.
- FILL_SCR - Флаг заливки дисплея. Установка флага приведёт к установке всех битов регистров «ROW_1»...«ROW_8» и как следствие включению всех светодиодов матрицы. Флаг сбрасывается самостоятельно после выполнения заливки.
- CLEAR_SCR - Флаг очистки дисплея. Установка флага приведёт к сбросу всех битов регистров «ROW_1»...«ROW_8» и как следствие выключению всех светодиодов матрицы. Флаг сбрасывается самостоятельно после выполнения очистки.
- CLEAR_STR - Флаг очистки бегущей строки. Установка флага приведёт к очистке буфера хранения текста бегущей строки. Флаг сбрасывается самостоятельно после выполнения очистки.
- STEP_MOD - Флаг режима посимвольного сдвига бегущей строки. Установка флага приведёт к тому, что текст бегущей строки будет сдвигаться не попиксельно (влево или вправо), а отображаться посимвольно (буква за буквой). Сброс флага установит нормальный (попиксельный) режим сдвига бегущей строки.
- STEP_ROUTE - Флаг обратного направления сдвига бегущей строки. Установка флага приведёт к тому, что бегущая строка будет сдвигаться слева на право (обратно чтению). Сброс флага установит нормальное направление сдвига бегущей строки (справа на лево).
- ENABLE - Флаг разрешения работы светодиодов. Сброс флага выключает все светодиоды, но не очищает регистры «ROW_1»...«ROW_8», не останавливает выполнение функций и не останавливает бегущую строку.
Регистры 0x11-0x18 «ROW_1»-«ROW_8» - содержат изображение матрицы:
Регистр для чтения и записи.
- ROW_1[7-0] - Состояние пикселей первой строки матрицы (верхней). Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
- ROW_2[7-0] ... ROW_7[7-0] - Состояние пикселей 2...7 строк матрицы. Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
- ROW_8[7-0] - Состояние пикселей восьмой строки матрицы (нижней). Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
- Изображение матрицы можно как записывать, так и читать.
Регистр 0x19 «SAVE_AS» - позволяет заменить изображение символа в таблице символов:
Регистр для чтения и записи.
- SAVE_AS[7-0] - Запись в регистр любого значения (кода символа от 1 до 255) приведёт к перезаписи изображения данного символа на текущее изображение с матрицы. Регистр самостоятельно сбрасывается в 0 по окончании сохранения данных матрицы в таблицу изображений символов. Внесённые изменения хранятся до отключения питания.
Например, если вывести в матрицу любое изображение через регистры 0x11-0x18 «ROW_1»-«ROW_8», а потом записать число 74 (код символа «J») в регистр 0x19 «SAVE_AS», то в дальнейшем символ «J» (при выводе бегущей строки, или символа) будет выглядеть как изображение которое было выведено в матрицу.
Если вместо кода символа в регистр 0x19 «SAVE_AS» записать 0, то значения регистров «ROW_1», «ROW_2» и «ROW_3» (три верхние строки изображения) будут расценены как ширина символов («ROW_1»), межсимвольный интервал («ROW_2») и отступ символа от левого края дисплея («ROW_3»).
Регистр 0x1A «SYMBOL_INPUT» - позволяет вывести символ в матрицу по его коду:
Регистр для чтения и записи.
- SYMBOL_INPUT[7-0] - Запись в регистр любого значения (кода символа от 1 до 255) приведёт к выводу изображения этого символа (из таблицы изображений символов) в матрицу. Регистр самостоятельно сбрасывается в 0 по окончании вывода символа.
Если вместо кода символа в регистр 0x1A «SYMBOL_INPUT» записать 0, то изменятся только три верхние строки экрана в которых побитово отразятся числа: в первой строке - ширина символов, во второй строке - межсимвольный интервал и в третьей - отступ символа от левого края дисплея. Те же числа будут доступны в регистрах «ROW_1», «ROW_2» и «ROW_3».
Регистр 0x1B «TEXT_INPUT» - позволяет дописать текст бегущей строки:
Регистр для чтения и записи.
- TEXT_INPUT[7-0] - Текст бегущей строки формируется посимвольно, путём последовательного ввода кодов символов в данный регистр. Регистр самостоятельно сбрасывается в 0 по окончании добавления символа к тексту бегущей строки. Если требуется создать новую строку, а не дополнить имеющуюся, то перед вводом символов необходимо очистить буфер хранения текста бегущей строки путём установки флага «CLEAR_STR» регистра 0x10 «REG_DATA».
Регистры 0x1C-0x1D «STEP_LEN» - устанавливают бегущую строку в указанную позицию:
Регистры для чтения и записи.
- STEP_LEN[7-0] - Младший байт позиции строки (доступен в регистре 0x1C).
- STEP_LEN[14-8] - Старший байт позиции строки (доступен в регистре 0x1D).
Запись любого значения приводит к установке бегущей строки в указанную позицию. Регистры самостоятельно сбрасываются в 0 по окончании установки. Строка устанавливается в указанную позицию от левого или правого края текста (зависит от флага «STEP_ROUTE» в регистре 0x10 «REG_DATA») позиция указывается в пикселях или символах (зависит от флага «STEP_MOD» в регистре 0x10 «REG_DATA»). - STEP_ONE - Флаг сдвига бегущей строки на один шаг (доступен в регистре 0x1D). Установка флага приводит к сдвигу бегущей строки на один шаг (как STEP_LEN[14-0]++). Если флаг установлен, то значение «STEP_LEN» игнорируется. Флаг самостоятельно сбрасывается вместе с регистром «STEP_LEN» после сдвига строки.
Регистр 0x1E «TIME_STEP» - устанавливает автопрокрутку бегущей строки:
Регистр для чтения и записи.
- TIME_STEP[7-0] - Время затрачиваемое на один шаг автопрокрутки бегущей строки в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). Запись не нулевого значения включает автопрокрутку, которая работает как STEP_LEN[14-0]++ каждые TIME_STEP[7-0] сотых долей секунд. Запись 0 - отключает автопрокрутку. Если регистр «TIME_PAUSE» сброшен, то значение регистра «TIME_STEP» самостоятельно сбрасывается после завершения прокрутки всей строки.
Примечание: при автопрокрутке, к шагу нулевой позиции и шагу последней позиции бегущей строки добавляется время простоя из регистров 0x20 «TIME_START» и 0x21 «TIME_STOP».
Регистр 0x1F «TIME_PAUSE» - содержит время паузы до повторной автопрокрутки всей строки:
Регистр для чтения и записи.
- TIME_PAUSE[7-0] - Время паузы до повторной автопрокрутки всей бегущей строки в десятых долях секунд от 0 (0,0 сек) до 255 (25.5 сек). Если в регистре записано не нулевое значение, то по окончании автопрокрутки регистр «TIME_STEP» не сбрасывается, а выжидается указанная пауза и автопрокрутка возобновляется с 0 позиции. Запись 0 приводит к тому, что по окончании автопрокрутки всей бегущей строки регистр «TIME_STEP» сбрасывается, пауза не выжидается и повторная автопрокрутка не производится.
Регистр 0x20 «TIME_START» - содержит время простоя автопрокрутки на первом символе текста:
Регистр для чтения и записи.
- TIME_START[7-0] - Время простоя автопрокрутки на первом символе текста в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). По умолчанию 100 (1,00 сек).
Регистр 0x21 «TIME_STOP» - содержит время простоя автопрокрутки на последнем символе:
Регистр для чтения и записи.
- TIME_STOP[7-0] - Время простоя автопрокрутки на последнем символе текста в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). По умолчанию 100 (1,00 сек).
Регистр 0x22 «FUNCTIONS» - содержит номер функции анимации:
Регистр для чтения и записи.
- FUNCTIONS[7-0] - Появление и исчезание изображений, символов и бегущей строки можно анимировать записав в данный регистр номер функции анимации. Запись 0 приводит к завершению выполнения любой функции анимации. Все функции (кроме 0x01 и 0x02) самостоятельно сбрасывают регистр «FUNCTIONS» в 0 после завершения своей анимации.
- 0x01 - Предварительная очистка дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет чист. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
Примечание: данную функцию удобно использовать перед функциями появления изображений из пустого фона. - 0x02 - Предварительная закраска дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет полностью закрашен. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
Примечание: данную функцию удобно использовать перед функциями появления изображений из закрашенного фона. - 0x03 - Появление изображения рябью из пустого фона. Все светодиоды потухают, после чего на дисплее попиксельно (хаотично) проявляется изображение (или бегущая строка) которые были установлены до выполнения этой функции.
- 0x04 - Исчезновение изображения рябью в пустой фон. Изображение дисплея (или бегущая строка) попиксельно (хаотично) исчезает пока не останется пустой фон.
Примечание: после выполнения данной функции все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» будут сброшены (выключены все светодиоды), а в регистр 0x1E «TIME_STEP» будет записан 0 (если была включена автопрокрутка, то она будет остановлена). - 0x05 - Появление изображения рябью из закрашенного фона. Все светодиоды включаются, после чего на дисплее попиксельно (хаотично) проявляется изображение (или бегущая строка) которые были установлены до выполнения этой функции.
- 0x06 - Исчезновение изображения рябью в закрашенный фон. Изображение дисплея (или бегущая строка) попиксельно (хаотично) закрашивается пока не закрасится весь дисплей.
Примечание: после выполнения данной функции все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» будут установлены (включены все светодиоды), а в регистр 0x1E «TIME_STEP» будет записан 0 (если была включена автопрокрутка, то она будет остановлена). - 0x07-0x0A - Появление/Исчезновение сверху-вниз:
Действия данных функций аналогичны функциям 0x03-0x06, но исчезновение/появление изображения (или бегущей строки) происходит не рябью, а сверху-вниз.- 0x07 - Появление изображения сверху-вниз из пустого фона.
- 0x08 - Исчезновение изображения сверху-вниз в пустой фон.
- 0x09 - Появление изображения сверху-вниз из закрашенного фона.
- 0x0A - Исчезновение изображения сверху-вниз в закрашенный фон.
- 0x0B-0x0E - Появление/Исчезновение снизу-вверх:
Действия данных функций аналогичны функциям 0x03-0x06, но исчезновение/появление изображения (или бегущей строки) происходит не рябью, а снизу-вверх.- 0x0B - Появление изображения снизу-вверх из пустого фона.
- 0x0C - Исчезновение изображения снизу-вверх в пустой фон.
- 0x0D - Появление изображения снизу-вверх из закрашенного фона.
- 0x0E - Исчезновение изображения снизу-вверх в закрашенный фон
- 0x01 - Предварительная очистка дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет чист. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
Примеры значений регистров:
- Для работы светодиодов матрицы, флаг «ENABLE» регистра 0x10 «REG_DATA» должен быть установлен в 1.
- Изображение матрицы повторяет значения битов в регистрах 0x11-0x18 «ROW_1»-«ROW_8», где каждый бит каждого регистра отвечает за включение одного из светодиодов матрицы.
- Можно установить или сбросить сразу все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» установкой флагов «FILL_SCR» или «CLEAR_SCR» в регистре 0x10 «REG_DATA», тем самым залить или очистить всю матрицу.
- Изображение можно повернуть на 0°, 90°, 180° или 270° записав соответствующее значение в биты «TURN[1-0]» регистра 0x10 «REG_DATA».
- Яркость свечения всех светодиодов зависит от значения в регистре 0x09 «BRIGHTNESS».
- В матрицу можно вывести изображение любого символа введя его код в регистр 0x1A «SYMBOL_INPUT». Изображение символов хранится в таблице изображений символов.
- Таблицу изображений символов можно редактировать. Для этого нужно ввести изображение в регистры 0x11-0x18 «ROW_1»-«ROW_8» и записать в регистр 0x19 «SAVE_AS» код символа изображение которого требуется заменить на хранящееся в регистрах 0x11-0x18 «ROW_1»-«ROW_8».
- Матрица может отображать бегущую строку, текст которой записывается посимвольно через регистр 0x1B «TEXT_INPUT». Если требуется записать новый текст, а не дописать имеющийся, то перед вводом кодов символов в регистр 0x1B «TEXT_INPUT» необходимо очистить текст бегущей строки установив флаг «CLEAR_STR» в регистре 0x10 «REG_DATA» и дождаться его самостоятельного сброса.
- Режим и направление сдвига бегущей строки устанавливается битами «STEP_MOD» и «STEP_ROUTE» регистра 0x10 «REG_DATA».
- Бегущую строку можно установить в указанную позицию, задав её значение в регистрах 0x1C-0x1D «STEP_LEN», или сдвинуть на один шаг установив бит «STEP_ONE» в регистре 0x1D «STEP_LEN».
- Для бегущей строки можно включить режим автопрокрутки задав время регистров 0x1E - 0x21 («TIME_STEP», «TIME_PAUSE», «TIME_START» и «TIME_STOP»).
- Бегущую строку можно вывести на нескольких дисплеях. Для этого в каждый дисплей нужно ввести один и тот же текст бегущей строки. Текст должен начинаться с нескольких символов пробелов. Далее установить позицию строки для каждого дисплея с разницей в 8 пикселей: для крайнего левого дисплея в 0, следующего в 8, следующего в 16, следующего в 24 и т.д. После чего выполнять управляемую прокрутку строки. Для этого нужно сдвинуть строку всех дисплеев на один шаг (установив бит «STEP_ONE» у всех дисплеев), выждать некоторое время и повторить сдвиг строки на всех дисплеях, и т.д. пока вся строка не пройдёт по всем дисплеям. После чего повторить весь процесс с задания изначальной позиции.
- Появление и исчезновение изображений символов или бегущей строки можно анимировать указав номер функции анимации в регистре 0x22 «FUNCTIONS». Обратите внимание на то, что функции анимации исчезновения изображений меняют значение регистров 0x11-0x18 «ROW_1»-«ROW_8» и останавливают автопрокрутку бегущей строки.
Регистры 100+:
У младших версий модулей линейки «FLASH-I2C» нет блока регистров «100+», так же этого блока нет у модулей линейки «Metro», о его наличии свидетельствует установленный флаг «RAND_ADR» в регистре 0x00 «FLAGS_0».
Блок регистров «100+» с адресами от 0x64 (100)10 до 0x75 (117)10 не участвует в работе модуля, он предназначен только для обнаружения модулей с одинаковыми адресами и назначения этим модулям разных адресов, не отключая их от шины I2C.
Карта регистров 100+:
Регистры 0x64-0x65 «RANDOM_NUM» - содержат случайное число:
Регистры только для чтения.
- RANDOM_NUM[15-0] - Содержит двухбайтное случайное число позволяющее определить наличие нескольких устройств с одинаковым адресом.
- Значение из регистров читается одним пакетом (младший и старший байт). После чтения старшего байта, модуль на 5мс перейдёт в режим «молчания». В этом режиме модуль будет отправлять NACK мастеру после получения номера регистра в любых запросах.
- Если прочитать регистры 0x64-0x65 «RANDOM_NUM» дважды, с промежутком между чтениями менее 5мс, то первый раз мы получим два байта случайного числа, а второй раз модуль откажет в чтении, так как отправит NACK. Но это только в том случае, если адрес модуля уникален.
- Если адрес принадлежит нескольким устройствам, то и отвечать на запрос чтения будут несколько устройств. При первом чтении регистров 0x64-0x65 «RANDOM_NUM», биты случайного числа у разных модулей не совпадут, в результате чего один модуль передаст оба байта случайного числа и перейдёт в режим «молчания», а другой модуль (или модули) зафиксирует потерю арбитража и не передаст старший байт, следовательно, и не перейдёт в режим «молчания». Значит при повторном чтении регистров, мы опять получим два байта случайного числа от того модуля который не перешёл в режим «молчания», что будет свидетельствовать о наличии нескольких устройств на одном адресе.
Регистр 0x66 «RANDOM_ADR» - случайный адрес:
Регистр для чтения и записи.
- RANDOM_ADR[7-0] - Позволяет задавать модулю случайный временный адрес, подтверждать временный адрес и получать информацию о состоянии временного адреса.
- Запись 0x0F - Назначить модулю случайный временный адрес на 50 мс.
В регистре 0x06 «ADDRESS» останется значение постоянного адреса. - Запись 0xF0 - Подтвердить назначенный временный адрес до отключения питания.
В регистре 0x06 «ADDRESS» появится назначенный временный адрес. - Чтение 0x55 - Назначен временный случайный адрес на 50 мс.
- Чтение 0xFF - Назначенный временный адрес подтверждён до отключения питания.
- Чтение 0x00 - Временный адрес не назначался или отменён по истечении 50 мс.
- Если на шине несколько устройств имеют одинаковый адрес, то запись значения 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. За указанное время следует найти все новые временные адреса устройств и подтвердить их отправив в регистр 0x66 «RANDOM_ADR» значение 0xF0.
- Примечание: Случайный адрес модуль выбирает сам из диапазона от 0x08 до 0x7E включительно, кроме адресов запрещённых регистрами 0x67-0x75 «BUN_ADR».
Регистры 0x67-0x75 «BUN_ADR» - запрещают назначать адреса:
Регистры для чтения и записи.
- BUN_ADR_08 - Бит запрещает назначать адрес 0x08 регистром 0x66 «RANDOM_ADR».
- BUN_ADR_09 - Бит запрещает назначать адрес 0x09 регистром 0x66 «RANDOM_ADR».
- ...
- BUN_ADR_7D - Бит запрещает назначать адрес 0x7D регистром 0x66 «RANDOM_ADR».
- BUN_ADR_7E - Бит запрещает назначать адрес 0x7E регистром 0x66 «RANDOM_ADR».
- Если бит регистров 0x67-0x75 «BUN_ADR» установлен, то модуль не назначит себе случайный временный адрес соответствующий установленному биту.
- Если на шине есть несколько устройств с одинаковым адресом, то отправка команды 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. Но вновь назначенный адрес может совпасть с адресом другого модуля на шине I2C, особенно если их много. По этому перед назначением случайного временного адреса рекомендуется записать в регистры 0x67-0x75 «BUN_ADR» все найденные на шине I2C уникальные адреса.
Доступ к данным регистров:
Каждый регистр модуля хранит 1 байт данных. Так как модуль использует интерфейс передачи данных I2C, то и доступ к данным охарактеризован им.
Обмен данными по шине I2C происходит по одному биту за один такт, после каждых переданных 8 бит (1 байта) принимающее устройство отвечает передающему одним битом: «ACK» в случае успешного приёма, или «NACK» в случае ошибки. Пакет приёма/передачи данных начинается сигналом «START» и завершается сигналом «STOP». Первый байт пакета всегда состоит из 7 бит адреса устройства и одного (младшего) бита R/W.
Сигналы интерфейса передачи данных I2C:
- Для удобства восприятия сигналов они выполнены в следующих цветах:
- Зелёный - сигналы формируемые мастером.
- Красный - данные отправляемые мастером.
- Синий - данные отправляемые модулем Metro.
- Фиолетовый - данные отправляемые мастером или модулем Metro.
- «START» - отправляется мастером в начале пакета приема/передачи данных. Сигнал представляет переход уровня линии «SDA» из «1» в «0» при наличии «1» на линии «SCL».
- «STOP» - отправляется мастером в конце пакета приёма/передачи данных. Сигнал представляет переход уровня линии «SDA» из «0» в «1» при наличии «1» на линии «SCL».
- БИТ - значение бита считывается с линии «SDA» по фронту импульса на линии «SCL».
- «ACK» - бит равный 0, отправляется после успешного приёма байта данных.
- «NACK» - бит равный 1, отправляется после байта данных в случае ошибки.
- ПЕРВЫЙ БАЙТ - отправляется мастером, состоит из 7 бит адреса и бита «RW».
- «R/W» - младший бит первого байта данных указывает направление передачи данных пакета, 1 - прием (от модуля к мастеру), 0 - передача (от мастера в модуль).
- «RESTART» - повторный старт, отправляется мастером внутри пакета. Сигнал представляет из себя «START» отправленный не на свободной шине, а внутри пакета.
ВАЖНО: Все изменения на линии «SDA» должны происходить только при наличии «0» на линии «SCL» за исключением сигналов «START», «STOP» и «RESTART».
Запись данных в регистры:
- Отправляем сигнал «START».
- Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем второй байт: адрес регистра в который будет произведена запись.
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем третий байт: данные для записи в регистр.
Получаем ответ от модуля в виде одного бита «ACK». - Далее можно отправить четвёртый байт данных для записи в следующий по порядку регистр и т.д.
- Отправляем сигнал «STOP».
Пример записи в один регистр:
Запись значения 0x2A в регистр 0x06 модуля с адресом 0x09:
// Запись в регистр методами библиотеки Wire.h Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x06); // Записываем в буфер байт адреса регистра. Wire.write(0x26); // Записываем в буфер байт который будет записан в регистр. Wire.endTransmission(); // Выполняем передачу адреса и байтов из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
Пример записи в несколько регистров подряд:
Запись в модуль с адресом 0x09 нескольких значений начиная с регистра 0x12:
В регистр 0x12 запишется значение 0x0F, в следующий по порядку регистр (0x13) запишется значение 0x30 и в следующий по порядку регистр (0x14) запишется значение 0xB1.
// Запись в регистры методами библиотеки Wire.h byte data[3] = {0x0F,0x30,0xB1}; // Определяем массив с данными для передачи. Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x12); // Записываем в буфер байт адреса первого регистра. Wire.write(data, 3); // Записываем в буфер 3 байта из массива data. Wire.endTransmission(); // Выполняем передачу адреса и байт из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
Чтение данных из регистров:
- При чтении пакет делится на 2 части: запись № регистра и чтение его данных.
- Отправляем сигнал «START».
- Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем второй байт: адрес регистра из которого нужно прочитать данные.
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем сигнал «RESTART».
- Отправляем первый байт после «RESTART»: 7 бит адреса и бит «R/W» равный 1 (чтение).
Получаем ответ от модуля в виде одного бита «ACK». - Получаем байт данных из регистра модуля.
Отвечаем битом «ACK» если хотим прочитать следующий регистр, иначе отвечаем «NACK». - Отправляем сигнал «STOP».
Пример чтения одного регистра:
Чтение из модуля с адресом 0x09 байта данных регистра 0x05:
(в примере модуль вернул значение 0x01).
// Чтение регистра методами библиотеки Wire.h byte data; // Объявляем переменную для чтения байта данных. Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x05); // Записываем в буфер байт адреса регистра. Wire.endTransmission(false); // Выполняем передачу без установки состояния STOP. Wire.requestFrom(0x09, 1); // Читаем 1 байт из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART. data=wire.read(); // Сохраняем прочитанный байт в переменную data.
Пример чтения нескольких регистров подряд:
Чтение из модуля с адресом 0x09 нескольких регистров начиная с регистра 0x05:
(в примере модуль вернул значения: 0x01 из рег. 0x05, 0x13 из рег. 0x06, 0xC3 из рег. 0x07).
// Чтение регистров методами библиотеки Wire.h byte data[3]; // Объявляем массив для чтения данных. Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x05); // Записываем в буфер байт адреса регистра. Wire.endTransmission(false); // Выполняем передачу без установки состояния STOP. Wire.requestFrom(0x09, 3); // Читаем 3 байта из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART. int i=0; // Определяем счётчик номера прочитанного байта. while( Wire.available() ){ // Выполняем цикл while пока есть что читать из буфера. if(i<3){ // Лучше делать такую проверку, чтоб не записать данные за пределы массива data! data[i] = wire.read(); i++; // Читаем очередной байт из буфера в массив data. } // } //
Примечание:
- Если на линии I2C только один мастер, то сигнал «RESTART» можно заменить на сигналы «STOP» и «START».
- Рекомендуется не выполнять чтение или запись данных чаще 200 раз в секунду.
- Обратите внимание на сигналы «RESTART» и «STOP» в пакетах чтения данных:
- Между фронтом и спадом сигнала «RESTART» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 1.
- Между сигналом «NACK» и сигналом «STOP» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 0.
- Эти биты не сохраняются в модулях и не расцениваются как ошибки.
Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.
Пример вывода изображения на дисплей:
Следующий скетч демонстрирует пример вывода изображения стрелки и её вращения. В начале скетча был определён массив IMAGE с изображением стрелки направленной вверх. В коде setup данный массив был записан в регистры «REG_ROW_1» - «REG_ROW_8». А в коде loop с промежутками в 200 миллисекунд отправляется байт данных в регистр «REG_DATA» у которого постоянно увеличивается значение битов «TURN» отвечающих за поворот изображения.
#include <Wire.h> // Подключаем библиотеку Wire для работы с шиной I2C. const int ADDRESS = 0x09; // Определяем адрес модуля Metro - датчик температуры и влажности. const int REG_DATA = 0x10; // Определяем адрес регистра REG_DATA. const int REG_ROW_1 = 0x11; // Определяем адрес регистра ROW_1. byte IMAGE[8] = {0b00000000, // Определяем массив из 8 байт. 0b00011000, // где каждый байт массива это строка изображения, 0b00111100, // а каждый бит байта управляет одним светодиодом. 0b01111110, // 0b00011000, // Если бит установлен то светодиод включён. 0b00011000, // 0b00011000, // В данном примере массив содержит изображение стрелки направленной вверх. 0b00000000}; // void setup(){ // Wire.setClock(100000L); // Устанавливаем скорость передачи данных по шине I2C. Wire.begin(); // Инициируем работу c шиной I2C в качестве мастера. delay(500); // Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(REG_ROW_1); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра ROW_1. Wire.write(IMAGE, 8 ); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это 8 байт массива IMAGE. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. } // // void loop(){ // В коде loop выполняем поворот изображения меняя значения битов TURN регистра REG_DATA. Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b00000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b00000001. TURN=0, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1. Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b01000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b01000001. TURN=1, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1. Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b10000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b10000001. TURN=2, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1. Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b11000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b11000001. TURN=3, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1. }
Обсуждение