реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> LCD через регистр сдвига, Как реализовать?
SergeyM
сообщение Jun 8 2005, 08:28
Сообщение #1


Участник
*

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



Помогите пожалуйста реализовать работу МК с ЖКИ через регистр сдвига. Что то пробовал и не хотит ничего отображатьsad.gif
Go to the top of the page
 
+Quote Post
yung
сообщение Jun 8 2005, 09:07
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Поподробней, пожалуйста. ЖКИ голый или с контроллером? Если да, то каким.
Go to the top of the page
 
+Quote Post
Igor26
сообщение Jun 8 2005, 10:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(SergeyM @ Jun 8 2005, 11:28)
Помогите пожалуйста реализовать работу МК с ЖКИ через регистр сдвига. Что то пробовал и не хотит ничего отображатьsad.gif
*

На сколько я помню на "чистый" ЖКИ, чтоб он работал, на сегменты подают переменку.
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 8 2005, 11:19
Сообщение #4


Участник
*

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



Тогда поставим вопрос по другому:
Я проверял работоспособность в Протеусе, причем со стандартным примером в CVavr по работе с LCD. Где Хело МИР написано. И он работал, потом я используя тот же самый дисплей решил проверить работу через сдвиговый регистр, но обломался.
На счет с контроллером ЖК или без я незнаю, я подумал если работал с другим примером то и с этим будет робить. Наверное неправильно пишу.
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jun 8 2005, 11:19
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(SergeyM @ Jun 8 2005, 11:28)
Помогите пожалуйста реализовать работу МК с ЖКИ через регистр сдвига. Что то пробовал и не хотит ничего отображатьsad.gif
*


Для работы с бесконтроллерным ЖКИ лучше использовать соотв. контроллер. Иначе придется городить генератор и схему смены полярности на XOR элементах. При запитке напряжением, содержащим постоянную составляющую индикатор выйдет из строя.
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 8 2005, 11:21
Сообщение #6


Участник
*

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



Да еще никто не подскажет как отдельным выводам порта присвоить переменную
Go to the top of the page
 
+Quote Post
phantom
сообщение Jun 8 2005, 13:26
Сообщение #7


Местный
***

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



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


--------------------
О сколько нам открытий чудных ...
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 8 2005, 13:47
Сообщение #8


Участник
*

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



В принципе через регистр сдвига можно работать с ЖКИ используя всего две ноги МК, а не весь порт. А пример я привел, потомучто он показал что ЖКИ рабочий.
Go to the top of the page
 
+Quote Post
phantom
сообщение Jun 8 2005, 14:25
Сообщение #9


Местный
***

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



Цитата
Наверное неправильно пишу.

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

Простите за глупый вопрос huh.gif , а как пишете, если даже не знаете, с контроллером ЖК или без? Или я чего-то не понимаю?


--------------------
О сколько нам открытий чудных ...
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jun 8 2005, 14:27
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



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


Если у Вас алфавитно-цифровой 5х7 ЖКИ с типовым контроллером, то можно использовать регистр типа 74HCT595 . Но только тогда надо 3 ноги - такт, данные и перенос из регистра сдвига в выходной регистр.
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 8 2005, 14:34
Сообщение #11


Участник
*

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



ЖК совместимый с 44780 16 символов 2 строки, регистр 74LS174, стирание перед каждой записью использую побитно, можно использовать третью ногу для подачи сигнала очистки, а можно как в моем примере. Причем пример взят из книги, но нифига он не работает ни на Пике ни на АВР.
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 8 2005, 14:47
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 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

     };
}


Ни один пример реально не работает
если надо могу кинуть схему подключения
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 8 2005, 15:00
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Вот ее-то как раз желательно увидеть.
Go to the top of the page
 
+Quote Post
SergeyM
сообщение Jun 8 2005, 15:21
Сообщение #14


Участник
*

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



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

[/quote]

немогу воткнуть картинку
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 8 2005, 15:34
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Добавьте ее как обычный файл.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 16:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016