Programació en C del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple P4 - Pantalla LCD amb connexió paral·lel de quatre bits

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, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
						// 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, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
						// 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 (int k = 0; k < 8; k++){
		EnviaL(Fileres[k]);		// Canvia el cursor de lloc
	}
}

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.