ЖК-интерфейс с atmega16

Я попытался связать ЖК-дисплей с atmega16, мой ЖК-дисплей - jhd 162A. Я приложил код, а также схему. Всякий раз, когда я подключаю соответствующие контакты, видны только черные точки, а не то, что я намеревался отобразить. Я не мог, в чем была моя проблема. прилагается схема.!

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000L

#define lcd_data    PORTC
#define control     PORTB
#define rs          PB2
#define rw          PB1
#define en          PB0

void lcd_init (void);
void lcd_command(unsigned char cmd);
void lcd_write(unsigned char data);
void lcd_string(unsigned char *str);
void dis_cmd(char cmd_value);
void dis_write(unsigned char data);

int main()
{
    DDRB = 0xFF;
    DDRC = 0xFF;

    lcd_init();
    _delay_ms(50);

    _delay_ms(1);
    lcd_str("PROGRAMMING");
    _delay_ms(50);
    dis_cmd(0xc0);
    lcd_str("IS FUN");
     return 0;
}

void lcd_init (void)
{
    dis_cmd(0x02); //initialises lcd  on 4 bits mode
    _delay_ms(1);
    dis_cmd(0x28); //initialises lcd to use 2 line and 5*7 matrix ie 16*2 lcd on 8 bits
    _delay_ms(1);
    dis_cmd(0x01);//clears lcd screen
    _delay_ms(1);
    dis_cmd(0x0E);//display ON cursor ON
    _delay_ms(1);
    dis_cmd(0x80);//cursor is set on the 1st line
    _delay_ms(1);
    return;

}

void lcd_command(unsigned char cmd)
{
    lcd_data =cmd;
    control = (0<<rs)| (0<<rw) | (1<<en); // setting rs to 0 is command mode when rw=0 write mode
    _delay_ms(1);
    control = (0<<rs)| (0<<rw) | (0<<en);
    _delay_ms(50);

    // 2ta control command is used for the high to low transition of enable as the code works on the falling 
    // edge of the enable en
    return;
}

void lcd_write(unsigned char data)
{
    lcd_data= data;
    control = (1<<rs)| (0<<rw) | (1<<en); // setting rs to 0 is command mode when rw=0 write mode
    _delay_ms(1);
    control = (1<<rs)| (0<<rw) | (0<<en);
    _delay_ms(50);
    return;
}

void dis_write(unsigned char data)
{
    char data1;

    data1 = data & 0xF0;        //mask lower nibble because PA4-PA7 pins are used. 
    lcd_write(data1);


    data1 = ((data<<4) & 0xF0); //shift 4-bit and mask
    lcd_write(data1);

    return;
                // send to LCD

}
void lcd_str(unsigned char *str)
{
    int i = 0;
    while(str[i] != '\0')
    {
        dis_write(str[i]);
        i++;

    }
    return;

}
void dis_cmd(char cmd_value)
{
    char cmd_value1;

    cmd_value1 = cmd_value & 0xF0;      //mask lower nibble because PB4-PA7 pins are used. 
    lcd_command(cmd_value1);            // send to LCD

    cmd_value1 = ((cmd_value<<4) & 0xF0);   //shift 4-bit and mask
    lcd_command(cmd_value1);            // send to LCD
}

person novice1618    schedule 16.06.2014    source источник


Ответы (3)


Я думаю, что вы не выполняете требуемую последовательность инициализации. В lcd_init() вы начинаете с отправки набора функций.

Однако перед этим дисплей ожидает следующую последовательность:

введите здесь описание изображения

Я не уверен, как это обрабатывается с использованием 4-битного интерфейса, но я думаю, что именно поэтому DB3-0 «все равно». Вероятно, вам просто нужно применить DB7-4 на вашей 4-битной шине (прочитайте техническое описание).

Я бы подождал несколько сотен миллисекунд при запуске, чтобы убедиться, что Vcc стабилен. Затем выполните последовательность сброса с расслабленным временем, например

PowerOn
Подождать 200 мс
Отправить инструкцию
Подождать 20 мс
Отправить инструкцию
Подождать 5 мс
Отправить инструкцию
Подождать 5 мс
Отправить набор функций
...

Поскольку вы не опрашиваете флаг занятости, я бы подождал не менее 1 мс между всеми следующими инструкциями.

person Rev    schedule 17.06.2014

Вы определяете четырехбитный режим в вашем lcd_init, и ваше программирование предназначено для 8-битного режима.

Для 8-битного режима используйте его так

void lcd_init (void)
{
    dis_cmd(0x02); //initialises lcd  on 4 bits mode
    _delay_ms(1);
    dis_cmd(0x38); //initialises lcd to use 2 line and 5*7 matrix ie 16*2 lcd on 8 bits
    _delay_ms(1);
    dis_cmd(0x01);//clears lcd screen
    _delay_ms(1);
    dis_cmd(0x0E);//display ON cursor ON
    _delay_ms(1);
    dis_cmd(0x80);//cursor is set on the 1st line
    _delay_ms(1);
    return;

}

А еще, PORTC иногда создает проблемы с lcd, для этого нужно отключить JTAG

person Tabish Saifullah    schedule 21.06.2014

В вашем коде есть две проблемы: -

1) Вы используете команду "dis_cmd(0x28);" которые определяют 4-битный режим. Если вы хотите использовать 8-битный режим, измените его на « dis_cmd (0x38);»

2) Либо не используйте PORTC для данных ЖК-дисплея, либо отключите JTAG. При включении JTAG PORTC не передает данные на ЖК-дисплей. Я не знаю причины этого, но я узнал об этом на собственном опыте.

person Tabish Saifullah    schedule 23.12.2014