Работа с ЖКИ на контроллере HD44780 и его аналогах
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Как с помощью функции lcd_putch(); (из библиотеки уважаемого Alex)вывести однозначное десятичное число?
Если пробую lcd_putch(5); выводится невесть что...
Если пробую lcd_putch(5); выводится невесть что...
Кот гуляет сам по себе, но вблизи холодильника.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
lcd_putch выводит символ с ASCII-кодом, который передаём в функцию.
Чтобы вывести число, нужно его преобразовать в строку (массив символов) и выводить по-символьно, либо с помощью lcd_puts (что тоже самое).
Если оно у Вас не больше 9-ти, то можно так:
Чтобы вывести число, нужно его преобразовать в строку (массив символов) и выводить по-символьно, либо с помощью lcd_puts (что тоже самое).
Если оно у Вас не больше 9-ти, то можно так:
Код: Выделить всё
unsigned char val=5;
lcd_putch(val + '0');
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А кто-нибудь сталкивался с таким:
ЖКИ на базе GDM1601a (аналог HD44780) отображает только 8 символов на экране. Из 16. Дальше - пусто.
---
Сам себе отвечу.
Указал в коде
Config Lcd = 16 * 1
а надо было
Config Lcd = 16 * 1a
----
Нее.. все равно глюк вылезает. ((
Когда нужно писать на экране
Time:00:59 - минуты упорно не хотят отображаться
ЖКИ на базе GDM1601a (аналог HD44780) отображает только 8 символов на экране. Из 16. Дальше - пусто.
---
Сам себе отвечу.
Указал в коде
Config Lcd = 16 * 1
а надо было
Config Lcd = 16 * 1a
----
Нее.. все равно глюк вылезает. ((
Когда нужно писать на экране
Time:00:59 - минуты упорно не хотят отображаться
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А Вы знаете, что дисплей в 16 символов и 1 строку - это 8*2, у которого строки друг за другом. Если просто так в него писать (как в одну строку), то символы после восьмого не отобразятся. Процедура записи состоит из двух частей. Сначала левую половину пишем, потом правую.
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Я понял в чем глюк был. Когда я просто пишу:
Lcd " Длинное слово ", то И протеус, и железка отображают его правильно.
А вот когда указывал место через:
Locate 1 , 6
Lcd Minut
То протеус отображал правильно, а железка обрезала все после 8 символа.
Команда Locate по разному понимается Протеусом и железкой.
Видимо, железка считает, что если есть 1 строка, то должна быть и 2.
Lcd " Длинное слово ", то И протеус, и железка отображают его правильно.
А вот когда указывал место через:
Locate 1 , 6
Lcd Minut
То протеус отображал правильно, а железка обрезала все после 8 символа.
Команда Locate по разному понимается Протеусом и железкой.
Видимо, железка считает, что если есть 1 строка, то должна быть и 2.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Не "понял, в чём глюк", а пытаешься угадать правильную последовательность нажимания кнопок.
Набираем в интернете название дисплея, открываем первую попавшуюся сссылку, рассматриваем картинку с словами "Display character address code: Display position / DDRAM address".
Не помогло.
В том же самом интернете набираем "lcd.pdf 44780 ктц мк" (это не выводится из каких-либо рассуждений, просто магические символы), получаем документ с надписью "КТЦ-МК".
Там всё даже по-русски, но... многабукв ни о чём, а кнопки-то какие нажимать? Чтоб железка не считала строки через Locate? Глюк же! И протеус!
Набираем в интернете название дисплея, открываем первую попавшуюся сссылку, рассматриваем картинку с словами "Display character address code: Display position / DDRAM address".
Не помогло.
В том же самом интернете набираем "lcd.pdf 44780 ктц мк" (это не выводится из каких-либо рассуждений, просто магические символы), получаем документ с надписью "КТЦ-МК".
Там всё даже по-русски, но... многабукв ни о чём, а кнопки-то какие нажимать? Чтоб железка не считала строки через Locate? Глюк же! И протеус!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
А как на индикатор данные расчетов вывести (из регистра)?
- Gudd-Head
- Друг Кота
- Сообщения: 20091
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Преобразовать число из регистра в цифры, например в двоично-десятичном формате.
Далее смотрим таблицу символов 44780 — откуда начинаются цифры (30h) и к цифре прибавляем этот адрес. Всё, печатаем очередную цифру.
Далее смотрим таблицу символов 44780 — откуда начинаются цифры (30h) и к цифре прибавляем этот адрес. Всё, печатаем очередную цифру.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- pioneer1234
- Встал на лапы
- Сообщения: 109
- Зарегистрирован: Вт янв 17, 2012 00:13:14
- Откуда: Кременчуг
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Пациент скорее мертв, чем жив. Очень похоже на ситуацию, когда резиновые шлейфы не прилегают как положено...
- pioneer1234
- Встал на лапы
- Сообщения: 109
- Зарегистрирован: Вт янв 17, 2012 00:13:14
- Откуда: Кременчуг
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
vitalik_1984 писал(а):Пациент скорее мертв, чем жив. Очень похоже на ситуацию, когда резиновые шлейфы не прилегают как положено...
А такое кто нибудь пробовал лечить? А то жалко как то...
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Разбираешь, собираешь. Без гарантии. Дела на полчаса с перекурами, конструкция на уровне табуретки по сложности. Разрешение нужно? Я разрешаю.
Или пользуешься как есть. Нижние две строки можно закрыть картонкой, чтоб не смущали. Для отладочных целей вообще без разницы.
У меня "чиненный" уже года три как живёт.
Или пользуешься как есть. Нижние две строки можно закрыть картонкой, чтоб не смущали. Для отладочных целей вообще без разницы.
У меня "чиненный" уже года три как живёт.
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Полтергейст какой-то: выводятся только первые 2 символа. Если убрать команды на их вывод, выводятся символы на 3 и 4 месте. А чтобы все сразу?
// работа с LCD
#include <pic.h>
#include "lcd.h"
//----------
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT); // биты конфигурации программатора
//----------
volatile unsigned char cnt_pause = 0;
//----------
void interrupt isr(void) // обработчик прерываний
{
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
TMR0+= 6; // предзагрузка TMR0
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
if(cnt_pause==1) cnt_pause--;
} // конец ППОП TMR0
}
//----------
void podgot (void) // настройки
{
ADCON1 = 0b111; // отключение АЦП
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 0; // подтягивающие R порта В (0-вкл, 1-выкл) бит регистра OPTION
// Начало настройки TMR0 ----------
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 0; // bit 2 Настройка предделителя
PS1 = 0; // bit 1 Настройка предделителя
PS0 = 1; // bit 0 Настройка предделителя
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
T0IF = 0;
// Конец настройки TMR0 ----------
GIE = 1; // разрешены все немаскированные прерывания
}
void pause100 (void)
{
while(cnt_pause) continue; // если cnt_pause не равен 0, продолжение цикла.
cnt_pause=100;
}
// конец объявления функций, используемые в файле----------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main ()
{
unsigned char cnt_ch=0;
unsigned char val=0;
podgot(); //настройки
lcd_init(); // инициализация дисплея
lcd_clear(); // очистка дисплея
//
for(;;)
{
lcd_gotoxy(0,0);
val=0;
lcd_putch(val + '0');
pause100(); //----------
lcd_gotoxy(0,1);
val=4;
lcd_putch(val + '0');
pause100(); //----------
lcd_gotoxy(0,2);
val=8;
lcd_putch(val + '0');
pause100(); //----------
lcd_gotoxy(0,3);
val=0;
lcd_putch(val + '0');
pause100(); //----------
}
}// end main
Спойлер
// MK pic16f72// работа с LCD
#include <pic.h>
#include "lcd.h"
//----------
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT); // биты конфигурации программатора
//----------
volatile unsigned char cnt_pause = 0;
//----------
void interrupt isr(void) // обработчик прерываний
{
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
TMR0+= 6; // предзагрузка TMR0
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
if(cnt_pause==1) cnt_pause--;
} // конец ППОП TMR0
}
//----------
void podgot (void) // настройки
{
ADCON1 = 0b111; // отключение АЦП
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 0; // подтягивающие R порта В (0-вкл, 1-выкл) бит регистра OPTION
// Начало настройки TMR0 ----------
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 0; // bit 2 Настройка предделителя
PS1 = 0; // bit 1 Настройка предделителя
PS0 = 1; // bit 0 Настройка предделителя
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
T0IF = 0;
// Конец настройки TMR0 ----------
GIE = 1; // разрешены все немаскированные прерывания
}
void pause100 (void)
{
while(cnt_pause) continue; // если cnt_pause не равен 0, продолжение цикла.
cnt_pause=100;
}
// конец объявления функций, используемые в файле----------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main ()
{
unsigned char cnt_ch=0;
unsigned char val=0;
podgot(); //настройки
lcd_init(); // инициализация дисплея
lcd_clear(); // очистка дисплея
//
for(;;)
{
lcd_gotoxy(0,0);
val=0;
lcd_putch(val + '0');
pause100(); //----------
lcd_gotoxy(0,1);
val=4;
lcd_putch(val + '0');
pause100(); //----------
lcd_gotoxy(0,2);
val=8;
lcd_putch(val + '0');
pause100(); //----------
lcd_gotoxy(0,3);
val=0;
lcd_putch(val + '0');
pause100(); //----------
}
}// end main
Кот гуляет сам по себе, но вблизи холодильника.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Попробуйте lcd_gotoxy поставить только один раз (на координаты 0,0). Незачем его тыкать перед каждым выводом символа - курсор сам передвинится на следующее знакоместо.
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Увы, не помогает: выводятся только первых 2 знака.
Убрал функцию pause100() - без изменений.
P.S. Мне этих символов выводить и выводить. Вот эскиз интерфейса терморегулятора
Убрал функцию pause100() - без изменений.
P.S. Мне этих символов выводить и выводить. Вот эскиз интерфейса терморегулятора
- Вложения
-
- Untitled-1.jpg
- (231.52 КБ) 478 скачиваний
Кот гуляет сам по себе, но вблизи холодильника.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
как то так можно упростить этот код
Код: Выделить всё
{ char val[]={0,8,4,0};
char i;
lcd_gotoxy(0,0);
for (i=0;i<4;i++) {
lcd_putch(val[i]+'0');
pause100();
};
}
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
vitalik_1984
Спасибо за идею, но числа-то будут получаться с АЦП. Т.е. одно за одним, от младших разрядов к старшим. Громоздко получается...
Спасибо за идею, но числа-то будут получаться с АЦП. Т.е. одно за одним, от младших разрядов к старшим. Громоздко получается...
Кот гуляет сам по себе, но вблизи холодильника.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Так можно вообще то в обратную сторону листать for(i=4;i<0;i– – )
либо воспользоваться стандартными функциями вывода sprintf () например...
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Решил полностью изменить алоритм вывода: попробовал вывести содержимое массива. И опять выводятся только 2 первых символа!
// работа с LCD
#include <pic.h>
#include "lcd.h"
//----------
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT); // биты конфигурации программатора
//----------
const char hello_str[]="Hello !!!";
volatile unsigned char cnt_pause=0;
//----------
void interrupt isr(void) // обработчик прерываний
{
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
TMR0+= 6; // предзагрузка TMR0
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
if(cnt_pause==1) cnt_pause--;
} // конец ППОП TMR0
}
//----------
void podgot (void) // настройки
{
ADCON1 = 0b111; // отключение АЦП
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 0; // подтягивающие R порта В (0-вкл, 1-выкл) бит регистра OPTION
// Начало настройки TMR0 ----------
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 0; // bit 2 Настройка предделителя
PS1 = 0; // bit 1 Настройка предделителя
PS0 = 1; // bit 0 Настройка предделителя
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
T0IF = 0;
// Конец настройки TMR0 ----------
GIE = 1; // разрешены все немаскированные прерывания
}
void pause100 (void)
{
while(cnt_pause) continue; // если cnt_pause не равен 0, продолжение цикла.
cnt_pause=100;
}
// конец объявления функций, используемые в файле----------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main ()
{
unsigned char cnt_ch=0;
podgot(); //настройки
lcd_init(); // инициализация дисплея
lcd_clear(); // очистка дисплея
lcd_gotoxy(0,0);
//
for(;;)
{
while(hello_str[cnt_ch])
{
lcd_putch(hello_str[cnt_ch++]);
while(cnt_pause) continue;
cnt_pause=100;
}
}
}// end main
передвинул курсор на другую позицию - без изменений.
Спойлер
// MK pic16f72// работа с LCD
#include <pic.h>
#include "lcd.h"
//----------
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT); // биты конфигурации программатора
//----------
const char hello_str[]="Hello !!!";
volatile unsigned char cnt_pause=0;
//----------
void interrupt isr(void) // обработчик прерываний
{
if (T0IF && T0IE) // ветка опроса флага прерывания по переполнению TMR0
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
TMR0+= 6; // предзагрузка TMR0
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
if(cnt_pause==1) cnt_pause--;
} // конец ППОП TMR0
}
//----------
void podgot (void) // настройки
{
ADCON1 = 0b111; // отключение АЦП
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 0; // подтягивающие R порта В (0-вкл, 1-выкл) бит регистра OPTION
// Начало настройки TMR0 ----------
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 0; // bit 2 Настройка предделителя
PS1 = 0; // bit 1 Настройка предделителя
PS0 = 1; // bit 0 Настройка предделителя
T0IE = 1; // 1/0 разрешение/запрет прерывания по переполнению TMR0
T0IF = 0;
// Конец настройки TMR0 ----------
GIE = 1; // разрешены все немаскированные прерывания
}
void pause100 (void)
{
while(cnt_pause) continue; // если cnt_pause не равен 0, продолжение цикла.
cnt_pause=100;
}
// конец объявления функций, используемые в файле----------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main ()
{
unsigned char cnt_ch=0;
podgot(); //настройки
lcd_init(); // инициализация дисплея
lcd_clear(); // очистка дисплея
lcd_gotoxy(0,0);
//
for(;;)
{
while(hello_str[cnt_ch])
{
lcd_putch(hello_str[cnt_ch++]);
while(cnt_pause) continue;
cnt_pause=100;
}
}
}// end main
передвинул курсор на другую позицию - без изменений.
Кот гуляет сам по себе, но вблизи холодильника.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Отладчик что показывает?