Перейти к содержанию
    

подключение lcd FDCC2004A к atmega8

В процедуре проверки флага думаю нужно инвертировать все E как и в основном коде по совету ILYAUL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот код

#include <io.h>
#include <delay.h>
#define E PORTC.2
#define RS PORTC.0
#define RW PORTC.1
#define port PORTD
int chkbf(){    // проверка флага занятости
    DDRD=0x00;
    port=0xff;
    RS=0;
    RW=1;
    E=0;
    delay_us(2);
    E=1;
    delay_us(2);
    E=0;
    return(PIND.7);    
}
void wrcmd(int cmd){    // пишу команду
    DDRD=0xff;
    //while(chkbf());    
    RS=0;
    RW=0;
    E=0;
    delay_us(2);
    port=cmd;
    delay_us(2);
    E=1;
    delay_ms(2);
    E=0;
}
void wrsym(int sym){     // пишу символ
    DDRD=0xff;   
    //while(chkbf());
    RS=1;
    RW=0;
    E=1;
    port=sym;
    delay_us(2);
    E=0;
    delay_us(2);
    E=1;
}
void main(){
    DDRC=0xff;
    PORTC=0x00;
    delay_ms(20);
    
    wrcmd(0b00110000);  // инициализация
    delay_ms(5);
    wrcmd(0b00001110);
    delay_us(40);
    wrcmd(0b00000001);
    delay_ms(2);
    wrcmd(0b00000110);
    delay_us(40);
    wrsym(0x30);  //пишу символ
}

Изменено пользователем failguru

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у вас в процедуре вывода символа

 

    E=1;
    port=sym;
    delay_us(2);
    E=0;
    delay_us(2);
    E=1;

 

в процедуре проверки флага занятости

 

    E=0;
    delay_us(2);
    E=1;
    delay_us(2);
    E=0;

 

Видите разницу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

загвоздка была в этом

void wrcmd(int cmd){    // пишу команду
    [b]DDRD=0xff;
    while(chkbf());[/b]    
    RS=0;
    RW=0;

в проверке бизи флага я переключал порт на вход, а при записи команды переключение на выход было раньше проверки бизи флага)))))

 

вот причесал код, все работает!!!

 

#include <io.h>
#include <delay.h>
#define E PORTC.2
#define RS PORTC.0
#define RW PORTC.1
#define port PORTD
int chkbf(){    // проверка флага занятости
    DDRD=0x00;
    port=0xff;
    RS=0;
    RW=1;
    E=1;
    delay_us(2);
    E=0;
    return(PIND.7);    
}
void wrcmd(int cmd){    // пишу команду
    while(chkbf());
    DDRD=0xff;    
    RS=0;
    RW=0;
    E=1;
    port=cmd;
    delay_us(2);
    E=0;
}
void wrsym(int sym){     // пишу символ   
    while(chkbf());
    DDRD=0xff;
    RS=1;
    RW=0;
    E=1;
    port=sym;
    delay_us(2);
    E=0;
}
void main(){
    DDRC=0xff;
    PORTC=0x00;
    delay_ms(20);
    
    wrcmd(0b00110000);  // инициализация
    delay_ms(5);
    wrcmd(0b00001110);
    delay_us(40);
    wrcmd(0b00000001);
    delay_ms(2);
    wrcmd(0b00000110);
    delay_us(40);
    wrsym(0x30);  //пишу символ
}

 

Спасибо, очень всем благодарен! Форум супер, первый раз тут :a14:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так)

Ах , ну да..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас в чтении bsy флага ошибка. Вот тут -

    E=1;
    delay_us(2);
    E=0;
    return(PIND.7);

Вы должны прочесть PIND.7 до того, как сбросите E перед выходом из функции. У вас сейчас ваша функция читает бит 7 с уже отключенной шины LCD (и читает она оттуда всегда 1, т.к. в LCD шина притянута резисторами в 1)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

походу успевает, раз ноль читает с портд.7)))) частота кварца 8МГц, следовательно 125нс один такт, нормал. Либо нужно сделать паузу в 120нс после поднятия Е, если я правильно понимаю))))))))))))) а то не то может считать)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

E выставляешь в 1. делаешь задержку на время нужное для выставления контроллером жки данных(смотри по даташиту), читай данные, E сбрасывай в 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дк я и говорю в даташите максимум 120нс. с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться

Изменено пользователем failguru

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дк я и говорю в даташите максимум 120нс.
Максимум - это не минимум. Т.е. 120нс вам никто не гарантирует. Вам гарантируют, что будет не более 120нс, т.е. вполне может быть и 0

с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться
Если устойчивая работа не интересует, то конечно можно не парится :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь знает, когда ставлю двухстрочный режим он ничего не показывает. При однострочном все нормал, только 1 и 3тью строку соответственно пишет, так по адресам и должно быть. Дальше если указать адрес второй строки или четвертой, то он там ничего не пишет, что скорее всего из-за однострочного режима. А как двустрочный сделать? :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На практике будет работать как вы сделали, но вообще это неправильно....

Выставить E в 1, ждать 120 нс, читать выставленные контроллером ЖКИ данные.

В вашем случае если расширите программу и будете использовать прерывания, то есть вероятность сработки прерывания как раз после того как выставите E в 0, но до того как вы прочитаете шину данных. В этом случае вы точно не успеете считать данные.

 

Однострочный или двустрочный режим задается при инициализации...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...