🚨 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).


