Подключение и использование ЖК сегментного индикатора

VovaRino
Offline
Зарегистрирован: 09.12.2012

Привет всем.. нашел в закромах сегментный жк индикатор с контроллером HT1621B

Подключил по статье китайцев, но показывает пока только статичные сегменты 

#include "HT1621.h"

#define DATA_PIN 2
#define WR_PIN 13
#define RD_PIN 4
#define CS_PIN 5


HT1621 ht1621(DATA_PIN, WR_PIN, RD_PIN, CS_PIN);


void setup()
{
Serial.begin(9600);
if (! ht1621.begin()) {
Serial.println("Could not init device!\n");
}

//degrees celsius
// ht1621.writeMem(1, 0b1000);
// ht1621.writeMem(2, 0b1011);
}


int i = 0;
void loop()
{
ht1621.writeMem(0, 40);
// ht1621.writeMem(1, 0x1100);
// ht1621.writeMem(2, 0xfe);
// ht1621.writeMem(3, 0x7e);
// ht1621.writeMem(4, 0b1111);
// ht1621.writeMem(5, 0b1111);
// ht1621.writeMem(6, 0b1111);
// ht1621.writeMem(7, 0b1111);


ht1621.writeMem(6, 40);
// ht1621.writeMem(6, 41);
// ht1621.writeMem(1, 13);
// Serial.println(i);
// i++;
// delay(20000);

}

как запустить индикацию в динамике - ?

maksim
Offline
Зарегистрирован: 12.02.2012

VovaRino пишет:
но показывает пока только статичные сегменты
это вот интересно как это вы определили что сегмент стачтичный?
VovaRino пишет:
как запустить индикацию в динамике - ?
HT1621 это LCD-контроллер работающий всегда в динамике, иначе он был бы не бесполезен.

VovaRino
Offline
Зарегистрирован: 09.12.2012

maksim пишет:

VovaRino пишет:
но показывает пока только статичные сегменты
это вот интересно как это вы определили что сегмент стачтичный?
VovaRino пишет:
как запустить индикацию в динамике - ?
HT1621 это LCD-контроллер работающий всегда в динамике, иначе он был бы не бесполезен.

Это понятно но как допустим запустить отображение  

к примеру  

lcd.print(millis() / 1000);

те сформировать из сегментов цифру

byteman
Offline
Зарегистрирован: 20.01.2013

Добрый вечер!

Интересно, получилось ли запустить индикатор?

А то и у меня таких парочка валяется (от старых кассовых аппаратов). Хотелось бы как-то их пристроить в дело.

Кто в теме, отпишитесь, пожалуйста!

maksim
Offline
Зарегистрирован: 12.02.2012

Конечно получилось.
Только что вам писать?
 

byteman
Offline
Зарегистрирован: 20.01.2013

Хотелось бы узнать источник вышеприведенного кода, схему подключения, описание библиотеки HT1621. Попытки поиска в сети дали скудные результаты. Видимо, довольно редкий контроллер. Прошу прощения за, может, наивные вопросы.

Я не волшебник - я только учусь...(С)

maksim
Offline
Зарегистрирован: 12.02.2012

Пример, библиотека, как подключать понятно из примера.

byteman
Offline
Зарегистрирован: 20.01.2013

Спасибо, Макс!

Завтра попробую раскурить тему.

LRR
Offline
Зарегистрирован: 21.01.2013

Вопрос подключения ЖК от ККМ для меня тоже очень интересен.

У самого пока ничего не вышло.

Вот ссылка на схему моего модуля идикации от ЭКР 2102

 

maksim
Offline
Зарегистрирован: 12.02.2012

LRR пишет:

Вопрос подключения ЖК от ККМ для меня тоже очень интересен.

У самого пока ничего не вышло.

Вот ссылка на схему моего модуля идикации от ЭКР 2102

И не выидет, если будете пытаться использовать "родной драйвер дисплея" собранный на микроЭВМ КР1820, потому как какой там протокол обмена знает только тот кто его придумал.

LRR
Offline
Зарегистрирован: 21.01.2013

Сейчас на руках модуля нет, но там стоит HT1621+ плюс дополнительные элементы (1 транзистор и резисторы)

Следующим шагом планирую все отрезать, оставив лишь индикатор и HT1621

