Не удается инициализировать ЖК-дисплей Qapass 1602A с PIC18F4620 - PullRequest
1 голос
/ 18 января 2020

Я не могу инициализировать ЖК-дисплей QAPASS 1602A с PIC18F4620, я всегда получаю квадратные блоки на обеих линиях. Сначала я думал, что ЖК-дисплей неисправен, поэтому получил новый, но результат тот же. Я использую плату разработки logifind PI C 40 Mini, подключенную к P C через PICkit3, все остальное работает нормально на каждом порту, но не на ЖК-дисплее.

Большое спасибо за вашу помощь.

//main.c
#include "newxc8_header.h"
#include <xc.h>
#include "lcd_16x2.h"

void main(void) {
    ADCON1=0x0F; //configuring all analog ports to digital
    TRISB=0x00; //Set RBs as output
    TRISD=0x00; //Set RDs as output
    TRISE=0x00; //Set REs as output

    LCD_Init();  //Initialize 16x2 LCD

    LCD_String("Hello");
    while(1);
}


//lcd_16x2.c
#include "lcd_16x2.h"

void LCD_Init(void)
{
    __delay_ms(1000);
    EN = 0;
    RS = 0;
    ldata = 0x00;
    LCD_Command(0x38);  // Initialization of 16X2 LCD: 8-bit, 2 Lines, 5x7 Dots
    LCD_Command(0x0C);  // Display ON Cursor OFF
    LCD_Command(0x01);   //clear LCD
    LCD_Command(0x02);   //cursor beginning first line
}

void LCD_Command(unsigned char cmd)
{
    ldata = cmd;  /* Send data to PORT as a command for LCD */
    RS = 0;  /* Command Register is selected */
    EN = 1;  /* High-to-Low pulse on Enable pin to latch data */
    __delay_ms(5);
    EN = 0;
    __delay_ms(3);
}

void LCD_Char(unsigned char data)
{
    ldata = data;  /* Send data to LCD */  
    RS = 1;  // Data Register is selected */
    EN = 1;  // High-to-Low pulse on Enable pin to latch data */   
    __delay_ms(5);
    EN = 0;
    __delay_ms(3);
}

void LCD_String(const char *msg)
{
    while(*msg != 0)
    {
      LCD_Char(*msg);
      msg++;
    }
}

//lcd_16x2.h
#ifndef LCD_16X2_H
#define LCD_16X2_H

#ifdef  __cplusplus
extern "C" {
#endif

#include <xc.h>

#define _XTAL_FREQ 16000000 //16 MHz (4 MHz x 4 PLL)

#define ldata LATB                  /*PORTB(RB0-RB7) is used for transmitting data to LCD*/
#define RS LATEbits.LATE0           /*RE0 pin is used for Register Select*/
#define EN LATEbits.LATE1           /*RE1 pin is used for Enable*/

void LCD_Init(void);
void LCD_Command(unsigned char );
void LCD_Char(unsigned char x);
void LCD_String(const char *);
void LCD_Clear();

#ifdef  __cplusplus
}
#endif

#endif  /* NEWFILE_H */

1 Ответ

0 голосов
/ 19 января 2020

Ваш вопрос содержит недостаточно информации для однозначного ответа.

Лучше всего предположить, что у вас возникла ошибка проводки между вашей платой LogiFind PI C -40-MINI: enter image description here и ваш ЖК-модуль QAPASS 1602A: enter image description here Будет полезна фотография их соединения.

Если вы уверены, что проводка выполнена правильно, проблема может быть в функция LCD_Init (), см. Таблица данных HD44780 стр. 45 для блок-схемы инициализации модуля в 8-битном параллельном режиме или в коде, который вы не опубликовали.

Добавлено 19 января 2020 года:

Я собрал модуль PIC18F4620 и ЖК-дисплей, как вы описали.

Обнаружил, что ваш опубликованный код не отображает слова конфигурации, которые вы используете.

При использовании внутреннего генератора на частоте по умолчанию (1 МГц) ваш код работает, но он в 16 раз медленнее, чем ожидалось.

После настройки некоторых параметров это окончательная версия кода:

* 1 026 *
...