Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
mike_64
Родился
Сообщения: 2
Зарегистрирован: Ср май 20, 2009 10:38:26

Сообщение mike_64 »

пытаюсь подключить мэлтовский mt-10s1-1ylg к своей меге8535. хочется использовать 4битную шину... поправьте, если ошибаюсь, каким образом должен идти обмен между мк и модулем?
если биты по байту - null E AO RW DB7 DB6 DB5 DB

Код: Выделить всё

PORTA = 0b01101111; // устанавливаем E и посылаем команду(первая часть данных)
_delau_us(50);
PORTA = 0b00101111; // сбрасываем Е
_delay_us(50);

PORTA = 0b01101010; //устанавливаем E и посылаем команду(вторая часть данных)
_delay_us(50);
PORTA = 0b00101010; // сбрасываем Е
_delay_us(50);

Прикрепил к посту код... кривовато, но вроде правильно. только не работает(
Вложения
lcd2.c
(918 байт) 602 скачивания
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

надо сначала адрес/данные установить на входы, подождать некоторое время, дернуть выводом Е (0=>1=>0).
в даташите даже есть такое время "предустановки адреса". что то около 40 наносекнд.

А у вас Е устанавливается сразу с данными. надо чуть раньше.
Ставим плюсы: )
mike_64
Родился
Сообщения: 2
Зарегистрирован: Ср май 20, 2009 10:38:26

Сообщение mike_64 »

