¿Por qué necesita tantos lcd_enable en el comando en el método lcd_init?

A continuación hay solo una parte de los comandos, incluso con comentarios, todavía no podía entender el principio de funcionamiento de la pantalla LCD incluso después de leerlo en línea, es "lcd_enable ()" es el comando para escribir la configuración en diferentes registros en la pantalla LCD ? Además, si originalmente estos comandos no están configurados en la pantalla LCD, ¿hay una configuración predeterminada en la pantalla LCD?

// PIC16F877A Configuration Bit Settings

// 'C' source line config statements

// CONFIG

#pragma config FOSC = XT    // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF    // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = OFF   // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = OFF   // Brown-out Reset Enable bit (BOR disabled)

#pragma config LVP = OFF    // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)

#pragma config CPD = OFF    // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF    // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF     // Flash Program Memory Code Protection bit (Code protection off)



// #pragma config statements should precede project file includes.

#include <xc.h>



#define _XTAL_FREQ 4000000



#define rs RA1

#define rw RA2

#define e RA3

void lcd_init();        //LCD init
void lcd_enable();       //LCD display setting

void lcd_init()

 {

  PORTD=0X01;         //clear screen

  lcd_enable();

  PORTD=0X00;        //8 bits 2 lines 5*7 mode.

  lcd_enable();

  PORTD=0X0F;        //display on,cursor on,blink on.

  lcd_enable();

  PORTD=0X06;        //character not move,cursor rotate right.

  lcd_enable();

  PORTD=0X80;         

  lcd_enable();

 }

void lcd_enable()

 {

  rs=0;           //is command not data

  rw=0;           //is write not read.

  e=0;           //pull low enable signal.

  __delay_ms(100);     //for a while.

  e=1;           //pull high to build the rising edge

 }
¿Por qué no busca en el código el cuerpo de lcd_enable() para ver qué hace?

Respuestas (2)

En este código lcd_enable()envía comandos al controlador LCD que previamente se han configurado en sus líneas de datos (que están conectadas al puerto D). El controlador LCD acepta el comando cuando su enablepin cambia de alto a bajo. En este momento, también verifica los pines rsy rwpara ver si se ordena un comando o una transferencia de datos, y si se están escribiendo o leyendo datos.

Esta lcd_enable()función probablemente solo se usa para inicializar la pantalla, y se espera que use alguna otra función para escribir caracteres, etc. Digo esto porque no tiene opción para escribir datos o leer desde la pantalla, y tiene un retraso de 100 ms que generalmente solo se necesita durante la inicialización.

Para obtener más información sobre cómo funcionan estos controladores, lea la hoja de datos HD44780 . Tenga en cuenta que algunos controladores 'compatibles' tienen requisitos de programación ligeramente diferentes. Si su módulo LCD viene con su propia hoja de instrucciones, debe consultarla para verificar la secuencia de comandos correcta para la inicialización.

Creo lcd_enable()y en realidad el pin de hardware Edel HD44780 está mal llamado. Lógicamente, es la entrada de reloj del controlador LCD, y le pondría un nombre CLKo algo similar. Entonces, lcd_enable()las funciones en realidad no habilitan nada, solo generan una señal de reloj de borde ascendente. La función también restablece R/W& RSpara que el valor en el bus de datos sea una operación de escritura de comandos .

HD44780 necesita un procedimiento de inicialización especial después del encendido. Esto se hace mediante comandos específicos con requisitos mínimos de tiempo específicos. El procedimiento está bien explicado en la hoja de datos.

El pin E en realidad se llama Habilitar porque el controlador LCD está diseñado para conectarse a MPU con interfaz de bus tipo Motorola 6800, que también tiene pines llamados E y R/W. Por lo tanto, no es directamente compatible con la interfaz de tipo Intel 8080 con luces estroboscópicas RD y WR separadas. Y realmente es la habilitación de la interfaz de bus, no es un reloj. Para las lecturas, la habilitación comienza a enviar datos al bus. Pero tiene razón en que el borde de habilitación descendente activa la pantalla LCD para que tal vez avance el contador de direcciones para señalar el siguiente carácter, por lo que Habilitar es una señal estroboscópica.