🚨 TM1650
Нещодавно мені стало цікаво запустити 7-сегментний LED дисплей від ультра-дешевої мікросхеми TM1650. На момент написання цієї статті (кінець 2024, 1$ = 42₴) вона коштує 6 гривень в наших магазинах і ще в 1.5-2 рази дешевше на Алі. Тобто можна сказати майже нічого, якщо відштовхуватися від того, що вона вміє. А вміє вона в мультиплексинг: можна збільшити собі кількість входів або виходів. Тобто можна наприклад драйвити і той самий 7-сегментний дисплей (насправді 8 х 4 знаки) або зчитувати показники з 28 кнопок. Керувати TM1650 можна з I2C інтерфейсу або ж просто з пінів, імітуючи шину даних і шину тактової генерації.
Протокол керування
Шлях, який я обрав був найпростіший — I2C. Але як виявилось, підтримки I2C в TM1650 насправді немає. Принаймні даташит нічого не говорить про цей інтерфейс. Але якщо поглянути в даташит на протокол комунікації, то неозброєним оком видно деякі атрибути I2C: адреса, ACK (acknowledgement) біт підтвердження, START/STOP сигнали.
Тобто хоч виробник (китайська Titan Microelectronics) цього і не документує, але TM1650 все-таки можна драйвити від I2C інтерфейсу Вашого мікроконтролера, але з нюансами. Нюанс полягає в тому, що TM1650 не має адреси як такої. Натомість кожна операція з цією мікросхемою має свою окрему адресу. По факту це означає — скільки можливих операцій стільки і адрес, з чого можна зробити висновок, що краще таку мікросхему підключати або до окремо виділеного I2C або взагалі емулювати комунікацію вільними GPIO. Як уже писав вище, я обрав I2C. Ось перелік операцій (і їх адрес), які можна виконати над LED дисплеєм:
0x68
- задати значення в 1-ий символ дисплею0x6A
- задати значення в 2-ий символ дисплею0x6C
- задати значення в 3-ий символ дисплею0x6E
- задати значення в 4-ий символ дисплею0x48
- керування дисплеєм: увімкн/вимкн дисплей, змінити яскравість, увімкн/вимкн підтримку 8-го сегменту — десяткової коми
🔢 Виведення символів
Задати символ на дисплеї дуже просто: на потрібну адресу потрібно відправити значення. Значення формується на основі того, які сегменти потрібно увімкнути.
Наприклад, щоб на першому символі вивести цифру 7, потрібно на адресу 0x68
відправити значення 0b00000111
. За цифру 7 відповідають сегменти a, b, c на малюнку вище. Тобто крайні праві (LSB) 3 біти потрібно увімкнути, що і дає нам 0b00000111
.
Інший приклад: виведемо нуль. Згідно малюнку вище нам треба увімкнути біти наступних сегментів: a, b, c, d, e, f. Отримуємо 0b00111111
(або ж 0x3F
). Якщо ми хочемо вивести нуль, але цього разу з десятковою комою, то треба ще додатково увімкнути 8-ий біт, отримуємо 0b10111111
(тобто 0xBF
). Звісно таблиця з можливими символами вище не повна і можна або придумати свої символи, або піддивитися в інтернеті, що ще можна вивести на 7-ми сегментах. Ну наприклад: r
, a
, S
, L
, H
, h
і т.д.
🎮 Керування
Керування дисплеєм здійснюється за адресою 0x48
. Принцип той самий як і з виведенням символів: потрібно відправити 1 байт даних на цю адресу.
Які біти за що відповідають можна дізнатися з цієї таблиці:
Тобто, якщо потрібно виставити 4-ий рівень яскравості і при цьому щоб дисплей залишався увімкненим потрібно відправити 0b01000001
на адресу 0x48
.
Для наглядності давайте скористаємось логічним аналізатором і подивимось як виглядає виведення числа 1 (0b00000110
- сегменти b і c) на перший символ (0x68
) і виставлення 4-го рівня яскравості (0b01000001
).