Работа с ЖКИ на контроллере 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 байт) 603 скачивания
Реклама
Аватара пользователя
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 КБ) 692 скачивания
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Реклама
Эиком - электронные компоненты и радиодетали
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МГц. так что с этим проблем нет.
также нет проблем с контрастностью, регулируется резистором.
в общем ума не приложу, что может быть тут такое.
Ставим плюсы: )
Ответить

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