перекинул Е на другой порт и изменил код . всё равно не работает( а есть какие-нибудь признаки того, что жки нормально инициализировался?
хм, странно, прощупал мультиметром порт, везде еденицы... ничё не понимаю о_О
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Без коментов, но общий смысл понятен быть должен.
Вложения
lcd.txt
(1.15 КБ) 691 скачивание
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Сообщение xVekx »

http://www.gaw.ru/html.cgi/txt/lcd/chip ... /start.htm
по этому сдалал несколько функции и больше не парюсь а имено

Код: Выделить всё

main.cpp
#include <iotiny2313.h>
#include <intrinsics.h>
#include "main.h"

int main()
{uchar vol[3];
 DDRD=0xFF;
 Command_8bit_4bit();
 Command(0,0,40);
 delay_ms(100);
 uchar i;
 for(i=0;i<5;i++) //цикл настройки лсд
    Command(0,0,str1[i]);
 for(i=0;i<11;i++)
    Command(1,0,str2[i]);

 while(1)
    {
     conv(comparator(),vol);
     for(i=0;i<3;++i)
        Command(1,0,vol[i]);
     for(i=0;i<3;++i)
        Command(0,0,16);
    }
}

main.h
#define CLK_MHz 4
#define delay_mks(Time_mks) __delay_cycles((long)Time_mks*CLK_MHz);
#define delay_ms(Time_ms)   __delay_cycles((long)Time_ms*1000*CLK_MHz);
#define BIT(B)                  (1<<B)// преобр. номера бита в позицию в байте
#define TSTBIT0(ADDRESS,B)      (!(ADDRESS & (BIT(B))))// проверка бита на ноль
#define TSTBIT1(ADDRESS,B)      (ADDRESS & (BIT(B)))// проверка бита на единицу
#define SETBIT(ADDRESS,B)       (ADDRESS |= BIT(B))// установка бита
#define CLRBIT(ADDRESS,B)       (ADDRESS&=~BIT(B))// сброс бита
#define SETMASK(ADDRESS,BYTE)   (ADDRESS |= BYTE)// установка битов по байтовой маске
#define CLRMASK(ADDRESS,BYTE)   (ADDRESS &= ~(BYTE))// очистка битов по байтовой маске
#define uchar unsigned char

uchar str1[]={1,2,6,12,1}; // массив настоечных параметров для лсд
//uchar str2[]={0xA8,0x70,0xB8,0xB3,0x65,0xBF,0x21,0x21,0x21,0x20,0xA5,0xB3,0x61,0xBD,0x21,0x21,0x21};
uchar str2[]={0x4B,0x6F,0xBC,0xBE,0x61,0x70,0x61,0xBF,0x6F,0x70,0x3A};
//0 E R/W RS D3 D2 D1 D0 - порт Д
#define Time_Comm 1000
void Command(bool RS,bool RW,uchar data)// посылка команд на ЛСД
{
 uchar highdata=data>>4;uchar lowdata=data;
 CLRMASK(lowdata,0x70);

 if(RS==1){highdata+=16;}if(RW==1){highdata+=32;}
 if(RS==1){lowdata+=16;}if(RW==1){lowdata+=32;}

 PORTD=highdata;
 SETBIT(PORTD,6);delay_mks(Time_Comm);
 CLRBIT(PORTD,6);delay_mks(Time_Comm);

 PORTD=lowdata;
 SETBIT(PORTD,6);delay_mks(Time_Comm);
 CLRBIT(PORTD,6);delay_mks(Time_Comm);
 PORTD=0x00;delay_mks(Time_Comm);
}

void Command_8bit_4bit() //переход из 8 битного в 4 битный  - режим ЛСД
{
 PORTD=0x42;delay_ms(30);
 PORTD=0x02;delay_ms(200);
 PORTD=0x00;
}

void conv(uchar a,uchar *b) // функция перевода числа в понятный код для лсд 
{
 b[0]=a/100;a=a-b[0]*100;b[0]+=0x30;
 b[1]=a/10;a=a-b[1]*10;b[1]+=0x30;
 b[2]=a;b[2]+=0x30;
}

uchar comparator() //АЦП на основе шим
{
 SETBIT(DDRB,PORTB2); 
 int i;
 int n;
 for(int a=0;a<=255;a++)
    {
     for(n=0;n<4;n++)
       {
        CLRBIT(PORTB,PORTB2);
        for(i=0;i<=a;++i)
           delay_mks(1);
        SETBIT(PORTB,PORTB2);
        for(i=0;i<=255-a;++i)
           delay_mks(1);
       }
     if(TSTBIT1(ACSR,ACO))return a;
    }
 return 255;
}


собственно особой запарки нету
SpaceStranger
Родился
Сообщения: 3
Зарегистрирован: Пт июл 17, 2009 15:58:00

проблема с ЖКИ

Сообщение SpaceStranger »

Пробую подключить к Pic'у ЖКИ WH1602B-GTI-CT. Почему-то не горит даже подсветка. В связи с чем вопрос - она управляется командами, или просто должна гореть при подаче напряжения? Пробовал прозванивать - не звонится.. Подавалось на него около 3.6В.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Горит просто при подаче питания. Только надо бы ограничивать ток в цепи, все же там светодиоды, скорее всего (но бывает и люминесцентная - см. Ваш индикатор), а питание подавать непосредственно на подсветку, потому как с выводами питания контроллера индикатора подсветка соединяется не всегда.
Оптимизм х (Опыт + Знания) = const
SpaceStranger
Родился
Сообщения: 3
Зарегистрирован: Пт июл 17, 2009 15:58:00

Сообщение SpaceStranger »

Спасибо, уже разобрался. Просто в даташите не было указано, что там несколько светодиодов последовательных (написано просто "LED" - китайцы, что с их взять :)) и напряжения 3.6В не хватало чтобы они открылись. Кстати, в даташите вроде как нарисован и токоограничительный резистор в самом модуле. Сейчас гадаю - есть он или нет :). Судя по яркости свечения от 5В аккумулятора - есть.
Аватара пользователя
baiun
Открыл глаза
Сообщения: 60
Зарегистрирован: Вт дек 25, 2007 14:44:34

Сообщение baiun »

Aheir писал(а):а питание подавать непосредственно на подсветку, потому как с выводами питания контроллера индикатора подсветка соединяется не всегда.

У меня AC162A. Справа от дисплея есть два контакта - это и есть подсветка? Который из них плюс и какое напряжение можно подавать не боясь сжечь ЖКИ?
Хорошая мысля всегда приходит опосля...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

обычно на них или рядом есть надписи A и К. так вот А-Анод(+) К-Катод(-). напряжение зависит от дисплея. подсветка, в основном, с уже поставленным токоограничивающим резистором, но я бы перестарховался поставил резюк где-то 500 Ом и подключил бы к 5В.
Ставим плюсы: )
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

500 Ом - много, может не загореться. У меня начинает гореть подсветка, только когда R<=47 Ом. А вообще, я обычно ставлю подстроечник на 100 Ом, и все ОК!
Аватара пользователя
baiun
Открыл глаза
Сообщения: 60
Зарегистрирован: Вт дек 25, 2007 14:44:34

