TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: horty69 en 24 de Mayo de 2014, 13:19:55

Título: Problema interrupciones teclado
Publicado por: horty69 en 24 de Mayo de 2014, 13:19:55
Hola,
Mi programa basicamente consiste en que cuando pulse una tecla, esta tecla aparezca en el LCD.
Como no quiero que este todo el rato testeando si a cambiado algun bit del puerto B, quiero hacerlo con interrupciones pero no me funciona.
Pongo aqui el código haber si podeis hechar una mano
Muchas gracias

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "lcd.h"
#include <pic16f886.h>


/* Dos definiciones para determinar un retardo */

#define _XTAL_FREQ 4000000 // necesario para macros __delay_ms()

#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
typedef unsigned char uint8_t;

unsigned char c;
char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'E','0','F','D'}};

void lcd_init()
{
    DispE = 0;
        DispRS = 0;
        __delay_ms(30);

        lcd_send_cmd(0x03);
        lcd_send_cmd(0x03);
        lcd_send_cmd(0x03);

        lcd_send_cmd(0x02);
        lcd_send_cmd(LCD_FN_SET);
        lcd_send_cmd(LCD_DISPOFF);
        lcd_send_cmd(LCD_CLR);
        lcd_send_cmd(LCD_DISPON);
}

void pulseEnable()
{
    DispE = 0;
    __delay_us(1);
    DispE = 1;
    __delay_us(1);
    DispE = 0;
    __delay_us(100);
}

void lcd_send_dat(unsigned char c)
{
        DispE = 0;
        DispRS = 1; //1 para mandar dato
        LCD_DAT_PORT = c >> 4; //ALTO

    pulseEnable();
        __delay_us(200); //5ms para comando, 200us para dato
            LCD_DAT_PORT = c;//( c & 0x0F ); //BAJO
    pulseEnable();
        __delay_us(200);
}

void lcd_send_cmd(unsigned char c)
{
        DispE = 0;
        DispRS = 0; //0 para mandar comando
        LCD_DAT_PORT = c >> 4; //ALTO
    pulseEnable();
        __delay_ms(5); //5ms para comando, 200us para dato
            LCD_DAT_PORT = c;//( c & 0x0F ); //BAJO
    pulseEnable();
        __delay_ms(5);
}

void writeString(const char *msg)
{
    while(*msg!='\0')
        lcd_send_dat(*msg++);
}

char teclado(void){
        unsigned char i,j;

i=0;
for(j=0;j<4;j++){
if(PORTBbits.RB4==0){break;}
i++;
if(PORTBbits.RB5==0){break;}
i++;
if(PORTBbits.RB6==0){break;}
i++;
if(PORTBbits.RB7==0){break;}
i++;
PORTB<<=1; //Trasladamos el 0 a siguiente Pin.
}
return(KEYS[i][j]);
            }

int main(int argc, char** argv) {
  
    ANSEL = 0X00 ;      //Deshabilitar ADC: Puertos digitales
    ANSELH = 0X00 ;     //Deshabilitar ADC: Puertos digitales
    TRISA = 0xf1;
    PORTA = 0x00;
    TRISB = 0xF0;
    PORTB = 0x00;

   INTCON = 0X88;

//Inicializar
        lcd_init();

    while(1)
    {
        
            lcd_send_cmd(LCD_LN1);      //1ª Línea
            lcd_send_cmd(LCD_HOME);     // Cursor a la posición 0
            lcd_send_cmd(LCD_CLR);      //Borra display
            

                if(INTCONbits.RBIF==1){
                c=teclado();
lcd_send_dat(c); // Visualizamos tecla pulsada.
while(PORTBbits.RB4==0 || PORTBbits.RB5==0 || PORTBbits.RB6==0 || PORTBbits.RB7==0){} //Esperamos a que se suelte.-
PORTB=0x00;
INTCONbits.RBIF = 0; //Borramos bandera
}


      
    }
    return (EXIT_SUCCESS);
}