maksim
Offline
Зарегистрирован: 12.02.2012

А зачем тогда ссылку левую дали?

maksim
Offline
Зарегистрирован: 12.02.2012

Я подключал дисплей от 130-го меркурия (у byteman наверное он и есть), на этом драйвере, все работает, но очень криво (я бы даже сказал через ж..пу) разнесена память по сегментам, поэтому "плюнул на него" и выбросил.

VovaRino
Offline
Зарегистрирован: 09.12.2012

Макс есть твой пример чет не могу разобратся как сегменты задавать

 

byteman
Offline
Зарегистрирован: 20.01.2013

Доброго здоровья, уважаемые единомышленники!
С праздником Победы!
Символично, что именно в такой день получилось написАть о том, как я всё-таки "победил" это злополучное устройство - плату ЖК индикатора от старого ЭКР-3102 на контроллере HT1621B (тип самого ЖКИ установить не удалось, да и не очень-то хотелось :), обычный 8-разрядный с децимальными точками в каждом разряде). Вот он, красавец:

и

С "наскока" заставить его работать так, как я хотел, не получилось ;( пришлось немного повозиться.
Итак, я хотел, подключив данное устройство к Ардуине, с помощью несложных команд типа "позиция-цифра" выводить на индикатор нужную информацию. Для реализации задуманного пришлось изучить даташит на контроллер HT1621B
http://www.alldatasheet.com/datasheet-pdf/pdf/96976/HOLTEK/ht1621b.html
схему подключения его к ЖКИ
https://dl.dropboxusercontent.com/u/70315839/HT1621_LCD.tif
а также библиотеки HT1621.h и HT1621.cpp:
http://code.google.com/p/wirejungle/source/browse/trunk/libraries/HT1621/HT1621.cpp
В результате получилась небольшая программка, смысловым "стержнем" которой является функция writeDigit(pos, val), где pos - номер позиции 1...8 (слева направо), а val - цифра или знак, который требуется там отобразить.
Вот скриншот работающей программы вывода 4-значного числа, полученного с аналогового входа 0 (если, как у меня, вход не подключен, выводит "шумовые" случайные числа):

В скетче есть кое-какие поясняющие комментарии. Извиняйте, что на русском языке. Я не думаю, что данное устройство доступно где-нибудь за пределами русскоязычного пространства. Хотя там и без комментариев всё понятно.
Может быть, нужны какие-то пояснения по десятичной точке. Дело в том, что каждая точка "привязана" к своему знакоместу, и отобразить её независимо от цифры нельзя. Поэтому для отображения цифры с точкой пользуйтесь функцией writeDigitPoint(pos,  val).
Символ "минус" в массиве констант находится под номером 16, пробел - под 17, поэтому отображать их надо через writeDigit(pos, 16) и writeDigit(pos, 17) соответственно.

#include "HT1621.h"

#define DATA_PIN  2
#define WR_PIN    3
#define CS_PIN    4
#define RD_PIN    5

HT1621 ht1621(DATA_PIN, WR_PIN, RD_PIN, CS_PIN);

byte pos; byte val;

//массив констант для отображения цифр, минуса и пробела:
byte arr[18][3]={
 { 6,12, 6}, //0
 { 0, 0, 6}, //1
 { 2,14, 4}, //2
 { 0,14, 6}, //3
 { 4, 2, 6}, //4
 { 4,14, 2}, //5
 { 6,14, 2}, //6
 { 0, 4, 6}, //7
 { 6,14, 6}, //8
 { 4,14, 6}, //9
 { 6, 6, 6}, //A
 { 6,10, 2}, //b
 { 6,12, 0}, //C
 { 2,10, 6}, //d
 { 6,14, 0}, //E 
 { 6, 6, 0}, //F
 { 0, 2, 0}, //-
 { 0, 0, 0}  //
};
//массив констант для отображения цифр с точкой:
byte arr_point[10][3]={
 { 6,12, 14}, //0.
 { 0, 0, 14}, //1.
 { 2,14, 12}, //2.
 { 0,14, 14}, //3.
 { 4, 2, 14}, //4.
 { 4,14, 10}, //5.
 { 6,14, 10}, //6.
 { 0, 4, 14}, //7.
 { 6,14, 14}, //8.
 { 4,14, 14}  //9.
};
//создаём новую функцию для отображения по шаблону "позиция-цифра":
void writeDigit(byte pos, byte val){
  for (byte i = 0; i < 3; i++)
  ht1621.writeMem(3*pos+5+i, arr[val][i]);
  }
//а эта для отображения цифры с точкой:
void writeDigitPoint(byte pos, byte val){
  for (byte i = 0; i < 3; i++)
  ht1621.writeMem(3*pos+5+i, arr_point[val][i]);
  }
  
void setup(){
  pinMode(DATA_PIN, OUTPUT);
  pinMode(WR_PIN,   OUTPUT);
  pinMode(CS_PIN,   OUTPUT);
  
  Serial.begin(9600);
  if (! ht1621.begin()) {
  Serial.println("Could not init device!\n");
  }
}

/**********************************************************************/
//эта короткая программка получает с аналогового входа 0 4-значное число
//от 0 до 1023 и отображает его в первых 4-х разрядах:
void loop()
{
int AI0=analogRead(0);
for (byte i=4; i>0; i--) {
writeDigit(i, AI0%10); AI0=(AI0-AI0%10)/10;
 }
delay (100);
}

/******************************************************************/
//прикольная программка - как в американских боевиках "подбор кода":
//раскомментируйте, кому интересно (не забыв закомментировать LOOP, который выше)
/*
void loop()
{
pos = random(9);
val = random(10);
writeDigit(pos, val);
delay(pos*val+50);
}
*/
//или вот так:
/*
void loop()
{
for (byte pos = 1; pos <= 8; pos++) {
 val = random(10);
 writeDigit(pos, val);} 
 delay(100);
}
*/

Всё работало на версии Arduino 0022. На более поздних не проверял.
Всем успехов, ещё раз с праздником!
PS: Не пинайте сильно, если где чего не так. Буду очень рад, если поступят ещё какие предложения по улучшению и усовершенствованию.

LRR
Offline
Зарегистрирован: 21.01.2013

Спасибо! Вечером попробую. Отпишусь.

byteman
Offline
Зарегистрирован: 20.01.2013

Да, забыл сказать о подключении:

Провода с номерами 5 и 6 (маркировка на разъёме) извлекаются из фишки, "одеваются" в синюю и красную термоусадку и втыкаются в "-" и "+" Ардуины соответственно. А провода с номерами 1...4 подключаются соответственно к портам 2...5 Ардуины. На фотке видно.

Может потребоваться небольшая подстройка напряжения регулировки контрастности, т.к. +5 вольт, выдаваемые Ардуиной, могут немного отличаться от тех +5, которыми ЖКИ питался раньше.

byteman
Offline
Зарегистрирован: 20.01.2013

А вот скетч для отображения миллисекунд во всех 8-ми разрядах, как спрашивал VovaRino:

#include "HT1621.h"

#define DATA_PIN  2
#define WR_PIN    3
#define CS_PIN    4
#define RD_PIN    5

HT1621 ht1621(DATA_PIN, WR_PIN, RD_PIN, CS_PIN);

byte pos; byte val;

byte arr[10][3]={
 { 6,12, 6}, //0
 { 0, 0, 6}, //1
 { 2,14, 4}, //2
 { 0,14, 6}, //3
 { 4, 2, 6}, //4
 { 4,14, 2}, //5
 { 6,14, 2}, //6
 { 0, 4, 6}, //7
 { 6,14, 6}, //8
 { 4,14, 6}  //9
};

//создаём новую функцию для отображения по шаблону "позиция-цифра":
void writeDigit(byte pos, byte val){
  for (byte i = 0; i < 3; i++)
  ht1621.writeMem(3*pos+5+i, arr[val][i]);
  }
  
void setup(){
  pinMode(DATA_PIN, OUTPUT);
  pinMode(WR_PIN,   OUTPUT);
  pinMode(CS_PIN,   OUTPUT);
  
  ht1621.begin();
}

void loop()
{
unsigned long AI0=millis();
for (byte i=8; i>0; i--) {
writeDigit(i, AI0%10); AI0=(AI0-AI0%10)/10;
 }
delay (10);
}
kip96
Offline
Зарегистрирован: 06.06.2013

Здравствуйте всем! У меня в закромах валяется такой-же индикатор от экр2102. Хочу его тоже запустить. Но пишу на бейсике. Не могли бы рассказать "на пальцах", как его инициализировать. Т.е. какие команды подать на 1621,прежде чем выводить информацию на экран. При включении сразу выводить не получается. Спасибо.

byteman
Offline
Зарегистрирован: 20.01.2013

kip96 пишет:
...Не могли бы рассказать "на пальцах", как его инициализировать...

Лучше, чем написано в фирменном даташите (ссылку на него ищите выше в посте #14), рассказать "на пальцах" Вам не сможет никто. В-частности, там на стр. 14 приведены временнЫе диаграммы команд управления, а на стр. 18-19  - список всех доступных команд. Я пользовал штатную библиотеку HT1621.h/HT1621.cpp. Естественно, на С++. Что касаемо Бейсика, я помню его только 25-летней давности (ZX-Spectrum) и вряд ли он имеет много общего с современным Бейсиком. По крайней мере, мне было проще изучить С++, чем пытаться переучиваться со старого Бейсика на новый.

kip96
Offline
Зарегистрирован: 06.06.2013

Ну это понятно. Пишу в БаскомАВР, команду в 1621 я могу послать. Вопрос как его заставить работать с данным индикатором. Какой BIAS включать?.  библиотеки нет, поэтому делаю так shiftout bias, shiftout sys_en, shiftout lcd_on. После чего включаются все сегменты. При команде lcd_off он отключается. Если отправляю команду b101000111111111......(т.е. обращаюсь к озу с адреса(), и заношу туда еденици, ну или нули(пробовал по разному)) - реакции нет. Что ещё я не включил, какой мультиплекс у индикатора?

byteman
Offline
Зарегистрирован: 20.01.2013

А посмотрите схему, она в отличном качестве; хорошо видно, что используются 3 линии COM (COM0, COM1 и COM2) и 24 линии адреса сегментов (с 8 по 31). Там же приведена таблица посегментной распиновки ЖКИ. Например, чтобы отобразить цифру "0", скажем, в 3-м разряде, надо по адресам 14, 15, 16 (0b01110, 0b01111, 0b10000) записать соответственно 6, 12, 6 (0b0110, 0b1100, 0b0110).

Таким образом, для того чтобы включились все сегменты, надо последовательно (хотя не обязательно по порядку) по адресам с 8 по 31 записать все единицы (0b1111). Почему у Вас сразу после команды инициализации включаются сразу все сегменты, я не знаю. Могу только посоветовать попробовать поизменять напряжение управления контрастностью (вывод 16 контроллера).

Molvik
Offline
Зарегистрирован: 15.05.2013

Может кому понадибится.

Моя моделька этого индикатора для Proteus.

http://kazus.ru/forums/showpost.php?p=691031&postcount=1539

kip96
Offline
Зарегистрирован: 06.06.2013

Спасибо! Кстати На этом контроллере есть ещё индикатор от ккм "Меркурий 130" . В нём 10 знакомест, нет чёрточек  и размер всего блока- размер индикатора. Я такой уже заюзал.

Dronvod
Dronvod аватар
Offline
Зарегистрирован: 29.03.2015

Не завёл, пробывал 0022 ругается и не компилит...

MEINFRAME
Offline
Зарегистрирован: 12.09.2015

ЗАвёл. Не скажу, что с первого раза. 

https://www.youtube.com/watch?v=OKxM_Um8YhQ

kip96
Offline
Зарегистрирован: 06.06.2013

Я даже немного доработал

xlin
Offline
Зарегистрирован: 19.01.2017

тоже давно валялся данный дисплей,стало интересно-заведется или нет - запустился!!! надо будет изготовить что нибудь из измерительного,темпер или вольтметр или часики сделать...





sergeikip1
Offline
Зарегистрирован: 10.01.2018

по поводу последнего дисплея я уже находил проект часов на мега8

sergeikip1
Offline
Зарегистрирован: 10.01.2018
sergeikip1
Offline
Зарегистрирован: 10.01.2018

В протеусе работает эта прошивка TC_ATM8_LCD1621B1
как ее прицепить в среду Ардуино подскажите в этом я ещё новичек
хотелось бы ещё что-нибудь сделать с этим индикатором