Сообщение baiun »

Точно, есть "А" и "К", спасибо за подсказку, сам чёйто затормозил :oops:
Хорошая мысля всегда приходит опосля...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Привет всем! не думал что напишу сюда с проблемой))) но все таки приходится. имеется мега8535 и однострочный WH1601 при включении инициализацию проходит (не знаю правильно ли проходит, но проходит - видно что после нее закрашивается равномерными пробелами, когда как без инициализации он ярко светится первой половинкой :) ну вы меня понимаете)
так вот, ничего не могу вывести на дисплей, как ни пробовал, не получается. вот листинг на асме. подскажите, что у меня неправильно?
4-х битный интерфейс

Код: Выделить всё

lcd_init:

   clr adr
   rcall delay20ms
   
   ldi temp,(1<<DB5)|(1<<DB4)
   out lcd,temp
   rcall strobe
   rcall delay20ms
   
   rcall strobe
   rcall delay20ms

   rcall strobe
   rcall delay20ms
   
   cbr temp,(1<<DB4)
   out lcd,temp
   rcall strobe
   rcall delay40us
   
   rcall strobe
   clr temp
   sbr temp,(1<<DB7)
   out lcd,temp
   rcall strobe
   rcall delay40us

   clr temp
   out lcd,temp
   rcall strobe
   sbr temp,(1<<DB7)
   out lcd,temp
   rcall strobe
   rcall delay40us

   clr temp
   out lcd,temp
   rcall strobe
   sbr temp,(1<<DB4)
   out lcd,temp
   rcall strobe
   rcall delay20ms
   
   clr temp
   out lcd,temp
   rcall strobe
   sbr temp,(1<<DB6)|(1<<DB5)
   out lcd,temp
   rcall strobe
   rcall delay40us
   
   clr temp
   out lcd,temp
   
   ret

это подпрограмма вывода данных:
data - данные, lcd- бит порта, подключенный к транзистору, который управляет подсветкой. DB4,DB5,DB6,DB7 - соответствующие выводы порта подключенные к ЖКИ. A_D-бит порта подключенный к ЖКИ к ноге выбора регистра (адрес/данные) strobe - подпрограмма ниже. Е-бит подключенный к одноименной ноге ЖКИ

Код: Выделить всё

send_data:
   push data            ;запоминаем data
   push temp
   
   in temp,lcd            ;считываем порт, чтобы не изменить бит led
                     ;(возможен ШИМ для управления яркостью)
   andi temp,(1<<led)


   bst data,4            ;копируем соответствующие биты данных
   bld temp,DB4         ;на их места в выходном порту,
   bst data,5            ;подключенному к ЖКИ
   bld temp,DB5         ;старшая тетрада данных
   bst data,6
   bld temp,DB6
   bst data,7
   bld temp,DB7
                     

   sbr temp,(1<<A_D);устанавливаем сигнал "A_D"
   out lcd,temp         ;выводим полученные данные в порт
   rcall strobe

   
   bst data,0            ;копируем соответствующие биты данных
   bld temp,DB4         ;на их места в выходном порту,
   bst data,1            ;подключенному к ЖКИ
   bld temp,DB5         ;младшая тетрада данных
   bst data,2
   bld temp,DB6
   bst data,3
   bld temp,DB7

   out lcd,temp         ;выводим полученные данные в порт
   rcall strobe   
   rcall delay40us
      
   andi temp,(1<<led)
   out lcd,temp
   
   pop temp
   pop data               ;восстанавливаем data   

   ret

подпрограмма strobe

Код: Выделить всё

strobe:
   sbi lcd,e
   nop nop nop nop nop
   cbi lcd,e
   nop nop nop nop nop
   ret


помогите кто чем может) уже заипался.
Ставим плюсы: )
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

завтра гляну,сегодня уже шарообразный предмет в форме головы не варит.(просто устал)

ЗЫ тактовая проца какая?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

тактовая 16МГц.
Ставим плюсы: )
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Тоже башня уже варит плохо, но сразу в глаза бросается длительность задержек. При инициализации я ожидал увидеть по крайней мере 1 задержку в 1.5 мс. А вообще программа как то странно написана, плохо читаемо. По моему, перепутан порядок комманд.
Вложения
init.JPG
(41.81 КБ) 708 скачиваний
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

