Estoy a punto de tirar la toalla con HiTech, para una interrupción por cambio en el puerto B, se supone que se debe poner el bit RBIE a 1, y en la atención de la interrupción borrar el flag y leer el puerto B ¿No?
Bien, se trata de leer un teclado con esta interrupción, y compartir el puerto con el display. Poniendo el display en otro puerto funciona, aunque cada vez que pulso una tecla la interrupción se produce dos veces. Pero compartiendo el puerto salta continuamente sin pulsar ninguna tecla.
Pongo el codigo por si me podeis echar una mano:
// Ejemplo de configuracion y utilizacion
#include <htc.h>
#include <stdlib.h>
#include "pic168xa.h"
__CONFIG(WDTDIS & HS & UNPROTECT);
#define _XTAL_FREQ 8000000 // Cristal 8MHz
#define LcdControlPort PORTB // Uso el puerto A para los bits de control
#define LcdRWBit 1 // El bit 0 del puerto A para RW
#define LcdRSBit 0 // El bit 0 del puerto A para RS
#define LcdENBit 2 // El bit 0 del puerto A para EN
#define LcdDataPort PORTB // Uso el puerto B para los datos
#define LcdD4 4 // Solo utilizar para protocolo de 4 Bits
#include "SuperLcd.C" // Incluimos nuestra libreria
#define TRUE 1
#define FALSE 0
/**************************************************************************************/
/* VARIABLES */
unsigned char Tecla;
unsigned char PuertoB;
/**************************************************************************************/
char const CharactersCGRAM[64]={0,0,0,0,0,0,0,0x1F,
0,0,0,0,0,0,0x1F,0x1F,
0,0,0,0,0,0x1F,0x1F,0x1F,
0,0,0,0,0x1F,0x1F,0x1F,0x1F,
0,0,0,0x1F,0x1F,0x1F,0x1F,0x1F,
0,0,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
0,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
/**************************************************************************************/
// Guarda en la CGRAM el caracter en el banco seleccionado.-
// <Caracter> es la dirección de la primer fila del caracter a enviar.-
void vLcdWriteCgram(unsigned char Bank,char Character){
unsigned char AddressBank,i;
AddressBank=0x40 + 0x08*Bank;
WriteByteLcd(AddressBank,0);
// Cargamos los 8 registros.-
for(i=0;i<8;i++){
WriteByteLcd(CharactersCGRAM[Character + i],1);
}
WriteByteLcd(0x80,0); // Se da por terminada la escritura.-
}
/**************************************************************************************/
// Incializa Memoria CGRAM.-
void vLcdInitCgram(void){
unsigned char j;
for(j=0;j<8;j++){
vLcdWriteCgram(j,j*8);
}
}
/**************************************************************************************/
unsigned char LeerTeclado(void){
}
/**************************************************************************************/
void EnableInterrupcionesGlobal(unsigned char a){
//a = true-->habilitadas. a = false-->desabilitadas.
GIE = a;
}
/**************************************************************************************/
void interrupt intsrv(void){
if(RBIF && RBIE){
Tecla --;//LeerTeclado();
RBIF = 0;//Borramos el flag de interrupcion.
PuertoB = PORTB;
}
}
/**************************************************************************************/
void ConfiguracionINTCON(void){
GIE = 0;
PEIE = 0;
T0IE = 0;
INTE = 0;
RBIE = 1;
T0IF = 0;
INTF = 0;
RBIF = 0;
}
/**************************************************************************************/
void main(void)
{
const char * pantalla = "Mundo";
char texto[10];
ConfiguracionINTCON();
EnableInterrupcionesGlobal(FALSE);
InitLcd();
GotoxyLcd (1,1);
WriteStrLcd ("Hola"); // escribe en la primer linea la palabra Hola
GotoxyLcd (1,2);
WriteStrLcd (pantalla); // escribe en la segunda linea la palabra apuntada por la variable pantalla
vLcdInitCgram();
GotoxyLcd (1,4);
WriteCharLcd(0);
WriteCharLcd(1);
WriteCharLcd(2);
WriteCharLcd(3);
WriteCharLcd(4);
WriteCharLcd(5);
WriteCharLcd(6);
WriteCharLcd(7);
do{
EnableInterrupcionesGlobal(FALSE);
TRISB = 0;
GotoxyLcd (1,3);
itoa(texto,Tecla,10);
WriteStrLcd(texto);
TRISB = 0b11111000;
PORTB = 0b11111000;
PuertoB = PORTB;
EnableInterrupcionesGlobal(TRUE);
__delay_ms(333);
}while(TRUE);
}