Bueno solucione el tema del parpadeo pero ahora si que no entiendo nada.
El programa en el proteus funciona a la perfeccion pero cuando lo pruebo no funciona bien.
Les cuento que es lo que pasa.
La distribucion la hice de esta forma
Entradas para verificar
A0 A1 A2 A3
1 2 3 4 B0
5 6 7 8 B1
9 A B C B2
D E F B3
Las teclas D,E y F funcionan bien, lo probe con leds en las salidas.
La tecla 1, 5 y 9 manda como si hibiera presionado el 1
La teclas 2, 6 y A manda como si hubiera presionado el 2
La 3, 7 y B Nada
La 4, 8 y C como si hubiera presionado la tecla 3
No me doy cuenta que puede ser porque en el proteus funciona y desde la escaso de mis conocimientos el circuito esta bien hecho.
Se les ocurre que puede ser?
Muchas gracias.
#include <16F628A.h>
#FUSES NOWDT // Watch Dog Timer
#FUSES NOPUT // Power Up Timer
#FUSES NOPROTECT // Code not protected from reading
#FUSES NOBROWNOUT // Reset when brownout detected
#FUSES NOMCLR // Master Clear pin enabled
#FUSES NOLVP // No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO // Internal RC Osc, no CLKOUT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)
char c;
void delay()
{
delay_ms(0);
}
char kbd_getc() // función que explora todo el teclado
{
port_b=0b00000001; // verifica columna 1
if(bit_test(port_a,0)==1)
{delay();
return ('1');} // si se presiono el uno devuelve 1
if(bit_test(port_a,1)==1)
{delay();
return ('2');} // si se presiono el cuatro devuelve 4
if(bit_test(port_a,2)==1)
{delay();
return ('3');} // si se presiono el siete devuelve 7
if(bit_test(port_a,3)==1)
{delay();
return ('4'); } // si se presiono el * devuelve 10 = A
port_b=0b00000010; // verifica columna 2
if(bit_test(port_a,0)==1)
{delay();
return ('5');} // si se presiono el dos devuelve 2
if(bit_test(port_a,1)==1)
{delay();
return ('6');} // si se presiono el cinco devuelve 5
if(bit_test(port_a,2)==1)
{delay();
return ('7');} // si se presiono el ocho devuelve 8
if(bit_test(port_a,3)==1)
{delay();
return ('8');} // si se presiono el cero devuelve 0
port_b=0b00000100; // verifica columna 3
if(bit_test(port_a,0)==1)
{delay();
return ('9');} // si se presiono el tres devuelve 3
if(bit_test(port_a,1)==1)
{delay();
return ('A');} // si se presiono el seis devuelve 6
if(bit_test(port_a,2)==1)
{delay();
return ('B'); } // si se presiono el nueve devuelve 9
if(bit_test(port_a,3)==1)
{delay();
return 'C'; } // si se presiono el # devuelve 11 = B
// si se tiene una matriz 4x3 no se usará el pin RB3
port_b=0b00001000; // verifica columna 4
if(bit_test(port_a,0)==1)
{delay();
return ('D');} // si se presiono la C devuelve 12 = C
if(bit_test(port_a,1)==1)
{delay();
return ('E');} // si se presiono la D devuelve 13 = D
if(bit_test(port_a,2)==1)
{delay();
return ('F');} // si se presiono la E devuelve 14 = E
if(bit_test(port_a,3)==1)
{delay();
return ('*');} // si se presiono el F devuelve 15 = F
if((bit_test(port_a,0)==0)&&(bit_test(port_a,1)==0)&&(bit_test(port_a,2)==0)&&(bit_test(port_a,3)==0))
return (0); // devuelve 16 en caso de no haber presionado ningun pulsador
// podria colocarse otra alternativa en caso de que no se presione ningun pulsador
}
void main() // programa principal
{
set_tris_b(0x00); // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
port_b=0; // inicializa puerto B
set_tris_a(0b0001111); // define puerto A como todas entradas excepto RA0
port_a=0; // inicializa puerto A
port_b_pullups(TRUE); // activa pull up del puerto b, no hará falta conectar resistencias
while(true) // bucle de trabajo
{
while(1)
{
do
{
c=kbd_getc();
}while(c==0);
if(c=='1') {
port_b = 0b00010000;
delay_ms(50);
} else if(c=='2') {
port_b = 0b00100000;
delay_ms(50);
} else if(c=='3') {
port_b = 0b00110000;
delay_ms(50);
} else if(c=='4') {
port_b = 0b01000000;
delay_ms(50);
} else if(c=='5') {
port_b = 0b01010000;
delay_ms(50);
} else if(c=='6') {
port_b = 0b01100000;
delay_ms(50);
} else if(c=='7') {
port_b = 0b01110000;
delay_ms(50);
} else if(c=='8') {
port_b = 0b10000000;
delay_ms(50);
} else if(c=='9') {
port_b = 0b10010000;
delay_ms(50);
} else if(c=='A') {
port_b = 0b10100000;
delay_ms(50);
} else if(c=='B') {
port_b = 0b10110000;
delay_ms(50);
} else if(c=='C') {
port_b = 0b11000000;
delay_ms(50);
} else if(c=='D') {
port_b = 0b11010000;
delay_ms(50);
} else if(c=='E') {
port_b = 0b11100000;
delay_ms(50);
} else if(c=='F') {
port_b = 0b11110000;
delay_ms(50);
} else {
// port_b = 0b00000000;
// delay_ms(1050);
}
port_b = 0;
//while((bit_test(port_a,0)==1)||(bit_test(port_a,1)==1)||(bit_test(port_a,3)==1)||(bit_test(port_a,4)==1))
//{}
}
}