![image](https://habrastorage.org/files/72f/e73/b9b/72fe73b9bc0046d8bbecf87dd9326336.jpg)
В этой статье я хочу поделиться опытом использования индикатора FUTABA MSD204AJ в режиме последовательного интерфейса. Будем программировать на ардуине.
Для перевода индикатора в последовательный режим нужно установить перемычки в соответствии с даташитом:
J3-вкл
J4-выкл
J5-вкл
J6-вкл
J7-выкл
![image](https://habrastorage.org/files/1dd/853/ca6/1dd853ca6b2946ad8462308b93658cb2.jpg)
В этом режиме назначение выводов следующее (в соответствии с таблицей 11):
1 — Общий
2 — Питание 5В
3 — Вх/Вых данные
4 — Строб импульс
6 — Тактовые импульсы
Типичная посылка на индикатор состоит из стартового байта и непосредственно байта нужной нам информации (будь то команда или данные).
Стартовый байт состоит из пяти логических единиц, бита RW Чтения(1)/Записи(0), бита идентификатора RS Команды(0)/Данные(1), логического нуля — итого восемь бит. При этом запись битов в индикатора происходит по переднему фронту тактового импульса. А чтение битов из индикатора — по заднему фронту. Любая посылка чтения/записи начинается после заднего фронта сигнала Строб, а заканчивается по переднему фронту.
![image](https://habrastorage.org/files/444/5db/3e7/4445db3e715e48fa976c5654edd5de6d.jpg)
1 — в этот момент начинается прием/передачи.
2 — в этот момент заканчивается прием/передача
3 — в этот момент происходит чтение бита индикатором
4 — бит определяет Запись/Чтение
Вообщем наша задача:
1. установить строб в нуль.
2. установить вывод тактового сигнала в ноль.
3. выдать информационный бит.
3а. чутка подождать.
4. установить вывод тактового сигнала в единицу.
4а. чутка подождать.
5а пункты 2-4 делать 8 раз. — это будет первый байт.
5б пункты 2-4 сделать еще 8 раз. — это будет второй байт.
6. установить строб в единицу.
Итак, берем макетку ардуины и среду разработки.
Объявим дефайны:
#define _STB 2
#define _SCK 3
#define _SISO 4
Настроим порты ардуины:
pinMode(_STB, OUTPUT);
pinMode(_SCK, OUTPUT);
pinMode(_SISO, OUTPUT);
Установим strob и clock в лог единицу:
digitalWrite(_STB,1);
digitalWrite(_SCK,1);
И начнем отправлять биты в индикатор. Т.к. нам нужно отправлять 2 байт друг за другом, то сделаем это при помощи вложенного цикла for в for.
Создадим процедуру, обзовем ее futab. Она будет использовать две входящие переменные. x1 это первый стартовый байт, x2 — это байт данных.
void futab(int x1, int x2){
digitalWrite(_STB,0); //п.1
for (j=1; j<3; j++){
if (j==1) {cmd = x1;} else {cmd = x2;} //п. 5а, 5б
for (i=7; i>-1; i--) {
digitalWrite(_SCK,0); //п.2
digitalWrite(_SISO,bitRead(cmd,i)); //п.3 устанавливаем на выходе i-й бит байта
delayMicroseconds(2); //п.3а чутка ждем
digitalWrite(_SCK,1); //п.4
delayMicroseconds(2); //п.4а чутка ждем
}
}
digitalWrite(_STB,1); //п.6
}
Ну и всё, можно пользоваться этой процедурой. Как? А вот так:
futab(0b11111000,0b00000001); //стартовый байт и команда 4-4-1 очистки дисплея.
// или так
futab(0b11111000,0b10010101); //стартовый байт и команда 4-4-8 установки адреса DDRAM = 15h, т.е. установить курсор в 3-ю строчку 2-й столбец
// а также так
futab(0b11111010,0b010000010); //вывод кода 41h (буква А). Команда 4-4-10.
Вот так это выглядит на экране осциллографа
![image](https://habrastorage.org/files/4af/614/e6f/4af614e6f7ca4e28859e965f03ecd415.jpg)
![image](https://habrastorage.org/files/3ae/b31/d35/3aeb31d359ee497d8a5885c0d294a2f8.jpg)
Ну а дальше просто кидать команды и данные в индикатор и получать на табло всякие надписи. Сама система команд очень похожа на команды популярного контроллера HD44780, за исключением пары управляющих бит, которыми можно управлять яркостью индикатора.
Т.к. применения данного индикатора не вижу, то выведу простой Hello, world. Напишу, что называется в лоб, по буквам. Никаких библиотек, только коды символов, только хардкор.
Здесь код
/* FUTABA */
#define _STB 2
#define _SCK 3
#define _SISO 4
int i,j,n,m;
int cmd;
void futab(int x1, int x2){
digitalWrite(_STB,0);
for (j=1; j<3; j++){
// delay(1500);
if (j==1) {cmd = x1;} else {cmd = x2;}
for (i=7; i>-1; i--) {
digitalWrite(_SCK,0);
digitalWrite(_SISO,bitRead(cmd,i));
delayMicroseconds(2);
digitalWrite(_SCK,1);
delayMicroseconds(2);
}
}
digitalWrite(_STB,1);
delay(50);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // starts the serial monitor
pinMode(_STB, OUTPUT); //скажем портам "работать на выход"
pinMode(_SCK, OUTPUT);
pinMode(_SISO, OUTPUT);
digitalWrite(_STB,1); // и установим их в единички
digitalWrite(_SCK,1);
futab(248,1); //очистка дисплея команда 4-4-1
delay(2000); //подождем пару секунд
futab(250,0x87); // П
futab(250,0x50); // Р
futab(250,0x84); // И
futab(250,0x42); // В
futab(250,0x45); // Е
futab(250,0x54); // Т
futab(248,0b11000011); // команда 4-4-8 установка адрса ДДРАМ=43h это адрес вторая строка, четвертый столбец
futab(250,0x48); // H
futab(250,0x61); // a
futab(250,0x62); // b
futab(250,0x72); // r
futab(248,0b11011111); // команда 4-4-8 установка адрса ДДРАМ=5Fh это 4-я строка, 12й столбец
futab(250,0x35); // 5
futab(250,0x65); // e
futab(250,0x72); // r
futab(250,0x47); // G
futab(250,0x30); // 0
futab(248,0b10011011); // команда 4-4-8 установка адрса ДДРАМ=5Dh это 3-я строка, 10й столбец
futab(250,0x30); // 0
futab(250,0x37); // 7
futab(250,0x2E); // .
futab(250,0x30); // 0
futab(250,0x34); // 4
futab(250,0x2E); // .
futab(250,0x32); // 2
futab(250,0x30); // 0
futab(250,0x31); // 1
futab(250,0x36); // 6
for (m=1; m<5; m++){
for (n=1; n<4; n++){
futab(248,0b00011100); //команда 4-4-5 подвигаем весь экран вправо
delay(100);
}
for (n=1;n<4;n++){
futab(248,0b00011000); //команда 4-4-5 подвигаем весь экран влево
delay(100);
}
}
delay(1500);
for (n=1;n<5;n++){
futab(248,0b00001000); //команда 4-4-4 выключим дисплей
delay(100);
futab(248,0b00001100); //команда 4-4-4 включим дисплей
delay(100);
}
delay(1500);
for (n=1;n<5;n++){
futab(248,0b00111101); //команда 4-4-6 установка яркости 75%
delay(100);
futab(248,0b00111110); //команда 4-4-6 установка яркости 50%
delay(100);
futab(248,0b00111111); //команда 4-4-6 установка яркости 25%
delay(100);
futab(248,0b00111110); //команда 4-4-6 установка яркости 50%
delay(100);
futab(248,0b00111101); //команда 4-4-6 установка яркости 75%
delay(100);
futab(248,0b00111100); //команда 4-4-6 установка яркости 100%
delay(100);
}
delay(1000);
// нарисуем парочку собственных символов
futab(248,0b01001000); //команда 4-4-7 установим адрес CGRAM=8
futab(250,0b00001110);
futab(250,0b00010001);
futab(250,0b00010001);
futab(250,0b00010011); //батарейка
futab(250,0b00010111);
futab(250,0b00011111);
futab(250,0b00011111);
futab(250,0b00011111);
futab(248,0b01010000); //команда 4-4-7 установим адрес CGRAM=16
futab(250,0b00000000);
futab(250,0b00000001);
futab(250,0b00000110);
futab(250,0b00001100); //какая-то фигня
futab(250,0b00010001);
futab(250,0b00000110);
futab(250,0b00001100);
futab(250,0b00010000);
// и выведем их
futab(248,0b10010011); // курсор в координатах 1*20
futab(250,0b00000001); // вывод символа из CGRAM c адреса 1
futab(248,0b11010011); // курсор в координатах 2*20
futab(250,0b00000010); // вывод символа из CGRAM c адреса 2
}
void loop() {
}
![image](https://habrastorage.org/files/127/8b2/cbd/1278b2cbd004450fb495d61ab03719c0.jpg)
И в заключение видео работы: