Работа с ЖКИ на контроллере HD44780 и его аналогах
Инициализация происходит путем установки на RS - 0. При этом данные поступят в регистр команд, и дисплей уже будет знать, что ему делать...
далее переключаем RS в 1 и теперь данные записываются в регистр видеопамяти DDRAM.
И теперь запись появляется на экране. Правильно?
далее переключаем RS в 1 и теперь данные записываются в регистр видеопамяти DDRAM.
И теперь запись появляется на экране. Правильно?
Не умеешь - не берись, но не взявшись не научишься...
GP1 писал(а):Итак статейка о LCD на HD44780, оч.давно нарыл где-то на просторах инета, мне помогло освоиться, надеюсь поможет кому-то еще
(главное все по нашенски и доходчиво).
Всем удачи.
Спасибо Aheir, сам бы точно до такого не додумался, нормальные герои всегда идут в обход
перезалей в личку. Только залей на файлообменник, например, на депозит, одним файлом. А то что то не получается эти 2 архива привратить в 1...
Не умеешь - не берись, но не взявшись не научишься...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Вот pdf файл, который выкладывал GP1 в архивах на 8 странице.Stalker46 писал(а):на 8 чтоли странице был пост...
Ставим плюсы: )
sa-ta писал(а):может кто то поможет опознать индикатор:
после подачи питания 5В. (первые 2 ноги) поджигаются 10 восьмерок с точками. потом гаснут.
на плате распаяна еще 14pin soic - первая строчка - 14011B ( ла7 )
вторая строчка XAA734.
может это что то I2C ?
это не и2с индикатор! сам контроллер представляет собой 80-ти битный сдвиговый регистр, у меня такойже дисплей есть, у меня правда микросхемы подписаны KS0061, но это аналог! Соответственно скачайте на них даташит. Там управление простейшее по 3-м проводам (данные, клок данных и клок говорящий о том что все 80 битов переданы!) Выводы по порядку
1 - минус
2 - плюс
3 - данные
4 - клок2(разберётесь по даташиту какой клок за что отвечает)
5 - клок1
6 - вывод М (поидее управление контрастностью), я его замкнул на дата
и на последок кусок кода, которым мне удалось запустить данный дисплей
Код: Выделить всё
#include <mega8>
#include <delay>
#define DAT PORTC.0
#define Clock2 PORTC.1
#define Clock1 PORTC.2
#define M PORTC.3
// Declare your global variables here
flash const unsigned char zero=0b00111111;
flash const unsigned char one=0b00000110;
flash const unsigned char two=0b01011011;
flash const unsigned char three=0b01001111;
flash const unsigned char four=0b01100110;
flash const unsigned char five=0b01101101;
flash const unsigned char six=0b01111101;
flash const unsigned char seven=0b00000111;
flash const unsigned char eight=0b01111111;
flash const unsigned char nine=0b01101111;
/*flash const unsigned char ;
flash const unsigned char ;
flash const unsigned char ;
flash const unsigned char ;
flash const unsigned char ;
flash const unsigned char ;
flash const unsigned char ;*/
void main(void)
{
// Declare your local variables here
register unsigned char i,x;
unsigned char data[10];//Масив для хранения всех десяти разрядов индикатора
register unsigned char bufer=0;
data[0]=zero;
data[1]=one;
data[2]=two;
data[3]=three;
data[4]=four;
data[5]=five;
data[6]=six;
data[7]=seven;
data[8]=eight;
data[9]=nine;
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
//бесконечный цыкл
//delay_ms(1);
while (1)
{
for (x=10;x>0;x--)//Всего 10 разрядов индикатора
{
bufer=data[x];//Ложим в буфер х-тый элемент масива
//и выводим этот элемент в индикатор
for (i=0;i<8;i++) //Всего 8 сегментов индикатора
{
if(bufer&(1<<0)) //Если надо вывести 1 - выводим и защелкиваем сигналом клок
{
DAT=1;
Clock2=1;
delay_us(10);
Clock2=0;
}
if(!(bufer&(1<<0>>1;//Сдвиг вправо
}
//M=1;
//delay_us(10);
M=1;
}
Clock1=1;
delay_us(10);
Clock1=0;
};
} //bst reg,bit
//brtc brts
Последний раз редактировалось Гуня Пн янв 25, 2010 23:35:11, всего редактировалось 2 раза.
Непойму чё за глюк, когда вставляю код (моё сообщение выше), при отправке удаляется часть кода! два раза пробывал редактировать!
щас попробую сюда вставить ту чать где ошибки
прикреплю еще сишный файл, на случай если снова неправильно вставится!
ОО! снова тотже глюк! качайте файл си!
щас попробую сюда вставить ту чать где ошибки
Код: Выделить всё
for (x=10;x>0;x--)//Всего 10 разрядов индикатора
{
bufer=data[x];//Ложим в буфер х-тый элемент масива
//и выводим этот элемент в индикатор
for (i=0;i<8;i++) //Всего 8 сегментов индикатора
{
if(bufer&(1<<0)) //Если надо вывести 1 - выводим и защелкиваем сигналом клок
{
DAT=1;
Clock2=1;
delay_us(10);
Clock2=0;
}
if(!(bufer&(1<<0>>1;//Сдвиг вправо
}
//M=1;
//delay_us(10);
M=1;
}
Clock1=1;
delay_us(10);
Clock1=0;прикреплю еще сишный файл, на случай если снова неправильно вставится!
ОО! снова тотже глюк! качайте файл си!
- Вложения
-
- программа работы с KS0061.c
- (3.24 КБ) 457 скачиваний
-
sa-ta
- Это не хвост, это антенна
- Сообщения: 1413
- Зарегистрирован: Пн ноя 23, 2009 00:50:23
- Откуда: Crimea, Simferopol
Гуня писал(а):это не и2с индикатор! сам контроллер представляет собой 80-ти битный сдвиговый регистр, у меня такойже дисплей есть, у меня правда микросхемы подписаны KS0061, но это аналог! Соответственно скачайте на них даташит. Там управление простейшее по 3-м проводам (данные, клок данных и клок говорящий о том что все 80 битов переданы!)
мир не без добрых людей...спасибо
со временем сейчас напрженка, но попозже попробую.
Я не могу добить эту табличку!!! Как организовывать инициализацию? я понял, какие 1 определяют команды, адресуемые по IR...
НО!!! ВСю ли табличку надо переписывать? как надо правильно делать?
Я не могу понять, сначала надо вывести 1 строчку этой таблицы, подождать, затем вторую строчку, затем подождать, затем третью и т.д. или можжно сразу вывести? одним байтом?
Вобщем, правильно быглядит инициализация:
00000001 - очищаем дисплей, адрес ДДрам на 0.
вторую строчку таблицы пропускаем.
ждем (задержка)
00000110 - при последующем байте сдвинуть адрес ддрам на 1 позицию (инкремент).
задержка
00001000 - выключил дислпей, никаких курсоров.
задержка
00010100 - смещаем курсор, вправо.
задержка
00111000 - 8 разрядная шина данных, 2 строки, 5*8т разрешение матрицы
перед всем этим я ставил E в 1, теперь сбразываю ее в 0 и все, можно переходить на RS=1.
дальше, что от меня в таблице требуют, не знаю. Поэтому, уже перехожу к регистру DDram, RS кидаю в 1.
RW в 0.
теперь устанавливаем Е в 1 и выполняем процесс занесения кода букв:
У меня вот какой код получился:
10100101
10111011
11000100
10111000
10111101
01000101
10110011
10110100
01100101
10111101
10111000
10111001
я не знаю, какие надо задержки вводить между каждым выводом байта...
задержка
Е=0 - этим мы выдали на экран надпись.
теперь опять лезем в IR регистр для этого RS=0.
Поправляем:
Е=1,
RW=0,
00001100 - включили дисплей, опять без курсоров.
е бросаем в 0, все, надпись выведена.
правильно?

НО!!! ВСю ли табличку надо переписывать? как надо правильно делать?
Я не могу понять, сначала надо вывести 1 строчку этой таблицы, подождать, затем вторую строчку, затем подождать, затем третью и т.д. или можжно сразу вывести? одним байтом?
Вобщем, правильно быглядит инициализация:
00000001 - очищаем дисплей, адрес ДДрам на 0.
вторую строчку таблицы пропускаем.
ждем (задержка)
00000110 - при последующем байте сдвинуть адрес ддрам на 1 позицию (инкремент).
задержка
00001000 - выключил дислпей, никаких курсоров.
задержка
00010100 - смещаем курсор, вправо.
задержка
00111000 - 8 разрядная шина данных, 2 строки, 5*8т разрешение матрицы
перед всем этим я ставил E в 1, теперь сбразываю ее в 0 и все, можно переходить на RS=1.
дальше, что от меня в таблице требуют, не знаю. Поэтому, уже перехожу к регистру DDram, RS кидаю в 1.
RW в 0.
теперь устанавливаем Е в 1 и выполняем процесс занесения кода букв:
У меня вот какой код получился:
10100101
10111011
11000100
10111000
10111101
01000101
10110011
10110100
01100101
10111101
10111000
10111001
я не знаю, какие надо задержки вводить между каждым выводом байта...
задержка
Е=0 - этим мы выдали на экран надпись.
теперь опять лезем в IR регистр для этого RS=0.
Поправляем:
Е=1,
RW=0,
00001100 - включили дисплей, опять без курсоров.
е бросаем в 0, все, надпись выведена.
правильно?

Не умеешь - не берись, но не взявшись не научишься...
я не флудю. я пытаюсь изобрести велосипед, как многие скажут. Правильный алгоритм я составил?
если не изобретать велосипед и самому не писать программу, ассемблеру да и просто программированию и работе с ЖК не научишься.
Для меня это тяжело как 5 тонный камень, пока что...

если не изобретать велосипед и самому не писать программу, ассемблеру да и просто программированию и работе с ЖК не научишься.
Для меня это тяжело как 5 тонный камень, пока что...
Не умеешь - не берись, но не взявшись не научишься...




