Воскресенье, 19.11.2017, 07:06
GreatHard Venture Capital
Приветствую Вас Гость | RSS
Главная HD44780 или KS0066U, а так же 1602 и другие - Форум Регистрация Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Администратор 
Форум » Разработка и производство электронных устройств » Разработка микропроцессорных устройств » HD44780 или KS0066U, а так же 1602 и другие (Несколько замечаний по знакосинтезирующим ЖКИ)
HD44780 или KS0066U, а так же 1602 и другие
Администратор Дата: Среда, 11.11.2009, 21:35 | Сообщение # 1
Рядовой
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
О популярных знакосинтезирующих, матричных индикаторах известно много, но всё же попробуем написать ещё, возможно начинающие радиолюбители будут иметь меньше проблем.

1. Что же такое 1602 всё просто это индикатор на две строки по шестнадцать символов в каждой. Соответственно 2004 будет четырёхстрочное по двадцать символов в строке. Буквы перед этими цифрами, как правило кодируют производителя и тип индикатора. Буквы и цифры после размер, наличие подсветки, цвет, кодовую таблицу и др.

Пример расшифровки - S C 1602A N L B SA G B XXX

2. Как правило все индикаторы такого типа собраны на (Dot Matrix Liquid Crystal Display Controller/Driver) двух производителей HITACHI (HD44780) или SAMSUNG (KS0066U), а так же прочих китайских аналогах. Поскольку один контроллер управляет ограниченным числом символов, на плате индикатора их может быть 1, 2, 4, 8 за больше не скажу.

Для тех, кому мало документации на индикаторы, выкладываю мануалы на сами контроллеры HD44780 и KS0066U.
А так же переводной вариант первого 44780_RU.

3. Индикаторы различных производителей часто совместимы и взаимозаменяемы, но также часто не совпадают по физическим размерам, креплению, контактам и т.д. Поэтому при выборе для новой разработки и поиске замены обращайтесь к каталогам производителей.

DATA VISION http://www.datavision.com.tw/
WINSTAR http://www.winstar.com.tw
МЭЛТ http://melt.aha.ru/
BOLYMIN http://www.bolymin.com.tw/
FORDATA http://www.fordata.cn/
WINTEK http://www.wintek.com.tw/
SUNLIKE http://www.lcd-modules.com.tw/

Таблица замены ЖКИ (не моя)

4. Как правило все индикаторы могут быть подключены по восьмибитной и четырёхбитной схемам. Причём при подключении по четырёх битной обычно используются линии D4-D7, а не D0-D3 что кажется логичнее.

5. Контрастность индикаторов можно регулировать, прежде чем выводить данные на индикатор убедитесь, что напряжение управления контрастностью, находится в рабочем диапазоне. Устанавливается оно с помощью резисторного делителя см. схему. Номиналы разных производителей могут отличатся. У некоторых индикаторов на плате предусмотрены места для установки такого делителя и вам достаточно запаять туда нужные номиналы.

Ещё контрастность индикатора разная, в зависимости с какого боку на него глядеть. Если говорят что индикатор на двенадцать часов, то смотреть на такой нужно так чтобы индикатор находился ниже уровня глаз, если ноль часов, то на уровне глаз т.е. смотреть надо перпендикулярно плоскости, ну и если на шесть часов то индикатор должен располагаться выше уровня глаз. Не забывайте уточнять при покупке.

6. Если в индикаторе есть подсветка, контакты для неё обычно стоят отдельно. Вам нужно подключить её к питанию, задав номинальный ток с помощью резистора. У некоторых производителей на плате индикатора предусмотрено место для установки такого резистора, нужно запаять соответствующий номинал, замкнуть перемычку и подсветка будет получать питание с той же линии, что и индикатор.

Например в этом индикаторе нужно в отмеченых местах запаять резистор 220-510 Ом, и повесить каплю припоя в качестве перемычки

7. Кодовая таблица индикатора, как правило состоит из трёх частей

0x00-0x07 - загружаемый знакогенератор, символы созданные вами.
0x20-0xFF - ASCII коды стандартный набор символов и английский алфавит
0xA0-0xFF - символы национальных алфавитов и иные, с пропуском символов совпадающих по начертанию с английскими.

Наиболее популярная “русская” таблица

8. Чтение данных из индикатора используется крайне редко. Поэтому с целью экономии выводов, сигнал записи R/W можно просто подключить к +5В через резистор и не подключать к контроллеру.

Прикрепления: 2356585.jpg(24Kb) · 0621445.jpg(22Kb)
 
Администратор Дата: Среда, 11.11.2009, 21:35 | Сообщение # 2
Рядовой
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
9. Для схемы представленной выше на Си для микроконтроллеров, подпрограммы записи в ЖКИ могут быть реализованы следующим образом.

