Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LCD через регистр сдвига
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
SergeyM
Помогите пожалуйста реализовать работу МК с ЖКИ через регистр сдвига. Что то пробовал и не хотит ничего отображатьsad.gif
yung
Поподробней, пожалуйста. ЖКИ голый или с контроллером? Если да, то каким.
Igor26
Цитата(SergeyM @ Jun 8 2005, 11:28)
Помогите пожалуйста реализовать работу МК с ЖКИ через регистр сдвига. Что то пробовал и не хотит ничего отображатьsad.gif
*

На сколько я помню на "чистый" ЖКИ, чтоб он работал, на сегменты подают переменку.
SergeyM
Тогда поставим вопрос по другому:
Я проверял работоспособность в Протеусе, причем со стандартным примером в CVavr по работе с LCD. Где Хело МИР написано. И он работал, потом я используя тот же самый дисплей решил проверить работу через сдвиговый регистр, но обломался.
На счет с контроллером ЖК или без я незнаю, я подумал если работал с другим примером то и с этим будет робить. Наверное неправильно пишу.
vvs157
Цитата(SergeyM @ Jun 8 2005, 11:28)
Помогите пожалуйста реализовать работу МК с ЖКИ через регистр сдвига. Что то пробовал и не хотит ничего отображатьsad.gif
*


Для работы с бесконтроллерным ЖКИ лучше использовать соотв. контроллер. Иначе придется городить генератор и схему смены полярности на XOR элементах. При запитке напряжением, содержащим постоянную составляющую индикатор выйдет из строя.
SergeyM
Да еще никто не подскажет как отдельным выводам порта присвоить переменную
phantom
В CodeVision функции предполагают наличие ЖКИ с контроллером HD44780.
А что значит "через регистр сдвига"? Что-то не соображу, куда его там можно прилепить. В упомянутом примере ЖКИ подключается к порту С, где 3 линии управляющие и 4 данных, а что туда выдавать, определяется алгоритмом взаимодействия с HD44780 (для интереса можно посмотреть файлики lcd*.lib в каталоге LIB).
SergeyM
В принципе через регистр сдвига можно работать с ЖКИ используя всего две ноги МК, а не весь порт. А пример я привел, потомучто он показал что ЖКИ рабочий.
phantom
Цитата
Наверное неправильно пишу.

Наверное... Трудно сказать, не видя кода smile.gif

Простите за глупый вопрос huh.gif , а как пишете, если даже не знаете, с контроллером ЖК или без? Или я чего-то не понимаю?
vvs157
Цитата(SergeyM @ Jun 8 2005, 16:47)
В принципе через регистр сдвига можно работать с ЖКИ используя всего две ноги МК, а не весь порт. А пример я привел, потомучто он показал что ЖКИ рабочий.
*


Если у Вас алфавитно-цифровой 5х7 ЖКИ с типовым контроллером, то можно использовать регистр типа 74HCT595 . Но только тогда надо 3 ноги - такт, данные и перенос из регистра сдвига в выходной регистр.
SergeyM
ЖК совместимый с 44780 16 символов 2 строки, регистр 74LS174, стирание перед каждой записью использую побитно, можно использовать третью ногу для подачи сигнала очистки, а можно как в моем примере. Причем пример взят из книги, но нифига он не работает ни на Пике ни на АВР.
SergeyM
Вот примеры
Для Пика (как в книге)
Код
// Глобальные переменные
volatile unsigned int RTC = 0; //Счетчик реального времени

int Dlay;    //длительность задержки
         