У меня инициализация вот так реализована:

Код: Выделить всё

lcdinit:
         push tmp1
         push lcddata
         ldi tmp1, 0
         ldi r30,low(InitData*2)
         ldi r31, high(InitData*2)
init:   
         lpm lcddata, Z+
         ldi tmp1, '$'
         cpse lcddata, tmp1
         rcall  WrCMD
         cpi lcddata, 0b00010000
         breq d1500
         rcall delay40mks
naz:
         ldi tmp1, '$'
         cpse tmp1, lcddata
         rjmp init
         pop lcddata
         pop tmp1
         ret


d1500:
          rcall delay1500mks
          rcall delay40mks
         rjmp naz



InitData:
.db 0b11000000, 0b00100000
.db 0b11000000, 0b00000000
.db 0b11000000, 0b00000000
.db 0b00010000, 0b00000000, '$'

WrCMD:
         push lcddata
         swap lcddata
         sbi portB, e
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         out portc, lcddata
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         cbi PortB, e
         pop lcddata
         ret

Один раз сделал, работает, а переделывать по нормальному не охота :)
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

у меня там аж три задержки на 20 миллисекунд. ваша инициализация под конкретное подключение ЖКИ к тому же 8-битный режим.

я имею в виду то, что плату мне удобнее было развести так:
portB0=DB7
portB1=DB6
portB2=DB5
portB3=DB4
portB4=E
portB5=R/W
portB6=A0
portB7=led
просто в .equ прописываю как мне надо и все. при этом не надо менять программу. вот что требовалось.
Ставим плюсы: )
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Режим 4-х битный.
Для "подгонки" к нужным пинам просто надо поменять соответствующие строки + добавить необходимые комманды для того, чтобы не менялись остальные биты используемых портов:

Код: Выделить всё

WrCMD: 
         push lcddata
         swap lcddata
         sbi portB, e
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         out portc, lcddata
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         cbi PortB, e
         pop lcddata
         ret

Вместо PortC - Ваш порт
e (и rs) - определяется в equ
Вот код для вывода данных:

Код: Выделить всё

write:
         push lcddata
         swap lcddata
         sbi portB, e
         sbi portB, rs
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         out portc, lcddata
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         cbi PortB, e
         cbi portB, rs
         pop lcddata
         ret

WriteLn:
         push lcddata
         push tmp1
Ln:
         rcall delay40mks   
         rcall delay40mks
         lpm lcddata, Z+
         ldi tmp1, '$'
         cpse lcddata, tmp1
         rjmp wr
re:
         cpse lcddata, tmp1
         rjmp Ln
         pop tmp1
         pop lcddata
         ret
wr:
         rcall  write
         swap lcddata
         rcall  write
         rjmp re

В пару Z перед вызовом подпрограммы WriteLn заносится адрес строки.

+Кривая :) установка адреса:

Код: Выделить всё

ldi lcddata, 0b11000000
         rcall wrcmd
         ldi lcddata, 0
         rcall wrcmd
         rcall delay40mks
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

хорошо) напиши пожалуйста команды инициализации для WH1601, организованного как двухстрочный. чему равен бит N при инициализации?
насчет твоей инициализации- теперь понял, что у тебя между тетрадами тоже задержка 40микросекунд. думаю это не целесообразно, но мешать не должно. попробовал как ты посоветовал, все равно не получается ничего вывести. такое чувство как будто инициализация неправильно проходит.
вот мой порядок.
1)задержка 2 секунды (чтобы увидеть что включились 8 первых знакомест)
2)инициализация (знакоместа пропадают, ЖКИ ровно горит по всей ячейкам)
3)устанавливаю адрес 0 (хотя в инициализации он уже должен был быть установлен, но думаю не помешает)
4)вывожу одни и те же данные ($41) по всем адресам от 0 до 40 и от 64 до 104.
в итоге на экране ничего.
поэтому грешу на подпрограмму вывода данных. может задержки побольше поставить. прогу отлаживал в АВРстудии в симуляции стоит камень мега8535, частота 16МГц. delay20ms дает около 21мс задержки при 16МГц. так что с этим проблем нет.
также нет проблем с контрастностью, регулируется резистором.
в общем ума не приложу, что может быть тут такое.
Ставим плюсы: )
Ответить

Вернуться в «Периферия»