// назначение линий
#define    LCD_RS      RB1
#define    LCD_RW     RB2
#define    LCD_EN      RB3

#define    LCD_D4      RB4
#define    LCD_D5      RB5
#define    LCD_D6      RB6
#define    LCD_D7      RB7

//----------------------------------------------------------------------------
// ПП работы с ЖКИ 4 бит режим
//----------------------------------------------------------------------------
void move (unsigned char x) {

PORTB = PORTB & 0x0f;

if (x & 0x10) LCD_D4 = 1;
if (x & 0x20) LCD_D5 = 1;
if (x & 0x40) LCD_D6 = 1;
if (x & 0x80) LCD_D7 = 1;

LCD_EN = 1; LCD_EN = 0;  // wr 4-7

PORTB = PORTB & 0x0f;

if (x & 0x01) LCD_D4 = 1;
if (x & 0x02) LCD_D5 = 1;
if (x & 0x04) LCD_D6 = 1;
if (x & 0x08) LCD_D7 = 1;

LCD_EN = 1; LCD_EN = 0;  // wr 0-3

}

//----------------------------------------------------
// запись байта в управляющие регистры ЖКИ (команды)
//----------------------------------------------------
void mov_reg (unsigned char reg) {

LCD_RS = 0; LCD_RW = 0;
move (reg);

}

//----------------------------------------------------
// запись байта данных в ОЗУ (текст для отображения)
//----------------------------------------------------
void mov_dat (unsigned char dat) {

LCD_RS = 1; LCD_RW = 0;
move (dat);

}
//----------------------------------------------------

10. Как правило начинающие программисты для создания задержек используют не таймер микроконтроллера, а подпрограммы типа delay ();. Где задержка создаётся циклом обычно с убыванием.

//----------------------------------------------------------------------------
// ПП задержки
//----------------------------------------------------------------------------

void delay (unsigned int x) {

while (x != 0) {x--;};

}
//----------------------------------------------------------------------------

В этом случае подпрограмма инициализации индикатора может выглядеть следующим образом.

//----------------------------------------------------
// ПП инициализации LCD
//----------------------------------------------------
void init_lcd(void) {

//..........
delay (13423);     //15 mS

LCD_RS = 0; LCD_RW = 0;

LCD_D4 = 1;
LCD_D5 = 1;
LCD_D6 = 0;
LCD_D7 = 0;

delay (36);     // 40 mkS

LCD_EN = 1; LCD_EN = 0;   // wr 3
delay (3669);     // 4.1 mS
//..........
LCD_EN = 1; LCD_EN = 0;   // wr 3
delay (90);     // 100 mkS
//..........
LCD_EN = 1; LCD_EN = 0;   // wr 3
delay (36);     // 40 mkS
//..........
LCD_D4 = 0;
LCD_EN = 1; LCD_EN = 0;   // wr 2
delay (36);     // 40 mkS
//..........
mov_reg (0x28);    // режим 4 bit
mov_reg (0x08);    // OFF LCD
mov_reg (0x0c);    // ON LCD
mov_reg (0x06);    // SHIFT

delay (100);

}
//----------------------------------------------------

 
Администратор Дата: Среда, 11.11.2009, 21:36 | Сообщение # 3
Рядовой
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
11. Наиболее частые команды, посылаемые в индикатор можно реализовать в виде ПП.

//----------------------------------------------------
// установить курсор в нужную позицию
//----------------------------------------------------

void set_pos (unsigned char line, unsigned char pos)    // где, line = (0,1); pos = (0-15)

{
if (line) {mov_reg (0xc0 | pos);}
else {mov_reg (0x80 | pos);};
}
//----------------------------------------------------
// очистить индикатор
//----------------------------------------------------

void clr_lcd (void) {mov_reg (0x01);}

//----------------------------------------------------
// включить мигание курсора
//----------------------------------------------------

void on_blink (void) { mov_reg (0x0d); }

//----------------------------------------------------
// выключить мигание курсора
//----------------------------------------------------

void off_blink (void) { mov_reg (0x0c); }
//----------------------------------------------------

Аналогичным образом можно реализовать все возможные команды ЖКИ.

12. Если вы пишите программу для микроконтроллера под WINDOWS , то и символы, которые вы пожелает отобразить будут на экране в кодировке соответствующей таблицы, обычно 1251. Если вы отправите на индикатор символы точки, скобок, процентов и т.д. а так же цифр и английских букв то индикатор их отобразит. Если Вы попробуете отправить русские буквы, то увидите абракадабру. Чтобы этого не случилось все символы нужно перекодировать, привести таблицу компьютера к таблице ЖКИ. Это можно сделать с помощью подпрограммы. Вы передаёте в ПП символ из любой текстовой строки или его код, а она возвращает код соответствующий символу из таблицы индикатора (приведена выше, для другой таблицы нужно изменить данные в объявлении массива). Его вы и посылаете в индикатор.

