TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: horty69 en 27 de Mayo de 2014, 02:40:00

Título: El teclado me escribe solo
Publicado por: horty69 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);
}
Título: Re: El teclado me escribe solo
Publicado por: a9965 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.
(http://iamzxlee.files.wordpress.com/2013/07/keypad-3.jpg)
Un saludo.
Título: Re: El teclado me escribe solo
Publicado por: horty69 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
Título: Re: El teclado me escribe solo
Publicado por: a9965 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.
(http://lars.mec.ua.pt/public/LAR%20Projects/Humanoid/2004_DavidGameiro_FilipeCarvalho/pesquisa/Exemplifica%C3%A7%C3%B5es/05-03-2004/PIC%20Tutorial%C2%A0%20Nine%20-%20HEX%20Keypad_files/keypadb.gif)

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.
(http://1.bp.blogspot.com/-EHxcEvsAM_Q/ULd6bn_n45I/AAAAAAAAAXA/hcinXiZo_q0/s640/keypad.jpg)

Un saludo.

Un saludo.
Título: Re: El teclado me escribe solo
Publicado por: a9965 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).
Título: Re: El teclado me escribe solo
Publicado por: horty69 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