ayuda proyecto con micropic trainer y trainer plus pic16f84a

Hola! pensé hacer la siguiente practica con el trainer y trainer plus,

Llegue a este foro por el proyecto de la llave electronica de wilfretronic,pense que me serviria, pero mi pic es mas basico, o eso creo, no se nada de esto solo he trabajado hasta ahora con el micro 8051, y cuando supe todo lo que se hace con los pics pensé que merecia la pena aprender.

Basicamente es para tocar las siguientes partes: Teclado 4x4, LCD, 4 displays de 7 segmentos.
La idea es que al iniciarse el programa, los displays estén a 20.00 [segundos.centesimas]
en el LCD se muestra un texto en el que se pide una contraseña de 4 digitos, se introducen 4 digitos y se confirma con 'b'
[1][2][3][f]
[4][5][6][e]
[7][8][9][d]
[a][0][c]

cuando se confirma la seleccion entra en marcha la cuenta atrás de 20s, de hecho estoy pensando no hacer segundos y centesimas, sino solo segundos para ir simplificando cosas.
Durante la cuenta atrás hay que ir introduciendo los digitos, hasta acertar la clave (siempre confirmando la seleccion con 'b'). En la pantalla lcd se muestra durante todo el proceso:
| Clave introducida: |
| **** | <----------los digitos que se van introduciendo

cuando la cuenta atras llega a 0 se para todo.

me parecio super simple, tengo varias funciones por separado que se pueden usar... pero juntar todo ese codigo me parece imposible.

Alguien me podria echar una mano porfavor? Gracias por leer el post, vaya ladrillo :)
 
pues primero postea el codigo para ver que tienes para poderte ayudar, porque así es imposible, ademas haber cuantas rutinas tienes hechas, y cuanto codigo tienes escrito...
 
lo estoy acabando, cuando lo tenga lo pongo a ver que opinais. Al final nada del conteo regresivo, un contador de errores en el display 7 seg. y fuera...
 
#include "ledon.h"
#include "display.h"
#include "endblock.h"
#include "muestraLCD.h"
// Lcd8 module connections
sbit LCD_RS at RA0_bit;
sbit LCD_RW at RA1_bit;
sbit LCD_EN at RA2_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D3 at RB3_bit;
sbit LCD_D2 at RB2_bit;
sbit LCD_D1 at RB1_bit;
sbit LCD_D0 at RB0_bit;

sbit LCD_RS_Direction at TRISA0_bit;
sbit LCD_RW_Direction at TRISA1_bit;
sbit LCD_EN_Direction at TRISA2_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D3_Direction at TRISB3_bit;
sbit LCD_D2_Direction at TRISB2_bit;
sbit LCD_D1_Direction at TRISB1_bit;
sbit LCD_D0_Direction at TRISB0_bit;
// End Lcd8 module connections

// Keypad module connections
char keypadPort at PORTB; //donde va conectado el teclado
// End Keypad module connections

//Prototipos de las funciones a usar:
void LedOn (void);
void display(unsigned short);
void endblock(void);
void muestraLCD (unsigned short, int);
//***********************************

//Inicializar teclado y LCD
Keypad_Init(); // inicializo teclado
Lcd_Init(portb); // inicializo Lcd ****&portb en duda
Lcd_Cmd(_LCD_CLEAR); // borrado inicial display
Lcd_Cmd(_LCD_CURSOR_OFF); // sin cursor

void main () {
unsigned short cnt=5;
int kp;
int kp1;
int k;
int i=0;
unsigned short dat2comp[];
unsigned short keypad[];

Lcd_Out(1, 1, "Pass Input"); // texto en Lcd
//*************************

//Mostrar el numero de intentos inicial en el display 7 segmentos

display ( cnt ); //cnt es el contador de errores en la introduccion del pass
//***************************************************************

for(i=0;i<4;i++){ //guardo 4 digitos obtenidos del teclado
unsigned short valor;
keypad = Keypad_Key_Click();
valor = keypad;
muestraLCD (valor, i); // escribir en lcd que tecla se ha pulsado
}
recogeycompara:
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 1, "Pass Input");
i=0; //reinicio i, es la variable que pasamos a muestraLCD
do {
for(i=0;i<4;i++) {
dat2comp = Keypad_Key_Click(); //meto en un string 4 datos recogido del teclado, no importa si se borran
kp1=dat2comp; //sacar el numero que acabo de meter en el string para mandarlo a la funcion muestraLCD
muestraLCD (kp1,i);
}
for(k=0;k<4;k++) {
unsigned short take;
if(keypad[k] == dat2comp[k]) { // los comparo 1 a 1
k=k; //si son iguales no hago nada
}
else {
k=40; //si son !=, uso k como flag y no entra en el for la siguiente vez
}
}
switch (k) {
case 4:
cnt = cnt--;
display ( cnt ); //hay 5 intentos, por eso el contador suma 1 pase lo que pase
LedOn(); //va a ledon y no vuelve
case 40:
cnt = cnt--;
display ( cnt ); //hay 5 intentos, por eso el contador suma 1 pase lo que pase
goto recogeycompara;
}
}
while (cnt>=0);
endblock();
}