//----------------------------------------------------
// подпрограмма конвертации кодов символов
unsigned char conv_char (unsigned char x) {

// '!"#$%&'()*+,-./0123456789:;<=>?@'  0x21-0x5a
// 'ABCD EFGH IJKL MNOP QRST UVWX YZ'  0x41-0x5a
// 'abcd efgh ijkl mnop qrst uvwx yz'  0x61-0x7a

// 'АБВГ ДЕЖЗ ИЙКЛМНОП РСТУФХЦЧ ШЩЪЫЬЭЮЯ'    0xc0-0xdf
// 'абвг дежз ийклмноп рстуфхцч шщъыьэюя'    0xe0-0xff
// буквы Ё и ё стоят особняком

const unsigned char ansi_A0[] = {
// А    Б    В    Г    Д    Е    Ж    З
0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,
// И    Й    К    Л    М    Н    О    П
0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8,
// Р    С    Т    У    Ф    Х    С    Ч
0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,
// Ш    Щ    Ъ    Ы    Ь    Э    Ю    Я
0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1,
// а    б    в    г    д    е    ж    з
0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,
// и    й    к    л    м    н    о    п
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,
// р    с    т    у    ф    х    ц    ч
0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,
// ш    щ    ъ    ы    ь    э    ю    я
0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};

if (x < 0x80) return x;   // английские и символы
if (x == 0xA8) return 0xA2;  // буква Ё
if (x == 0xB8) return 0xB5;  // буква ё
return ansi_A0[x - 0xc0];  // все остальные русские

}
//--------------------------------------------------------------------

Теперь для вывода символа «Ж»в первой позиции, первой строки нужно написать.

set_pos (0, 0);
mov_dat (conv_char (‘Ж’));

или то же самое, но кодом символа

set_pos (0, 0);
mov_dat (conv_char (0xС6));

Если вам захотелось вывести строку

const char *msg1 = "абвгдежзиклмнопр"; // объявите её в любой памяти

// и отправьте на индикатор

static unsigned char x;

set_pos (0, 0);
for (x = 0; x < 16; x++) {mov_dat (conv_char (*msg1)); msg1++;};

 
Администратор Дата: Среда, 11.11.2009, 21:37 | Сообщение # 4
Рядовой
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
13. Посмотрите внимательнее таблицу возможно вам приглянутся не только буквы но и прочие символы, вы всегда можете отобразить их по коду.

14. Если вам нужен ваш оригинальный символ, можно его создать, точнее их. Всего можно восемь, с кодами 0x00-0x07. Для этого надо записать данные для знакогенератора, например с помощь следующей ПП. Здесь загружаются по восемь байт на каждый символ, всего 64. Восемь байт кодируют изображение одного символа по линиям сверху вниз и по битам от младшего к старшему, это будет с право на лево. Поскольку в одной линии только пять пикселов, то сташие три бита в байтах всегда ноль. Остальные пять соответственно зажигают пиксел или гасят его.

code unsigned char cgram[64] = {
0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00, // символ 0x00
0x06,0x01,0x06,0x01,0x06,0x00,0x00,0x00, // символ 0x01
0x00,0x01,0x03,0x05,0x09,0x11,0x1f,0x00, // символ 0x02
0x04,0x0a,0x08,0x06,0x09,0x09,0x06,0x00, // символ 0x03
0x1f,0x09,0x04,0x02,0x04,0x09,0x1f,0x00, // символ 0x04
0x00,0x00,0x1E,0x08,0x04,0x08,0x1E,0x00, // символ 0x05
0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00, // символ 0x06
0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00 // символ 0x07
};

void load_cgram (void) {
unsigned char x;
mov_reg (0x40);
for (x = 0; x < 64; x++) {
mov_dat (cgram[x]);
}
mov_reg (0x80);
}

Всё, теперь вы можете вызывать свои символы по их коду. А если в таблице перекодировке вместо какой либо буквы подставите код этого символа, то по этой букве т.е. если в таблице выше заменить 0x41 на 0x04, то вместо буквы «А» будет отображаться созданный вами символ.

Приведённые примеры не являются образцам для подражания и приводятся исключительно для ознакомительных целей. Документация может расходиться с руководством на конкретный индикатор. Будьте внимательны.

 
Администратор Дата: Среда, 11.11.2009, 23:40 | Сообщение # 5
Рядовой
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
Предложения, замечания, комментарии и благодарности, публикуем ниже.
 
Форум » Разработка и производство электронных устройств » Разработка микропроцессорных устройств » HD44780 или KS0066U, а так же 1602 и другие (Несколько замечаний по знакосинтезирующим ЖКИ)
Страница 1 из 11
Поиск:

Copyright GreatHard © 2017 Сайт управляется системой uCoz