TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
#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);
}