static volatile bit Clock  @ (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS    @ (unsigned)&TRISB*8+1;
static volatile bit Data  @ (unsigned)&PORTB*8+2;
static volatile bit DataTRIS    @ (unsigned)&TRISB*8+2;


char Message[13] = "Hello World!";    //строка сообщения выводимая на          //дисплей

// Служебные подпрограммы
LCDNybble(char Nybble, char RS){    // запись полубайта в ЖКИ
    unsigned int i;
    Data = 0;    // очистка сдвигового регистра
    for (i = 0;i < 6; i++){
 Clock = 1;    //строб clock
 Clock = 0;    //для записи нулевых разрядов
 }
 Data = 1;    // строб Е
 Clock = 1;    // строб clock
 Clock = 0;
 
 Data = RS;    // бит RS
 Clock = 1;
 Clock = 0;
 
 for (i = 0; i < 4; i++){    // запись 4 бита
   if ((Nybble & 0x008) != 0)
       Data = 1;
   else
       Data = 0;
   Clock = 1;
   Clock = 0;
   Nybble = Nybble << 1;    // сдвиг влево перед записью нового  
 }          //полубайта
 Data = 1;    // строб Е
 Data  = 0;
} // конец подпрограммы LSDNybble

LCDByte(char Byte, char RS){    //запись байта в ЖКИ
    int LBDlay;    
    LCDNybble((Byte >> 4)& 0x00F, RS);    // старшая тетрада
    LCDNybble( Byte & 0x00F, RS);  // младшая тетрада
    
    if ((Byte < 4) && (RS == 0))
 LBDlay = RTC + 6;
    else
 LBDlay = RTC + 2;
    while (LBDlay != RTC);
    
} // конец LCDByte



//Обработчик прерываний от таймера:
void interrupt tmr0_int(void)
{
    char temp;
    //TMR0 = 0x0F0;
    if (T0IF)    //если запрос на прерывание  поступил от таймера TMR0
    {
 T0IF = 0;    //то сбросить флаг прерывания
 RTC++;  //и выполнить инкремент счетчика времени
 
 
    }
    
    
}

//Главная программа
void main(void)
{
    int i;
    TMR0 = 0;//x0F0;      //Начальное значение счетчика
     //реального времени
    OPTION = 0x0D1;  //использовать предделитель совместно
     // с таймером TMR0, коэффициент деления 4
    T0IE = 1;      // Разрешить прерфывание от таймера
    GIE = 1;      // Разрешить обработку прерываний
    
    
    
    Dlay = RTC + 20;
    while (Dlay != RTC);
    
    LCDNybble(0x003, 0);
    Dlay = RTC + 6;
    while (Dlay != RTC);
    
    LCDNybble(0x003, 0);
    Dlay = RTC + 1;
    while (Dlay != RTC);
    
    LCDNybble(0x003, 0);
    Dlay = RTC + 1;
    while (Dlay != RTC);
    
    LCDNybble(0x002, 0);
    Dlay = RTC + 1;
    while (Dlay != RTC);
    
    LCDByte(0x028, 0);
    LCDByte(0x008, 0);
    LCDByte(0x001, 0);
    LCDByte(0x006, 0);
    LCDByte(0x00E, 0);
    
    for (i = 0; i < 12; i++)
 LCDByte(Message[i], 1);
 
 
    while (1 == 1)  // Бесконечный цикл
    {
 
    }
}


Для АВР (тупое копирование с небольшой коррекцией)
Код
#include <90s8515.h>


#include <delay.h>


char Message[13] = "Hello World!";
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here

}

// Declare your global variables here

LCDNybble(char Nybble, char RS)
{
unsigned int i;
PORTA.0 = 0;
for (i=0; i<6; i++)
       {
       PORTA.1 = 1;
       PORTA.1 = 0;
       }        
PORTA.0 = 1;
PORTA.1 = 1;
PORTA.1 = 0;

PORTA.0 = RS;
PORTA.1 = 1;
PORTA.1 = 0;
for (i=0; i<4; i++)
       {
       if ((Nybble & 0x08) != 0)
               PORTA.0 = 1;
       else
               PORTA.0 = 0;
       PORTA.1 = 1;
       PORTA.1 = 0;
       Nybble = Nybble << 1;
       }
PORTA.0 = 1;
PORTA.0 = 0;
}

LCDByte(char Byte, char RS)
{
//int LBDlay;
LCDNybble((Byte >> 4) & 0x0F, RS);
LCDNybble(Byte & 0x0F, RS);
if ((Byte < 4) & (RS ==0))
       //LBDlay = RTC + 6;
       delay_ms(5);
else
       //LBDlay = RTC + 2;
       delay_ms(1);
}
void main(void)
{
// Declare your local variables here
int i;
// Input/Output Ports initialization
// Port A initialization
PORTA=0x00;
DDRA=0x03;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=0x05;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// LCD module initialization

PORTA.1 = 0;
PORTA.0 = 0;

delay_ms(20);
LCDNybble(0x03,0);
delay_ms(5);
LCDNybble(0x03,0);
delay_ms(1);
LCDNybble(0x03,0);
delay_ms(1);
LCDNybble(0x02,0);
delay_ms(1);
LCDByte(0x28,0);
LCDByte(0x08,0);
LCDByte(0x01,0);
LCDByte(0x06,0);
LCDByte(0x0E,0);

// Global enable interrupts
#asm("sei")

for (i=0; i<12; i++)
       LCDByte(Message[i],1);
while (1)
     {
     // Place your code here

     };
}