void LedOn() {
trisb=0; //configurar b como salida
while(1){ //4ever
portb=0xff; //poner a 'h' el puerto b para encender leds
delay_ms(300); //300ms en ON
portb=0; //apagar leds
delay_ms(300); //se mantiene apagado 300ms
}
}

const unsigned short DIGITOS[] = //probar con 'switch case', pero deberia entrar
{ // y tomar con 'cnt' [0,1,2,3,4,5,6,7,8,9]
0x3F, //Código del dígito 0 // =
0x06, //Código del dígito 1 // [0x3F,...,0x6F]
0x5B, //Código del dígito 2 //el valor correspondiente
0x4F, //Código del dígito 3
0x66, //Código del dígito 4
0x6D, //Código del dígito 5
0x7D, //Código del dígito 6
0x07, //Código del dígito 7
0x7F, //Código del dígito 8
0x6F, //Código del dígito 9
};
void display (unsigned short cnt){
TRISB = 0; // Configura el puerto B como salida
PORTB = DIGITOS[cnt]; //Se visualiza el digito correspondiente al
delay_ms(1000);
}


void endblock() {
while(1);
}



void muestraLCD (unsigned short valor, int i) {
switch (valor) { // escribir en lcd que tecla se ha pulsado
case 48:
Lcd_Out(2,i,"0"); break;
case 49:
Lcd_Out(2,i,"1"); break;
case 50:
Lcd_Out(2,i,"2"); break;
case 51:
Lcd_Out(2,i,"3"); break;
case 52:
Lcd_Out(2,i,"4"); break;
case 53:
Lcd_Out(2,i,"5"); break;
case 54:
Lcd_Out(2,i,"6"); break;
case 55:
Lcd_Out(2,i,"7"); break;
case 56:
Lcd_Out(2,i,"8"); break;
case 57:
Lcd_Out(2,i,"9"); break;
}
}
 

Adjuntos

  • Definitivo.rar
    2.3 KB · Visitas: 3
Última edición:
No veo los #includes...

Y te doy una sugerencia, puedes usar solo 3 pines del PIC para controlar el LCD...

Creo que en la página de todopic está e código y las conexiones, si te interesa, lo busco...

Saludos...
 
Gracias por lo de los #includes, se me habian pasado y así normal que no encontrase las funciones :)

Gracias tambien por la idea de usar la lcd con 3 pines, pero... creo que va a ser más lio para mi, ya he conseguido hacer funcionar así el lcd... es la 1ª vez que uso pics y me ha llevado más tiempo documentarme que realmente meterme con el proyecto.

Voy a ver si le paso el debugger, de momento no funciona bien, pero contaba con ello

adjunto en el .rar los nuevos .c y .h
 

Adjuntos

  • Prueba_Definitivo.rar
    3 KB · Visitas: 3
Lo estoy viendo por arriba, y veo unas cositas que faltan, y que están mal.

Por ejemplo, en cada case, al final tiene que haber un break;
Código:
[COLOR="Blue"][B]switch[/B][/COLOR] [B]([/B]k[B])[/B]{
[COLOR="blue"][B]case[/B][/COLOR] 4:
loquesea=[COLOR="blue"][B]true[/B][/COLOR];
[COLOR="blue"][B]break[/B][/COLOR];
...
}
Otra cosa, es que cuando se active LedOn();, quedas ahí trabado, y no sale, ya que lo pusiste un while(1), y no tiene ninguna condición para salir del while...

Saludos

PD: Aún lo estoy mirando...
 
Muchisimas gracias por mirar el codigo, cualquier critica es bien recibida :D
en el coment anterior puse el codigo actualizado, habia varias erratas como lo de los break

mi intencion es que en LedOn y en endblock se acabe el programa, es bloqueante y algo cutre, pero cuando funcione siempre hay tiempo de hacer retoques jeje.

Ahora mismo me estoy temiendo que haya configurado mal el lcd o que las bibliotecas del mikroc esten mal (esto ultimo parece improbable) uso la funcion Lcd_Cmd(_LCD_CLEAR); y por portb lo que me pone es 0x10, y en la documentacion del lcd pone que el clear se hace con 0x01...

Gracias por tu tiempo compañero.
 
Atrás
Arriba