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
}
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 enable
pin cambia de alto a bajo. En este momento, también verifica los pines rs
y rw
para 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 E
del HD44780 está mal llamado. Lógicamente, es la entrada de reloj del controlador LCD, y le pondría un nombre CLK
o 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
& RS
para 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.
DKNguyen