Ни один пример реально не работает
если надо могу кинуть схему подключения
rezident
Цитата(SergeyM @ Jun 8 2005, 20:47)
если надо могу кинуть схему подключения
*

Вот ее-то как раз желательно увидеть.
SergeyM
[/quote]
Вот ее-то как раз желательно увидеть.
*

[/quote]

немогу воткнуть картинку
rezident
Добавьте ее как обычный файл.
SergeyM
Для меньшей запутанности схемы я не стал соединять контакты на регистре сдвига следующие:
2-4
5-6
7-11
10-13
12-14

На ЖКИ питание подаю и выход RW на земле
vvs157
Цитата(SergeyM @ Jun 9 2005, 09:57)
На ЖКИ питание подаю и выход RW на земле
*


При сдиге у Вас все время будет попадать мусор на индикатор, поэтому Вы его коррекно не сможете инициализировать для работы в 4-х битовом режиме. По включению он находится в 8-ми битовом. Во-вторых я не уверен, что можно держать его R/W постоянно в состоянии записи, надо проверять по описанию.
vet
Цитата(vvs157 @ Jun 9 2005, 12:15)
Цитата(SergeyM @ Jun 9 2005, 09:57)
На ЖКИ питание подаю и выход RW на земле
*

Во-вторых я не уверен, что можно держать его R/W постоянно в состоянии записи, надо проверять по описанию.
*


Можно, работает.
SergeyM
У меня в книге написано как инициализировать в четырех битовый режим и сделано все так как говорится:
1) Ждать не мене 15 мс после включения питания
2) Записать в ЖКИ команду 0х03 и ждать 5 мс. пока она не выполнится
3) Опять записать в ЖКИ 0х03 и ждать 160 мкс
4) В третий раз подать команду 0х03 и ждать 160 мкс
5) установить режимы:
- подать команду 0х02 для установки курсора в начальную позицию
- подать команду 0х28 для выбора 4-х битного режима
- установить число строк и размер символов
- подать 0х08 чтобы выключить экран
- подать команду 0х01 что бы стереть изображение
- установить направление смещения курсора экрана
- подать команду включения экрана и если необходимо , курсора

Все вроде сделано, как вы говорите у меня 8-битный режим , почему?
И по схеме подключения показано что нужно RW подключить к земле, если где не прав то скажите где и лучше поясните.
phantom
А кто сказал, что 74174 - регистр сдвига? Это просто 6 Д-триггеров. Возьмите нормальный регистр сдвига!
vvs157
Цитата(SergeyM @ Jun 9 2005, 12:05)
Все вроде сделано, как вы говорите у меня 8-битный режим , почему?
*


Когда Вы записываете что-то в сдвиговый регистр - то сначала там будут одни нули - и они запишутся в индикатор. Потом там будет только одна единичка - и она тоже туда запишется и так далее. У Вас никогла ПЕРВОЙ команда 0х03 выполнена не будет. Чтоб это все работало, нужен сдвиговый регистр с дополнителным запоминающим регистром на выходе - типа 74HCT595.
SergeyM
народ вы конечно советуете как надо сделать через сдвиговый регистр 74HCT595 но вы поймите что я начинающий и мне нужно пошагово прокоментировать как и что куда прописать. Я попробовал то что даёт книга и понял что нихрена не даёт, если есть какие нибудь замечания то говорите мне, я попробую проанализировать :-)
vvs157
Цитата(SergeyM @ Jun 9 2005, 14:31)
народ вы конечно советуете как надо сделать через сдвиговый регистр 74HCT595 но вы поймите что я начинающий и мне нужно пошагово прокоментировать как и что куда прописать. Я попробовал то что даёт книга и понял что нихрена не даёт, если есть какие нибудь замечания то говорите мне, я попробую проанализировать :-)
*


