TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
#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);
}
-
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.
-
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
-
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.
-
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).
-
Tienes razon las tenia deshabilitadas y por eso escribia siempre.
He añadido esto para activarlas
OPTION_REGbits.nRBPU=0;Ademas en el bucle while e añadido lo siguiente:
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