Hola,
Tengo un proyecto con un pic16f886 con un teclado y un lcd, conectado por el puerto B, y cuando lo simulo me escribe sin pulsar el teclado valores en el lcd.
os dejo el código haber si alguien me puede ayudar, ya que no encuentro el fallo.
#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 tecla;
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){
__delay_ms(20);
break;}
i++;
if(PORTBbits.RB5==0){
__delay_ms(20);
break;}
i++;
if(PORTBbits.RB6==0){
__delay_ms(20);
break;}
i++;
if(PORTBbits.RB7==0){
__delay_ms(20);
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 = 0X00;
//Inicializar
lcd_init();
lcd_send_cmd(LCD_LN1);
while(PORTBbits.RB4 ==0 && PORTBbits.RB0 ==0 )
{
//1ª Línea
writeString("X=");
if(1 ){
tecla=teclado();
lcd_send_dat(tecla);
__delay_ms(20);
}
}
return (EXIT_SUCCESS);
}