Вам же сказали, что на сдвиговом регистре без доп. запоминающего регистра на выходе это никогда ни при каких условиях работать НЕ БУДЕТ!
SergeyM
Поймите что у меня нет 74HCT595 дайте аналог и если можно то с описанием что это такое, у меня в библиотеке Протеус не все элементы есть.
vvs157
Цитата(SergeyM @ Jun 9 2005, 14:44)
Поймите что у меня нет 74HCT595 дайте аналог и если можно то с описанием что это  такое, у меня в библиотеке Протеус не все элементы есть.
*


Тогда можно использовать второй 74174, подключив его к выходу первого. И добавив еще одну линию на перезапись с регистра сдвига в выходной регистр. Индикатор подключить к выходу второго 74174
phantom
Цитата
Когда Вы записываете что-то в сдвиговый регистр - то сначала там будут одни нули - и они запишутся в индикатор

Мне все же кажется, что схема (только со СДВИГОВЫМ регистром) и программа правильны - потому что записываться в индикатор что-либо будет только тогда, когда единичка подается на Е (точнее, кажется, по фронту спада). А это будет только тогда, когда 1 одновременно на выводе Q5 и на DATA (или я ошибаюсь?). А это будет только после запихивания в регистр последовательности 1-RS-D3-D2-D1-D0 (согласно программе, перед записью тетрады регистр обнуляется). Программа в целом тоже вроде правильна.
Все вышесказанное справедливо при условии применения СДВИГОВОГО регистра, потому что, повторюсь, 74174 таковым не является. Пример 8-разрядного сдвигового регистра - ИР24 (74299) . Еще кажется 74259, 74199, 74166... (могу ошибаться smile.gif )
SergeyM
увжаемый vss157 вы не моглибы мне дать конкретный пример с конкретной схемой, т.к. я уже говорил что я новенький в этом деле и такие пояснения мне ни очем не говорят.
vvs157
To phantom
Да вроде тут выходы соединены со входами, поэтому в принципе это 6 D-триггеров должны раболтать как регистр сдвига

To SergeyM

Попробуйте подключить вход Е индикатора непосредственно к одному из выходов МК (еще одна - 3-я линия) и передергивать Е после записи всего слова в регистр. Полезно проверить любым вольтметром , что на самом деле есть на выходах вашего регистра
rat
На www.circuitdevelop.narod.ru есть прога на С для 51 работы с ЖКИ с HD44780 контроллером.
phantom
Цитата
Да вроде тут выходы соединены со входами, поэтому в принципе это 6 D-триггеров должны раболтать как регистр сдвига

НЕ ВЕРИТЕ НА СЛОВО - ВОТ ВАМ КАРТИНКА ИЗ ДАТАШИТА НА 74174:
Нажмите для просмотра прикрепленного файла
И ЦИТАТА ИЗ ДАТАШИТА:
"The LS174 consists of six edge-triggered D flip-flops with individual D inputs and Q outputs. The Clock (CP) and Master Reset (MR) are common to all flip-flops. Each D input’s state is transferred to the corresponding flipflop’s output following the LOW to HIGH Clock (CP) transition."
SergeyM
Цитата(vvs157 @ Jun 9 2005, 23:30)
Попробуйте подключить вход Е индикатора непосредственно к одному из выходов МК (еще одна - 3-я линия) и передергивать Е после  записи всего слова в регистр. Полезно проверить любым вольтметром , что на самом деле есть на выходах вашего регистра
*


Вобщем попробовал, результата не дало. Пробовал по заднему фронту строб Е посылать, т. е. перед записью и после записи полубайта на Data подавал 0 вместо 1, тоже никаого результата.
phantom
А что насчет
Цитата
проверить любым вольтметром , что на самом деле есть на выходах вашего регистра
?

Цитата
Пробовал по заднему фронту строб Е посылать, т. е. перед записью и после записи полубайта на Data подавал 0 вместо 1

В смысле? В исходном варианте программы все правильно - запись именно по заднему фронту, т.к. сначала на ДАТА посылается 1, затем 0.
Не смею спрашивать, регистр поменять не пробовали? Или в результате Ваших исследований было установлено, что 74174 может работать как регистр сдвига? В таком случае следует, наверное, поставить в известность производителя о такой полезной недокументированной возможности... smile.gif smile.gif smile.gif
vvs157
Цитата(phantom @ Jun 10 2005, 14:45)
А что насчет
Цитата
проверить любым вольтметром , что на самом деле есть на выходах вашего регистра
?



