4-битный ЖК-дисплей 4x20 с Atmega32

У меня проблемы с ЖК-дисплеем 4x20. Я просматривал множество руководств и фрагментов кода за последние несколько дней, но, похоже, ничего не помогло. Проблема в том, что на дисплеях ничего не отображается.

Когда я компилирую его на своем компьютере и распечатываю все на своем экране, кажется, что все в порядке.

Я был бы признателен, если бы кто-нибудь просмотрел его и увидел, есть ли какие-либо очевидные ошибки.

Заранее спасибо.

//  Connection:
//
//  Atmega32    LCD
//  PB0     ->  DB4
//  PB1     ->  DB5
//  PB2     ->  DB6
//  PB3     ->  DB7
//  PB4     ->  RS
//  PB5     ->  R/W
//  PB6     ->  E
//  PB7     ->  

#include <avr/io.h>
#include <util/delay.h>

#define LCDPort PORTB
#define LCDDDR  DDRB
#define enable 6        //Enable = on
#define readWrite 5     //Read = on, Write = off
#define RS 4            //Send command = off, send data = on

void checkBusy(void);
void updateLCD(void);
void sendCommand(unsigned char command);
void sendData(unsigned char character);
void sendInitCommand(unsigned char command);

int main(void)
{
    LCDDDR |= 15;
    LCDDDR |= 1 << enable;                      //Set control lines as output (high)
    LCDDDR  |= 1 << readWrite;
    LCDDDR  |= 1 << RS;                         

    _delay_ms(100);                              //Wait for LCD to boot
    sendInitCommand(0x3);                        //Init function set 1
    _delay_ms(100);
    sendInitCommand(0x3);                        //Init function set 2
    _delay_us(100);
    sendInitCommand(0x3);                        //Init function set 3
    _delay_us(100);
    sendInitCommand(0x2);                        //Function set (set 4 bit mode)
    _delay_us(100);
    sendInitCommand(0x28);                       //Funcion set I=1, N=0, F=0
    //sendInitCommand(0x8);                      
    _delay_us(60);
    sendInitCommand(0x8);                        //On/off control D=0, C=0, B=0
    //sendInitCommand(0x8);
    _delay_us(60);
    sendCommand(0x01);                           //Clear display
    //sendInitCommand(0x1);
    _delay_ms(60);
    sendCommand(0x06);                           //Entry mode set I/D=1, S=0
    //sendInitCommand(0x6);
    _delay_us(60);
    sendCommand(0x0C);                           //On/off control D=1, C=0, B=0
    //sendInitCommand(0xC);
    _delay_us(60);


    sendData(0x41);                             //Display "A"
    sendData(0x42);                             //Display "B"
    sendData(0x43);                             //Display "C"
    sendData(0x44);                             //Display "D"
    sendData(0x45);                             //Display "E"



    while(1) {

    }

    return 0;
}

void checkBusy() {

    LCDDDR &= ~15;                              //Set data DDR lines read (low)

/*  LCDPort |= 1 << readWrite;                  //Forget read for now - use delay instead
    LCDPort &= ~1 << RS;

    while((LCDPort & 15) >= 0x8) {
        updateLCD();
    }
*/
    _delay_ms(50);
    LCDDDR |= 15;                               //Set data lines DDR to write (high)


}

void updateLCD() {

    LCDPort |= 1 << enable;                     //Enable
    asm volatile ("nop");
    asm volatile ("nop");
    LCDPort &= ~1 << enable;                    //Disable
}

void sendCommand(unsigned char command) {

    checkBusy();
    LCDPort &= ~(1 << readWrite | 1 << RS);     //Set R/W and RS low (write command)
    LCDPort |= (command >> 4) & 15;             //Send 4 ms bits
    updateLCD();
    LCDPort &= ~15; 
    LCDPort |= command & 15;                    //Send 4 ls bits
    updateLCD();
    LCDPort &= ~15;                             //Clear data lines

}

void sendData(unsigned char character) {

    checkBusy();
    LCDPort &= ~1 << readWrite;                 //Set R/W low and RS high (write data)
    LCDPort |= 1 << RS;
    LCDPort |= (character >> 4 & 15);           //Send 4 ms bits
    updateLCD();
    LCDPort &= ~1 << readWrite;
    LCDPort &= ~15;
    LCDPort |= 1 << RS;
    LCDPort |= (character & 15);                //Send 4 ls bits
    updateLCD();
    LCDPort &= ~15;                             //Clear data lines
}

void sendInitCommand(unsigned char command) {

    LCDPort &= ~(1 << readWrite | 1 << RS);     //Set R/W and RS low (write command)
    LCDPort |= command & 15;                    
    updateLCD();
    LCDPort &= ~15;                             //Clear data lines
}

person nettogrisen    schedule 04.01.2013    source источник
comment
Пора выйти за рамки ...   -  person Carl Norum    schedule 05.01.2013
comment
Какая модель или чипсет у дисплея? У вас есть ссылка на его спецификацию?   -  person Ashley Ross    schedule 05.01.2013
comment
Я получил его от друга, у которого он работал в 4-битном режиме. Единственное, что я смог найти, это следующее: powertipusa.com/pdf/pc2004a.pdf   -  person nettogrisen    schedule 05.01.2013
comment
Позднее обновление: приведенный выше код действительно работал. Это был дисплей, который был разбит. Я купил новый и протестировал его со своим кодом.   -  person nettogrisen    schedule 11.01.2016


Ответы (1)


Похоже, это контроллер, совместимый с HD44780.

Обратите внимание, что каждый дисплей 4x20 - это реальный дисплей 2x40, разрезанный посередине. Это можно реализовать с помощью одного контроллера дисплея, но для дисплея требуется несколько драйверов. Взгляните на это: HD44780

тем не менее, вы можете использовать дисплей в 4-битном режиме.

Вот пример того, как взаимодействовать с 4x20 в битовом режиме (обратите внимание, что Pin15 (LED +) и Pin16 (LED-) отсутствуют, это только контакты подсветки). Не забудьте подключить контакт 5 (R / W) к GND.

HD44780 в 4-битном режиме

Очень хорошая библиотека для взаимодействия с HD44780 4x20 написана Питером Флери: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs в разделе "ЖК-библиотека для ЖК-дисплеев на основе HD44870" попробуйте

person derWilly    schedule 05.01.2013
comment
Большое спасибо :) Мне было интересно об этом. Когда я настраиваю контраст, я вижу только черные квадраты на 2 строках (строки 1 и 3). Значит ли это, что я сбился со своей программой? Я собираюсь изучить опубликованную вами библиотеку. - person nettogrisen; 05.01.2013
comment
нет, но библиотека - это быстрый и дешевый способ узнать больше о взаимодействии с символьным ЖК-дисплеем. с небольшими изменениями в lcd.h вы можете связать каждый HD44780 (2x16, 4x16, 4x20 и так далее ...) - person derWilly; 05.01.2013
comment
когда вы видите только строки 1 и 3, посмотрите определения размера экрана в lcd.h, там есть начальные адреса каждой строки. это может решить вашу проблему - person derWilly; 05.01.2013