какой отладчик?
Работа с ЖКИ на контроллере HD44780 и его аналогах
Alexeyslav
какой отладчик?
какой отладчик?
Кот гуляет сам по себе, но вблизи холодильника.
- Реклама
Программный конечно же. Напишите для начала программу тестовую, которая выводит символы во все позиции индикатора. Потом можно будет приступить к отладке вашего алгоритма, на каждом шаге проконтролировать содержимое переменных передаваемых в подпрограммы и т.д. и т.п. Возможно даже для этого проще задействовать UART и передавать в терминал данные, так вы увидите что и когда выполняется с какими параметрами так будет гораздо проще искать ошибку.
Надеюсь, проблема воспроизводится даже в протеусе? Если в железе то добавляется еще одна причина - сгоревший индикатор.
Надеюсь, проблема воспроизводится даже в протеусе? Если в железе то добавляется еще одна причина - сгоревший индикатор.
Вопрос ламерский и с бородой, не сильно мяукайте по этому поводу.
Подключил дисплей 1601 в режиме 4-х бит. Выводит пол строки (8 символов).
Я знаю, что вторая половина дисплея адресуется как вторая строчка, но пока не знаю, как передать адрес для отображения всей строки символов.
Команды инициализации дисплея:
пауза 15 мс
0x30
пауза 5 мс
0x30
0x30
0x20
0x20 // (0x20 | LCD_NUM_LINES | LCD_FONT)
0x0C // (0x08 | LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK)
0x06 // (0x04 | LCD_INCREMENT | LCD_SHIFT)
0x01
во время вывода символов читаю адрес, и при достижении адреса 0x08 посылаю команду присвоения счётчика адреса 40
(0x80 | 0x40)
После чего продолжаю выводить символы, но на дисплее они не отображаются
69 страниц не осилил, подскажите, в каком посте есть ссылка на библиотеку, или что я не так делаю.
Прошу ткнуть кошачьим носом
Подключил дисплей 1601 в режиме 4-х бит. Выводит пол строки (8 символов).
Я знаю, что вторая половина дисплея адресуется как вторая строчка, но пока не знаю, как передать адрес для отображения всей строки символов.
Команды инициализации дисплея:
пауза 15 мс
0x30
пауза 5 мс
0x30
0x30
0x20
0x20 // (0x20 | LCD_NUM_LINES | LCD_FONT)
0x0C // (0x08 | LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK)
0x06 // (0x04 | LCD_INCREMENT | LCD_SHIFT)
0x01
во время вывода символов читаю адрес, и при достижении адреса 0x08 посылаю команду присвоения счётчика адреса 40
(0x80 | 0x40)
После чего продолжаю выводить символы, но на дисплее они не отображаются
69 страниц не осилил, подскажите, в каком посте есть ссылка на библиотеку, или что я не так делаю.
Прошу ткнуть кошачьим носом
Alexeyslav
Если выводить по одному-два, символы выводятся по всей длинне первой строки. Так что врядли что-то с индикатором. Я подозреваю нестыковку библиотек, MPLAB IDE 8.3 и компилятора HI-TECH 9.60.
Вообще-то это и есть тестовая программа: выводится несколько символов. И все. Куда уж проще?
Протеусом не пользуюсь: небыло необходимости. Автор библиотек, уважаемый Alex использует несколько другой софт. Может, в этом все дело?
Если выводить по одному-два, символы выводятся по всей длинне первой строки. Так что врядли что-то с индикатором. Я подозреваю нестыковку библиотек, MPLAB IDE 8.3 и компилятора HI-TECH 9.60.
Вообще-то это и есть тестовая программа: выводится несколько символов. И все. Куда уж проще?
Протеусом не пользуюсь: небыло необходимости. Автор библиотек, уважаемый Alex использует несколько другой софт. Может, в этом все дело?
Кот гуляет сам по себе, но вблизи холодильника.
Тогда конечно же надо ковырять библиотеки. Раз такое простое не проходит, значит либо библиотеки бажные либо вы неправильно ими пользуетесь. Примеры с библиотеками шли? Если нет то в топку.
Потом, скачайте все-таки даташит на ваш индикатор и посмотрите как все же адресуются символы в строках. По-разному ведь бывает. Если нет придется тогда методом тыка - пробуйте выводить во все адреса. В первую половину - адрес, во вторую какой-нибудь символ по указанному адресу, если менять адрес раз в секунду то за 2-3 минуты точно узнаете какой адрес второй половины.
У вас есть команда переключение в 4-битный режим, но потом должна следовать команда 0x28 для дополнительных опций, т.к. в 8-битном режиме эта команда невозможна при 4-битном подключении к индикатору поэтому используют 0x20.или что я не так делаю.
Потом, скачайте все-таки даташит на ваш индикатор и посмотрите как все же адресуются символы в строках. По-разному ведь бывает. Если нет придется тогда методом тыка - пробуйте выводить во все адреса. В первую половину - адрес, во вторую какой-нибудь символ по указанному адресу, если менять адрес раз в секунду то за 2-3 минуты точно узнаете какой адрес второй половины.
- Реклама
При инициализации индикатора 0x28 он не запускается, так как бит 0x08 определяет двухстрочный дисплей.
С 0x20 всё проходит и дисплей высвечивает курсор.
Методом тыка можно попробовать, я привык разбираться с даташитами.
Напомните, в каком посте есть ссылка на библиотеку?
Может, поможет точное название дисплея? SC1601ASLB.
С 0x20 всё проходит и дисплей высвечивает курсор.
Методом тыка можно попробовать, я привык разбираться с даташитами.
Напомните, в каком посте есть ссылка на библиотеку?
Может, поможет точное название дисплея? SC1601ASLB.
Проверил процедуру инициализации. При использовании кода для KS0066 получаются еле видимые не контрастные символы:
Дисплей инициализируется только как однострочный HD44780 вот такой последовательностью (здесь применяются байтовые команды)
Перебор адресов записи от 0 до 128 простой программой не дал результатов.
Вторая половина индикатора пуста
Что - то не так с инициализацией. Никак не прокатывает инициализация как двухстрочный дисплей.
Код: Выделить всё
// для KS0066
vTaskDelay(30);
ResetLCD_RS;
ResetLCD_RW;
DataToPort (0x20); //4 bit mode 1
DataToPort (0x20);
DataToPort (0x40);
DataToPort (0x00);
DataToPort (0xE0);
DataToPort (0x00);
DataToPort (0x10);
vTaskDelay (2);
DataToPort (0x00);
DataToPort (0x60);Код: Выделить всё
// для HD44780
vTaskDelay(15);
ResetLCD_RS;
ResetLCD_RW;
DataToPort (0x30); //4 bit mode 1
vTaskDelay(5);
DataToPort (0x30); //4 bit mode 2
DataToPort (0x30); //4 bit mode 3
DataToPort (0x20); //4 bit command
LCDsendCommand (0x20 | LCD_NUM_LINES | LCD_FONT);
LCDsendCommand (0x08 | LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK);
LCDsendCommand (0x04 | LCD_INCREMENT | LCD_SHIFT);
LCDsendCommand (0x01); // очисить дисплейВторая половина индикатора пуста
Код: Выделить всё
for (i = 0; i < 0x80; i++)
{
vTaskDelay (1000);
itoa (i, addr);
LCDsendCommand (1 << LCD_DDRAM);
LCDstring (addr, 4); // вывод адреса в первую позицию LCD
LCDsendCommand (1 << LCD_DDRAM | i);
LCDstring ("*", 1); // запись звёздочки в память LCD по адресу
}
Сегодня съездил и купил двухстрочный дисплей WH1602.
С ним проблем не возникло. Первый пациент скорее мёртв чем жив.
С ним проблем не возникло. Первый пациент скорее мёртв чем жив.
Хм, оказывается даташиты врут.
Первый пациент не работал из-за питания его от дискаверивских 3-х вольт. Переключил на пяти вольтовое питание - заработал.
А в инструкции написано, что контроллер работает от 2,7 вольт. Вот и верь после этого людям
.
Первый пациент не работал из-за питания его от дискаверивских 3-х вольт. Переключил на пяти вольтовое питание - заработал.
А в инструкции написано, что контроллер работает от 2,7 вольт. Вот и верь после этого людям
Всех с наступившим новым годом!
Маленькая предыстория: Около года назад купил себе дисплей на этом контроллере (HD44780). Подключил по 8-ми битной шине, поигрался, и успокоился. Схему подключения нашел в help-е для mikroPascal (Случайно.). Помучился недельку с 4-х битной шиной и забыл о ней на год (Не смог "уломать".). Но вот совершенно недавно столкнулся с потребностью в использовании данного дисплея (А он у меня бело-синий 16*2.) по 4-х битной шине. Не нашел готовых "библиотек" под ассемблер (Часть либо сильно перегружена лишним для меня мусором, либо СИ... Но СИ мне не по душе.). И вот таки решился "домучить" передачу по 6 проводам (D4..D7, RS, E). Заодно и написал небольшую библиотечку. Т.к. мне нужно выводить "не стабильную информацию" (Вывести статический текст и менять его параметры. Например часы.) то я не делал возможность выдачи строк. Изучив кучу материала и разобравшись с косяками, я решил ее выложить.
Пояснения. Моя библиотека может: проводить автоматическую инициализацию на 4-х битную шину, отправлять команды/данные по ней. Можно настроить каждый пин (Для каждой ножки отдельный порт и пин), задержку между командами/данными тоже можно регулировать. Файл "LCDDraver.asm" "выдает" команду/данные содержащиеся в регистре "Temp" (Его нужно обязательно указать в заголовочном файле). Подпрограмма задержки использует Temp, Temp1 (Но восстанавливает их после окончания работы).
"LCD_Init.asm" - подключаете в том месте, где планируете проинициализировать экран. Это просто заранее прописные команды инициализации.
Настройка:
.equ PAUZA_LCD = 1 ;Длительность паузы при подаче на LCD.
.equ PAUZA_LCD1= 1
.equ PRS = PORTC ;Порт RS.
.equ RS = 2 ;Номер пина RS.
.equ PEE = PORTC ;Порт E.
.equ E = 3 ;Номер пина E.
.equ PL_D3 = PORTD ;Порт пина 4.
.equ PL_D2 = PORTD ;Порт пина 3.
.equ PL_D1 = PORTD ;Порт пина 2.
.equ PL_D0 = PORTD ;Порт пина 1.
.equ D3 = 3 ;№ Пина D7 в порту.
.equ D2 = 2 ;№ Пина D6 в порту.
.equ D1 = 1 ;№ Пина D5 в порту.
.equ D0 = 0 ;№ Пина D4 в порту.
Мое устройство работает на часовом кварце. И, в принципе, задержку я выставляю 1, 1. Но без нее все же нельзя. Сделал 2-х регистровую задержку, т.к. возможно понадобится работать на большей частоте, а контроллер (LCD) чувствителен к задержкам.
Пример использования библиотеки:
Схема к коду:
Маленькая предыстория: Около года назад купил себе дисплей на этом контроллере (HD44780). Подключил по 8-ми битной шине, поигрался, и успокоился. Схему подключения нашел в help-е для mikroPascal (Случайно.). Помучился недельку с 4-х битной шиной и забыл о ней на год (Не смог "уломать".). Но вот совершенно недавно столкнулся с потребностью в использовании данного дисплея (А он у меня бело-синий 16*2.) по 4-х битной шине. Не нашел готовых "библиотек" под ассемблер (Часть либо сильно перегружена лишним для меня мусором, либо СИ... Но СИ мне не по душе.). И вот таки решился "домучить" передачу по 6 проводам (D4..D7, RS, E). Заодно и написал небольшую библиотечку. Т.к. мне нужно выводить "не стабильную информацию" (Вывести статический текст и менять его параметры. Например часы.) то я не делал возможность выдачи строк. Изучив кучу материала и разобравшись с косяками, я решил ее выложить.
Пояснения. Моя библиотека может: проводить автоматическую инициализацию на 4-х битную шину, отправлять команды/данные по ней. Можно настроить каждый пин (Для каждой ножки отдельный порт и пин), задержку между командами/данными тоже можно регулировать. Файл "LCDDraver.asm" "выдает" команду/данные содержащиеся в регистре "Temp" (Его нужно обязательно указать в заголовочном файле). Подпрограмма задержки использует Temp, Temp1 (Но восстанавливает их после окончания работы).
"LCD_Init.asm" - подключаете в том месте, где планируете проинициализировать экран. Это просто заранее прописные команды инициализации.
Настройка:
Спойлер
;Описание портов LCD.---------------------------------------------------------------------------.equ PAUZA_LCD = 1 ;Длительность паузы при подаче на LCD.
.equ PAUZA_LCD1= 1
.equ PRS = PORTC ;Порт RS.
.equ RS = 2 ;Номер пина RS.
.equ PEE = PORTC ;Порт E.
.equ E = 3 ;Номер пина E.
.equ PL_D3 = PORTD ;Порт пина 4.
.equ PL_D2 = PORTD ;Порт пина 3.
.equ PL_D1 = PORTD ;Порт пина 2.
.equ PL_D0 = PORTD ;Порт пина 1.
.equ D3 = 3 ;№ Пина D7 в порту.
.equ D2 = 2 ;№ Пина D6 в порту.
.equ D1 = 1 ;№ Пина D5 в порту.
.equ D0 = 0 ;№ Пина D4 в порту.
Пример использования библиотеки:
Спойлер
Код: Выделить всё
.include "m8def.inc"
.def Temp = R16
.def Temp1= R17
.def Max = R29 ;Храним 0xFF.
;Описание портов LCD.---------------------------------------------------------------------------
.equ PAUZA_LCD = 1 ;Длительность паузы при подаче на LCD.
.equ PAUZA_LCD1= 1
.equ PRS = PORTC ;Порт RS.
.equ RS = 2 ;Номер пина RS.
.equ PEE = PORTC ;Порт E.
.equ E = 3 ;Номер пина E.
.equ PL_D3 = PORTD ;Порт пина 4 (D7).
.equ PL_D2 = PORTD ;Порт пина 3.(D6).
.equ PL_D1 = PORTD ;Порт пина 2.(D5).
.equ PL_D0 = PORTD ;Порт пина 1.(D4)
.equ D3 = 3 ;№ Пина D7 (4) в порту.
.equ D2 = 2 ;№ Пина D6 (3) в порту.
.equ D1 = 1 ;№ Пина D5 (2) в порту.
.equ D0 = 0 ;№ Пина D4 (1) в порту.
ldi Max, 0xFF
out DDRC, Max
out DDRD, Max
out DDRB, Max
;Cтек.------------------------------------------------------------------------------------------
ldi Temp, Low(RAMEND)
out SPL, Temp
ldi Temp, High(RAMEND)
out SPH, Temp
.include "LCD_Init.asm" ;Подключаем экран.
ldi Temp, 't'
rcall LCD_OUT_D
ldi Temp, '='
rcall LCD_OUT_D
ldi Temp, '2'
rcall LCD_OUT_D
ldi Temp, '6'
rcall LCD_OUT_D
ldi Temp, ' '
rcall LCD_OUT_D
ldi Temp, 'O'
rcall LCD_OUT_D
ldi Temp, 'S'
rcall LCD_OUT_D
ldi Temp, ':'
rcall LCD_OUT_D
ldi Temp, '2'
rcall LCD_OUT_D
ldi Temp, '1'
rcall LCD_OUT_D
ldi Temp, '0'
rcall LCD_OUT_D
ldi Temp, ' '
rcall LCD_OUT_D
ldi Temp, 'L'
rcall LCD_OUT_D
ldi Temp, '='
rcall LCD_OUT_D
ldi Temp, '2'
rcall LCD_OUT_D
ldi Temp, 0b10000000|0x40 ;Вывод команды (переносим адрес на новую строчку).
rcall LCD_OUT_Com
ldi Temp, '1'
rcall LCD_OUT_D
ldi Temp, '6'
rcall LCD_OUT_D
ldi Temp, ':'
rcall LCD_OUT_D
ldi Temp, '4'
rcall LCD_OUT_D
ldi Temp, '5'
rcall LCD_OUT_D
ldi Temp, ':'
rcall LCD_OUT_D
ldi Temp, '1'
rcall LCD_OUT_D
ldi Temp, '9'
rcall LCD_OUT_D
main:
rjmp main
.include "LCDDraver.asm" ;Библиотека общения с LCD по 4-м проводам (пинам).
- Вложения
-
- LCDDraver.asm
- (2.87 КБ) 491 скачивание
-
- LCD_Init.asm
- (588 байт) 552 скачивания
Все можно сделать, было бы желание!
Странно. Тоже ковыряю такой же алгоритм.
несколько у вас сложно все...
вместо
Для каждого отправляемого бита, которые каждый раз дергают порт я сделал так:
данные для передачи порции из 4-х бит находятся в старших 4 битах регистра ACCUM.
tempi - временный регистр из старшей половины R16-R31
Да, такое расположение выводов было удобно при разводке ATMEGA48A в TQFP-корпусе.
несколько у вас сложно все...
вместо
Код: Выделить всё
sbrc Temp, 3
sbi PL_D3, D3
sbrs Temp, 3
cbi PL_D3, D3
данные для передачи порции из 4-х бит находятся в старших 4 битах регистра ACCUM.
tempi - временный регистр из старшей половины R16-R31
Код: Выделить всё
; Индикатор
#define lcd_data_port PORTB
#define lcd_enable PB7
#define lcd_rs PB6
#define lcd_light PB4
#define LCD_data_D7 PB3
#define LCD_data_D6 PB2
#define LCD_data_D5 PB1
#define LCD_data_D4 PB0
.EQU LCD_data_mask = (1<<LCD_data_D7)|(1<<LCD_data_D6)|(1<<LCD_data_D5)|(1<<LCD_data_D4)
....
IN tempi, lcd_data_port
CBR tempi, LCD_data_mask ; обнуляем биты порта где должны быть данные.
// Перенос кода команды на выводы порта
SBRC ACCUM, 7
ORI tempi, 1<<LCD_data_D7
SBRC ACCUM, 6
ORI tempi, 1<<LCD_data_D6
SBRC ACCUM, 5
ORI tempi, 1<<LCD_data_D5
SBRC ACCUM, 4
ORI tempi, 1<<LCD_data_D4
OUT lcd_data_port, tempi
Ваш вариант мне знаком (когда-то делал так же). Отказался от него из-за того, что при разводке иногда легче развести ножки по разным портам, еже ли мучиться с 2-х сторонней развязкой. Пусть мой вариант выполняется немного дольше (Но из-за того, что все равно следует выжидать задержку - это незаметно), зато можно подключить LCD к разным пинам разных портов, а это для меня было главное.
Все можно сделать, было бы желание!
И что же тут "автоматического"???Вадиматоричик писал(а):библиотека может: проводить автоматическую инициализацию на 4-х битную шину, отправлять команды/данные по ней.
Если взять STM8L или STM32... то там да, автоматически... раз пнул таймер - прошла инициализация, второй раз пнул - две строки на дисплее... Привязался к SysTick или к таймеру - бегущая строка обеспечена!!!
"Я не даю готовых решений, я заставляю думать!"(С)
Подскажите, основаны ли эти дисплеи на на контроллере 44780 - http://radio-market.com.ua/catalog/?SEC ... T_ID=19779 и http://radio-market.com.ua/catalog/?SEC ... T_ID=19781? А то я что-то внятного описания не нашел, а неизвестно что брать не хочу. Заранее спасибо за ответ.
В гугле забанили, что ли?
http://teidec-west.co.jp/RC1602D.pdf
http://ru.wikipedia.org/wiki/HD44780Built- in controller (KS 0066 or Equivalent)
Контроллер HD44780 (а также совместимый с ним KS0066) ...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Gudd-Head, не поверите и такое было 
О, я когда первый раз тот документ видел не заметил KS0066, а он вроде как совместим) Спасибо
О, я когда первый раз тот документ видел не заметил KS0066, а он вроде как совместим) Спасибо
Вроде различия только в расположении пинов питания.WishMasterMax писал(а):а он вроде как совместим
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
думаю найду что и куда

У кого-нибудь заработал LCD с PIC16 используя библиотеки HI-TECH, Alex или Catcatcat?
Кот гуляет сам по себе, но вблизи холодильника.




