En aquest exemple volem enviar unes lletres a la pantalla. En el programa següent enviem "PIC" a la primera línia i "kit" a la segona. Hem posat els caràcters a enviar en el propi cos del programa però els podíem haver posat a la memòria de programa o a la memòria EEPROM i fer el programa més curt.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8
// Definició de les funcions que farem servir void IniPant(void); // Inicialització de la pantalla void ConfPant(void); // Configuració de la pantalla void EnviaL(char Caracter); // Envia un caràcter ASCII void EnviaC(char Caracter); // Envia un caràcter de control void EnviaI(char Caracter); // Envia un nibble de control void Cursor(char Filera, char Columna); // Posiciona el cursor (filera 1 a 2 i columna 1 a 32, segons pantalla)
void main (void) {
TRISC = 0; // Tot el port C és de sortida
TRISB = 0; // Tot el port B és de sortida
IniPant(); // Inicialització de la pantalla
_delay(100000); // Retard (0,1 s)
ConfPant(); // Configuració de la pantalla
_delay(100000); // Retard (0,1 s)
Cursor(1, 1); // Posició
EnviaL('P'); // Lletra
EnviaL('I'); // Lletra
EnviaL('C'); // Lletra
Cursor(2, 1); // Posició
EnviaL('k'); // Lletra
EnviaL('i'); // Lletra
EnviaL('t'); // Lletra
while (1) // Mentre el contingut del parèntesi sigui 1
; // repetirà aquesta línia (es bloqueja aquí)
}
void IniPant(void) {
_delay(250000); // Retard (250 ms)
EnviaI(0b00100000); // Function set - Configuració inicial 0010 al nibble de l'esquerra
EnviaC(0b00101000); // Configuració 2 línea, 5x8 píxels
}
void ConfPant(void) {
EnviaC(0b00001111); // Display ON/OFF control - Activa la pantalla amb cursor intermitent
EnviaC(0b00000001); // Clear display - Buida la pantalla i inicialitza
_delay(3900); // Retard (3,9 ms)
EnviaC(0b00000110); // Entry mode - Buida la pantalla, sentit dreta i despl. automàtic
}
void EnviaC(char Caracter) {
_delay(800); // Retard (0,8 ms)
PORTB = 0b00000000; // Desactiva E i RS
_delay(3); // Retard (3 us)
PORTC = Caracter & 0xF0; // Agafa els 4 bits més alts
PORTB = 0b10000000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00000000; // Desactiva E
Caracter = Caracter << 4;
PORTC = Caracter; // Agafa els 4 bits més baixos
PORTB = 0b10000000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00000000; // Desactiva E
}
void EnviaL(char Caracter) {
_delay(800); // Retard (0,8 ms)
PORTB = 0b00100000; // Desactiva E i activa RS
_delay(3); // Retard (3 us)
PORTC = Caracter & 0xF0; // Agafa els 4 bits més alts
PORTB = 0b10100000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00100000; // Desactiva E
Caracter = Caracter << 4;
PORTC = Caracter; // Agafa els 4 bits més baixos
PORTB = 0b10100000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00100000; // Desactiva E
}
void EnviaI(char Caracter) {
_delay(800); // Retard (0,8 ms)
PORTB = 0b00000000; // Desactiva E i RS
_delay(3); // Retard (3 us)
PORTC = Caracter & 0xF0; // Agafa els 4 bits més alts
PORTB = 0b10000000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00000000; // Desactiva E
}
void Cursor(char Filera, char Columna) {
char Posicio = 0; // Variable per a calcular la posició
if (Filera == 2) {
Posicio = 64; // La primera columna de la segona fila és 64;
}
if (Columna > 0 && Columna < 33) { // Comprovem que sigui un valor raonable
Posicio = Posicio + Columna; // Sumem les adreces
Posicio = Posicio - 1; // Restem 1 perquè numera des de 0
}
Posicio = Posicio + 128; // Posa el bit de posicionat a 1
EnviaC(Posicio); // Canvia el cursor de lloc
}
En la següent versió de l'exemple hem afegit un caràcter especial (la lletra Ω) que l'hem guardat a la posició 0 de la CGRAM, que correspon als caràcters 0 i 8 de la taula de caràcters. Aquesta Ω la fem sortir a la posició 16 de la primera línia i també a la posició 15 de la segona; però en un cas la cridem com a caràcter 0 i a l'altre com a caràcter 8.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8
// Definició de les funcions que farem servir void IniPant(void); // Inicialització de la pantalla void ConfPant(void); // Configuració de la pantalla void EnviaL(char Caracter); // Envia un caràcter ASCII void EnviaC(char Caracter); // Envia un caràcter de control void EnviaI(char Caracter); // Envia un nibble de control void Cursor(char Filera, char Columna); // Posiciona el cursor (filera 1 a 2 i columna 1 a 32, segons pantalla) void DefCarac(char Numero, char Fileres[8]); // Crea un caràcter definit per l'usuari
char Omega[8] = {0b00000100, 0b00001010, 0b00010001, 0b00010001, 0b00001010, 0b00001010, 0b00011011, 0b00000000};
void main (void) {
TRISC = 0; // Tot el port C és de sortida
TRISB = 0; // Tot el port B és de sortida
IniPant(); // Inicialització de la pantalla
_delay(100000); // Retard (0,1 s)
ConfPant(); // Configuració de la pantalla
_delay(100000); // Retard (0,1 s)
DefCarac(0, Omega); // Defineix caràcter
_delay(100000); // Retard (0,1 s)
Cursor(1, 1); // Posició
EnviaL('P'); // Lletra
EnviaL('I'); // Lletra
EnviaL('C'); // Lletra
Cursor(2, 1); // Posició
EnviaL('k'); // Lletra
EnviaL('i'); // Lletra
EnviaL('t'); // Lletra
Cursor(1, 16); // Posició
EnviaL(0); // Omega
Cursor(2, 15); // Posició
EnviaL(8); // Omega
while (1) // Mentre el contingut del parèntesi sigui 1
; // repetirà aquesta línia (es bloqueja aquí)
}
void IniPant(void) {
_delay(250000); // Retard (250 ms)
EnviaI(0b00100000); // Function set - Configuració inicial 0010 al nibble de l'esquerra
EnviaC(0b00101000); // Configuració 2 línea, 5x8 píxels
}
void ConfPant(void) {
EnviaC(0b00001111); // Display ON/OFF control - Activa la pantalla amb cursor intermitent
EnviaC(0b00000001); // Clear display - Buida la pantalla i inicialitza
_delay(3900); // Retard (3,9 ms)
EnviaC(0b00000110); // Entry mode - Buida la pantalla, sentit dreta i despl. automàtic
}
void EnviaC(char Caracter) {
_delay(800); // Retard (0,8 ms)
PORTB = 0b00000000; // Desactiva E i RS
_delay(3); // Retard (3 us)
PORTC = Caracter & 0xF0; // Agafa els 4 bits més alts
PORTB = 0b10000000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00000000; // Desactiva E
Caracter = Caracter << 4;
PORTC = Caracter; // Agafa els 4 bits més baixos
PORTB = 0b10000000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00000000; // Desactiva E
}
void EnviaL(char Caracter) {
_delay(800); // Retard (0,8 ms)
PORTB = 0b00100000; // Desactiva E i activa RS
_delay(3); // Retard (3 us)
PORTC = Caracter & 0xF0; // Agafa els 4 bits més alts
PORTB = 0b10100000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00100000; // Desactiva E
Caracter = Caracter << 4;
PORTC = Caracter; // Agafa els 4 bits més baixos
PORTB = 0b10100000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00100000; // Desactiva E
}
void EnviaI(char Caracter) {
_delay(800); // Retard (0,8 ms)
PORTB = 0b00000000; // Desactiva E i RS
_delay(3); // Retard (3 us)
PORTC = Caracter & 0xF0; // Agafa els 4 bits més alts
PORTB = 0b10000000; // Activa E
_delay(5); // Retard (5 us)
PORTB = 0b00000000; // Desactiva E
}
void Cursor(char Filera, char Columna) {
char Posicio = 0; // Variable per a calcular la posició
if (Filera == 2) {
Posicio = 64; // La primera columna de la segona fila és 64;
}
if (Columna > 0 && Columna < 33) { // Comprovem que sigui un valor raonable
Posicio = Posicio + Columna; // Sumem les adreces
Posicio = Posicio - 1; // Restem 1 perquè numera des de 0
}
Posicio = Posicio + 128; // Posa el bit de posicionat a 1
EnviaC(Posicio); // Canvia el cursor de lloc
}
void DefCarac(char Numero, char Fileres[8]) {
char Posicio = 0; // Variable per a calcular la posició
if (Numero < 8) { // Comprovem que sigui un valor raonable
Posicio = Posicio * 8; // Calculem l'adreça de memòria
}
Posicio = Posicio + 64; // Posa el bit de caràcter especial a 1
EnviaC(Posicio); // Canvia el cursor de lloc
for (signed char k = 0; k < 8; k++){
EnviaL(Fileres[k]); // Canvia el cursor de lloc
}
}

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.