Autor Tema: El teclado me escribe solo  (Leído 1953 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado horty69

  • PIC10
  • *
  • Mensajes: 17
El teclado me escribe solo
« en: 27 de Mayo de 2014, 02:40:00 »
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.

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 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);
}

Desconectado a9965

  • PIC10
  • *
  • Mensajes: 22
Re: El teclado me escribe solo
« Respuesta #1 en: 29 de Mayo de 2014, 07:03:06 »
Hola.
¿Podrías enseñar el esquema? De esta manera podría ver si has puesto las resistencias pull-up.

Un saludo.

Desconectado horty69

  • PIC10
  • *
  • Mensajes: 17
Re: El teclado me escribe solo
« Respuesta #2 en: 29 de Mayo de 2014, 14:43:03 »
El problema no es ese porque e probado el programa fisicamente y con proteus y hace lo mismo.
Así que el problema se encuentra en el cógido y sigo sin saber cual es.
De todas forma te subo el circuito en proteus

Desconectado a9965

  • PIC10
  • *
  • Mensajes: 22
Re: El teclado me escribe solo
« Respuesta #3 en: 29 de Mayo de 2014, 15:20:58 »
El problema no es ese porque e probado el programa fisicamente y con proteus y hace lo mismo.
Así que el problema se encuentra en el cógido y sigo sin saber cual es.
De todas forma te subo el circuito en proteus

Revisa si las conexiones del keyad corresponden con el código.


Para que funcione el keypad sin resistencias pull-up, debes habilitar éstas del puerto donde esté conectado.
Si no las tienes habilitadas debes poner las resistencias como en la imagen.


Un saludo.

Un saludo.
« Última modificación: 29 de Mayo de 2014, 15:25:39 por a9965 »

Desconectado a9965

  • PIC10
  • *
  • Mensajes: 22
Re: El teclado me escribe solo
« Respuesta #4 en: 29 de Mayo de 2014, 15:28:41 »
El problema no es ese porque e probado el programa fisicamente y con proteus y hace lo mismo.

El problema puede ser ese porque si no está activado el registro de las resistencias, o en su defecto poner las resistencias en el circuito, el estado del keypad es siempre 1(teclas pulsadas).
« Última modificación: 29 de Mayo de 2014, 15:31:49 por a9965 »

Desconectado horty69

  • PIC10
  • *
  • Mensajes: 17
Re: El teclado me escribe solo
« Respuesta #5 en: 29 de Mayo de 2014, 19:43:32 »
Tienes razon las tenia deshabilitadas y por eso escribia siempre.
He añadido esto para activarlas
Código: [Seleccionar]
OPTION_REGbits.nRBPU=0;Ademas en el bucle while e añadido lo siguiente:
Código: [Seleccionar]
    while(PORTBbits.RB4 ==0 || PORTBbits.RB5 ==0|| PORTBbits.RB6 ==0|| PORTBbits.RB7 ==0 )
Ahora me surje otro problema y es que en algunas teclas me escribe un = y en otros esto ¬, a parte de que no las escribe ordenadas, vamos que solo alguna tecla la escribe en su sitio.
Eso ya me tiene mas desconcertado
Muchas gracias por sugerirme eso, ya que me estaba volviendo loco