Как раз посмотреть после записи в регист что там на выходе, а вольтетром - это на случай если осциллографа нет smile.gif
А то обсуждает, а может там на выходе всегда что-то не то w00t.gif
SergeyM
На счет поменять регистр. Нашел я регистры 74194 и 74199, скачал даташит, но чето пока не вкурил как его цеплять. Может подскажите?

Цитата
Как раз посмотреть после записи в регист что там на выходе, а вольтетром - это на случай если осциллографа нет 
А то обсуждает, а может там на выходе всегда что-то не то 


В протеусе видно что сначало что то поморгает на выходах потом все 0
phantom
Вообще то 74194 - 4х разрядный регистр, а нужно как минимум 6-ти! 74199 - 8ми, что в принципе подходит. Ну а если и по даташиту непонятно, как регистр подключить, то советую почитать курс "Основы цифровой техники" или что-то в этом роде, прежде чем заниматься подобными проектами... а то гляди окажется что вы не понимаете чем отличается регистр сдвига от параллельного регистра...
SergeyM
В общем разобрался я с регистром, при проверке отдельно от схемы все четко единичку передвигает. Но включив в схему, причем добавил третью ногу в работу, чтобы ноль подавала на сброс (74199) а затем обратно единичку. Короче чето непонятки какието, при симуляции все нормально вроде, а включаю эмуляцию неработает
Вот код (показываю только то что изменялось)
Код
LCDNybble(char Nybble, char RS)
{
unsigned int i;
/*PORTA.0 = 0;
for (i=0; i<6; i++)
       {
       PORTA.1 = 1;
       PORTA.1 = 0;
       }  */
PORTA.2 = 0;
PORTA.2 = 1;      
PORTA.0 = 1;
PORTA.1 = 1;
PORTA.1 = 0;

PORTA.0 = RS;
PORTA.1 = 1;
PORTA.1 = 0;
for (i=0; i<4; i++)
       {
       if ((Nybble & 0x08) != 0)
               PORTA.0 = 1;
       else
               PORTA.0 = 0;
       PORTA.1 = 1;
       PORTA.1 = 0;
       Nybble = Nybble << 1;
       }
PORTA.0 = 1;
PORTA.0 = 0;
}

// Port A initialization
State0=0
PORTA=0x00;
DDRA=0x07;

..........

// LCD module initialization
//lcd_init(16);

PORTA.1 = 0;
PORTA.0 = 0;
PORTA.2 = 1;

delay_ms(20);
LCDNybble(0x03,0);
delay_ms(5);
........
rezident
Цитата(phantom @ Jun 10 2005, 13:54)
Цитата
Да вроде тут выходы соединены со входами, поэтому в принципе это 6 D-триггеров должны раболтать как регистр сдвига

НЕ ВЕРИТЕ НА СЛОВО - ВОТ ВАМ КАРТИНКА ИЗ ДАТАШИТА НА 74174:
Нажмите для просмотра прикрепленного файла
И ЦИТАТА ИЗ ДАТАШИТА:
"The LS174 consists of six edge-triggered D flip-flops with individual D inputs and Q outputs. The Clock (CP) and Master Reset (MR) are common to all flip-flops. Each D input’s state is transferred to the corresponding flipflop’s output following the LOW to HIGH Clock (CP) transition."
*


