|
LCD через регистр сдвига, Как реализовать? |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 42)
|
Jun 8 2005, 14:25
|

Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 13-05-05
Пользователь №: 4 986

|
Цитата Наверное неправильно пишу. Наверное... Трудно сказать, не видя кода Простите за глупый вопрос  , а как пишете, если даже не знаете, с контроллером ЖК или без? Или я чего-то не понимаю?
--------------------
О сколько нам открытий чудных ...
|
|
|
|
|
Jun 8 2005, 14:47
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
Вот примеры Для Пика (как в книге) Код // Глобальные переменные 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
}; } Ни один пример реально не работает если надо могу кинуть схему подключения
|
|
|
|
|
Jun 8 2005, 15:21
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
[/quote] Вот ее-то как раз желательно увидеть. [/quote] немогу воткнуть картинку
|
|
|
|
|
Jun 9 2005, 06:57
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
Для меньшей запутанности схемы я не стал соединять контакты на регистре сдвига следующие: 2-4 5-6 7-11 10-13 12-14 На ЖКИ питание подаю и выход RW на земле
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 9 2005, 08:51
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

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

Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 13-05-05
Пользователь №: 4 986

|
Цитата Когда Вы записываете что-то в сдвиговый регистр - то сначала там будут одни нули - и они запишутся в индикатор Мне все же кажется, что схема (только со СДВИГОВЫМ регистром) и программа правильны - потому что записываться в индикатор что-либо будет только тогда, когда единичка подается на Е (точнее, кажется, по фронту спада). А это будет только тогда, когда 1 одновременно на выводе Q5 и на DATA (или я ошибаюсь?). А это будет только после запихивания в регистр последовательности 1-RS-D3-D2-D1-D0 (согласно программе, перед записью тетрады регистр обнуляется). Программа в целом тоже вроде правильна. Все вышесказанное справедливо при условии применения СДВИГОВОГО регистра, потому что, повторюсь, 74174 таковым не является. Пример 8-разрядного сдвигового регистра - ИР24 (74299) . Еще кажется 74259, 74199, 74166... (могу ошибаться  )
--------------------
О сколько нам открытий чудных ...
|
|
|
|
|
Jun 10 2005, 07:54
|

Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 13-05-05
Пользователь №: 4 986

|
Цитата Да вроде тут выходы соединены со входами, поэтому в принципе это 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."
--------------------
О сколько нам открытий чудных ...
|
|
|
|
|
Jun 10 2005, 11:30
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
Цитата(vvs157 @ Jun 9 2005, 23:30) Попробуйте подключить вход Е индикатора непосредственно к одному из выходов МК (еще одна - 3-я линия) и передергивать Е после записи всего слова в регистр. Полезно проверить любым вольтметром , что на самом деле есть на выходах вашего регистра Вобщем попробовал, результата не дало. Пробовал по заднему фронту строб Е посылать, т. е. перед записью и после записи полубайта на Data подавал 0 вместо 1, тоже никаого результата.
|
|
|
|
|
Jun 10 2005, 11:45
|

Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 13-05-05
Пользователь №: 4 986

|
А что насчет Цитата проверить любым вольтметром , что на самом деле есть на выходах вашего регистра ? Цитата Пробовал по заднему фронту строб Е посылать, т. е. перед записью и после записи полубайта на Data подавал 0 вместо 1 В смысле? В исходном варианте программы все правильно - запись именно по заднему фронту, т.к. сначала на ДАТА посылается 1, затем 0. Не смею спрашивать, регистр поменять не пробовали? Или в результате Ваших исследований было установлено, что 74174 может работать как регистр сдвига? В таком случае следует, наверное, поставить в известность производителя о такой полезной недокументированной возможности...
--------------------
О сколько нам открытий чудных ...
|
|
|
|
|
Jun 10 2005, 12:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960

|
Цитата(phantom @ Jun 10 2005, 14:45) А что насчет Цитата проверить любым вольтметром , что на самом деле есть на выходах вашего регистра ? Как раз посмотреть после записи в регист что там на выходе, а вольтетром - это на случай если осциллографа нет А то обсуждает, а может там на выходе всегда что-то не то
|
|
|
|
|
Jun 10 2005, 12:16
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
На счет поменять регистр. Нашел я регистры 74194 и 74199, скачал даташит, но чето пока не вкурил как его цеплять. Может подскажите? Цитата Как раз посмотреть после записи в регист что там на выходе, а вольтетром - это на случай если осциллографа нет А то обсуждает, а может там на выходе всегда что-то не то В протеусе видно что сначало что то поморгает на выходах потом все 0
|
|
|
|
|
Jun 10 2005, 15:03
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
В общем разобрался я с регистром, при проверке отдельно от схемы все четко единичку передвигает. Но включив в схему, причем добавил третью ногу в работу, чтобы ноль подавала на сброс (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); ........
|
|
|
|
|
Jun 10 2005, 15:10
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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." Либо вы прикалываетесь, либо не понимаете как устроен сдвиговый регистр. Чтобы из HC174 сделать сдвиговый регистр с последовательным входом и параллельным выходом, нужно каждый из выходов D-триггера соединить со входом следующего D-триггера (Q0-D1, Q1-D2, Q2-D3 и т.д.). Вход первого D0 ни с каким выходом соединять не нужно. Это будет ваш SerialIN. После этого у вас получиться 6-разрядный сдвиговый регистр с последовательным входом и паралельным выходом. Правда такой 8-ми разрядный уже давно придумали. Называется он 74HC164  А для того чтобы все это извращение заработало с LCD нужно выполнить требования временной диаграммы цикла записи м/с контроллера LCD аля HD44780. Для этого требуется: - опережение установки сигналов RS и R/W относительно установки E как минимум 40нс - удержание данных относительно спада E как минимум 10нс - удержание сигналов RS и R/W относительно E как миниум 10нс В Вашем же случае все изменения сигналов будут происходить синхронно и поэтому работать не должно  Посему вариантов у вас немного: либо вы ставите еще один регистр-защелку наподобие этой же 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 завершена.
Сообщение отредактировал rezident - Jun 10 2005, 16:26
|
|
|
|
|
Jun 10 2005, 16:06
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
Цитата В самом начале неплохо бы сбросить оба регистра сигналом 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
|
|
|
|
|
Feb 4 2008, 16:31
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066

|
Ваша проблема уже решена и опубликована! Смотрите сюда: http://electronix.ru/forum/index.php?showt...0934&st=30#
Сообщение отредактировал aleksey_g - Feb 4 2008, 16:37
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|