Либо вы прикалываетесь, либо не понимаете как устроен сдвиговый регистр. cranky.gif
Чтобы из HC174 сделать сдвиговый регистр с последовательным входом и параллельным выходом, нужно каждый из выходов D-триггера соединить со входом следующего D-триггера (Q0-D1, Q1-D2, Q2-D3 и т.д.). Вход первого D0 ни с каким выходом соединять не нужно. Это будет ваш SerialIN. После этого у вас получиться 6-разрядный сдвиговый регистр с последовательным входом и паралельным выходом. Правда такой 8-ми разрядный уже давно придумали. Называется он 74HC164 smile.gif А для того чтобы все это извращение заработало с LCD нужно выполнить требования временной диаграммы цикла записи м/с контроллера LCD аля HD44780. Для этого требуется:
- опережение установки сигналов RS и R/W относительно установки E как минимум 40нс
- удержание данных относительно спада E как минимум 10нс
- удержание сигналов RS и R/W относительно E как миниум 10нс
В Вашем же случае все изменения сигналов будут происходить синхронно и поэтому работать не должно biggrin.gif Посему вариантов у вас немного: либо вы ставите еще один регистр-защелку наподобие этой же 74HC174, либо используете уже готовый сдвиговый регистр с промежуточным паралельным регистром 74HC595. Если первый вариант, то каждый выход первой HC174 соединяете с одноименным входом второй HC174. Сигналы для LCD берете уже с выходов второй HC174. Сигналы RESET также можно объединить, а вот таковые входы объединять нельзя. CLOCK второй HC174 это будет сигнал LD (LoadData). Процедура записи (исходя из вашей схемы подключения LCD) будет такова.
В самом начале неплохо бы сбросить оба регистра сигналом RESET.
1 шаг.
Записывате в первый регистр такую последовательноcть 0-RS-D7-D6-D5-D4, сопровождая данные сигналом CLOCK первой HC174.
Затем формируете сигнал LD (он же CLOCK второй HC174).
2 шаг.
Записывате в первый регистр такую последовательноcть 1-RS-D7-D6-D5-D4, сопровождая данные сигналом CLOCK первой HC174.
Затем формируете сигнал LD (он же CLOCK второй HC174).
3 шаг.
Записывате в первый регистр такую последовательноcть 0-RS-D7-D6-D5-D4, сопровождая данные сигналом CLOCK первой HC174.
Затем формируете сигнал LD (он же CLOCK второй HC174).
Все. Запись одного полубайта в LCD завершена.
SergeyM
Цитата
В самом начале неплохо бы сбросить оба регистра сигналом RESET.
1 шаг.
Записывате в первый регистр такую последовательноcть 0-RS-D7-D6-D5-D4, сопровождая данные сигналом CLOCK первой HC174.
Затем формируете сигнал LD (он же CLOCK второй HC174).
2 шаг.
Записывате в первый регистр такую последовательноcть 1-RS-D7-D6-D5-D4, сопровождая данные сигналом CLOCK первой HC174.
Затем формируете сигнал LD (он же CLOCK второй HC174).
1 шаг.
Записывате в первый регистр такую последовательноcть 0-RS-D7-D6-D5-D4, сопровождая данные сигналом CLOCK первой HC174.
Затем формируете сигнал LD (он же CLOCK второй HC174).
Все. Запись одного полубайта в LCD завершена.


дак мы три раза получается записываем одно и тоже значение в D7-D6-D5-D4
rezident
Цитата(SergeyM @ Jun 10 2005, 22:06)
дак мы три раза получается записываем одно и тоже значение в D7-D6-D5-D4
*

Ничего подобного! Таким образом мы формируем временную диаграмму записи одного полубайта. Если вы обратите внимание, то первый бит в цепочке (который у вас соответствует сигналу E) последовательно принимает состояния 0->1->0. А то, что данные и сигнал RS все это время одинаковы - это требования времянки цикла записи. Скачайте наконец даташит HD44780 и изучите его в части временных диаграмм записи и чтения (стр. 49-53, 58-59).
P.S. у меня опечатка в нумерации шагов. Их там три. Последний следует читать как "3 шаг" smile.gif
P.P.S. исправил.
phantom
Сорри, тормоз я! Извините, если кого обидел! Смотрел на схему а верхний текст, где написано как соединены выходы с входами "синтетического" регистра сдвига упустил sad.gif ... Каюсь. Но все же, лучше было бы полную схему привести!
SergeyM
В общем все ОК, я реализовал данный случай. Немного пришлось изменить код.
Да кстати rezident ниче ненадо соединять два 74174, все с одним прекрасно сработало, кстати спасибо за то что направил еще раз прочесть ДатаШит.
Мне всего то пришлось добавить задержку в одну мкс при стробировании Е и стробировать ее через другую ногу, иначе не хотела работать.
pan_oleg
SergeyM, ти абсолятно прав, достаточно всего одну 164 логику, строб индикатора на отдельний порт контроллера, и все работает по трех проводах (+ питание) a14.gif
yeah.gif
P.S. не даром притуман строб Е для работы индикатор на одной паралельной шине с другими устройствами
aleksey_g
Ваша проблема уже решена и опубликована!
Смотрите сюда:
http://electronix.ru/forum/index.php?showt...0934&st=30#
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.