Manejar teclado matricial y mostrar en lcd

Hola, estoy manejando un teclado matricial 4x4 en ASM, pero puedo solamente ingresar las teclas de a una , o sea si pulso 1 me guarda el valor de esa tecla , en cambio si pulso 15 me guarda dos valores un 1 en una variable que tengo definida (decena) y un 5 en otra variable tambien predefinida (unidad).
No encuentro la forma de que me guarde el valor 15 en otra variable (valor)
Alguien ya ha resuelto un caso similar?
Me podria dar una mano para resolverlo?
O que me indique como puedo trabajarlo para lograr el 15 el la variable (valor)
Gracias
 
Gracias Scooter, pero esperaba algo mas generico y de aplicacion mas a gran escala. Lo que decis lo he resuelto mas o menos asi
movf decena,w
addwf valor,1
addwf valor,1
........................ 10 veces
movf unidad,w
addwf valor,1

Ahora imaginate que tenga que escribir 18370 , no llegaria nunca, por eso me parecio yn poco floja mi imaginacion y coloque la consulta.

Mil gracias
 
Es que estoy acostumbrado al "arcaico" 8052, allí sería:

mov a,decena
mov b,#10
mul ab
add a,unidad
mov valor,a

Si no hay instrucción para multiplicar la cosa se complica pero no tanto. Rotar a la izquierda es multiplicar por dos así que lo que yo haría sería (pseudocódigo)

carga en W decena
rota izquierda (x2)
rota izquierda (x4)
rota izquierda (x8)
suma decena (x9)
suma decena (x10)
suma unidad
guarda W en valor



De cualquier modo puedes buscar rutinas optimizadas para multiplicar y dividir por múltiplos de 10.
Pese a que el 8052 multiplica y divide lo hace con 8 bits, para 16bits me hice unas optimizadas solo para 10 y algo se adelantaba respecto a la rutina para multiplicar por lo que sea.
 
Última edición:
Nada mejor que esperar a que aclare, ya estoy trabajando en una rutina en ASM para el 16F873 y me parece que va a funcionar. Ahora debo atender el trabajo cuando vuelva la cuelgo.

Muchas gracias Scooter
 
Código:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#define LCD_DATA_PORT getenv("SFR:PORTC")
#use delay(clock= 4000000) 
#define use_portb_kbd TRUE
#include <lcd.c>
#include <kbd.c>


void main() {
char k; 
int x;

lcd_init(); 
kbd_init();
port_b_pullups(TRUE); 

lcd_putc("\fListo...\n");

while (TRUE) {
k=kbd_getc(); 
x=k-48; //Conversión numérica
if(k!=0){
if(k=='*') 
lcd_putc('\f'); 
else
lcd_putc(k); //Imprime carácter
delay_ms(500);
printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
delay_ms(500);
printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
delay_ms(500);
printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
delay_ms(500);
lcd_putc("\fListo...\n");
}
}
}
 
Última edición por un moderador:
Muchas gracias por responder aparco inga, me ayuda mucho tu respuesta. Lo que si veo que ese código es para que a la salida del pic maneje un lcd, y yo lo necesito realizar con un display de siete segmentos. Y eso es lo que no se cómo hacer. Muchas gracias por su respuesta. Saludos
 
Hola amigos, espero y puedan ayudarme.
hice una biblioteca en ASM para un teclado matricial 4x4. lo que pretendo es que cuando pulse una tecla reciba el valor de la tecla en el registro W y moverlo al puerto A para observar su valor por medio de led's.
La simulo en Mplab a través de opción STIMULUS y funciona correctamente, pero cuando conecto mi teclado matricial a proteus no funciona bien, no se muestra el valor de la tecla pulsada a través del puerto A.
No se que hacer, me tiene enfadado, pues no creo que sea efecto de algún rebote o que mi circuito este mal implementado en proteus. esta bien configurado el pic en proteus (es correcto el valor del oscilador y es correcto el pic) e igual en Mplab.
En la red busqué un programa ASM tambien para un teclado matricial, lo modifiqué e igual, tengo los mismos problemas.
les dejo mi programa ASM y mi circuito en proteus, agradeceré mucho que si alguien me puede ayudar.

Código:
List            P=16f84A
Include        <P16F84.INC>

CBLOCK        0x0C
TECLA
ENDC

            ORG            0
INICIO
            bsf            STATUS,RP0
            movlw        0xF0
            movwf        PORTB
            clrf                PORTA
            bcf            OPTION_REG,NOT_RBPU
            bcf            STATUS,RP0
PRINCIPAL
            call                TECLADO
            movwf        PORTA
            goto                 PRINCIPAL

;subrutina teclado
;detecta si es pulsada una tecla y regresa el valor de la tecla pulsada
;*************************************************************************************************            
            
TECLADO
            clrf        TECLA                ;Tecla se pone en ceros
            movlw    b'00001110'                    ;se pone cero en la Fila1
            movwf    PORTB
COL0
            btfss        PORTB,4                ;Hay un 0 en la columna 0?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
COL1
            btfss        PORTB,5                ;Hay un 0 en la columna 1?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
COL2
            btfss        PORTB,6                ;Hay un 0 en la columna 2?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
COL3
            btfss        PORTB,7                ;Hay un 0 en la columna 3?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
ULTIMA_TECLA
            rlf        PORTB,F                ;pone un cero a la izquierda para checar la siguiente Fila
            movlw        .16
            subwf        TECLA,W
            btfsc        STATUS,Z                ;compara si es la ultima tecla
            goto        TECLADO                ;no es, regresa a teclado
            bsf        STATUS,C                ;si lo es, pone a 1 el bit C
            goto        COL0                    ;regresa a seguir probado teclas
            
REBOTE
            call        Retardo_20ms            ;espera a que se estabilize el rebote
    B0        btfss        PORTB,4
            goto        B0
    B1        btfss        PORTB,5
            goto        B1
    B2        btfss        PORTB,6
            goto        B2
    B3        btfss        PORTB,7
            goto        B3
            movlw    TECLA
            return
            
include        <RETARDOS.INC>
            END
 

Adjuntos

  • teclado.PNG
    teclado.PNG
    29.7 KB · Visitas: 48
Última edición por un moderador:
Quiero compartir el diseño que termine ya hace algunas noches con un teclado paralelo.
Esto es por si le puede llegar a servir a alguien.

El diseño adjunto.

El funcionamiento, descrito al principio.
Se inserta un digito y se muestra en el display, al siguiente digito, se recorre en el display.
El Flip-Flop cuenta con un push para el reset.
Los pulsos se mandan con 7408 al CLK del flip-flop.

:D

Saludo

Mi inquietud es como generas el cero

gracias
 
Hola juliocesar71

El circuito que mostró Darzeck en su mensaje #8 no tiene la tecla para el 0.
Tendrías que agregar una circuiteria como se muestra en el circuito adjunto en la imagen.

Hay otro circuito con el cual puedes experimentar. Te lo adjunto

saludos
a sus ordenes
 

Adjuntos

  • Agregar El 0.jpg
    Agregar El 0.jpg
    188.7 KB · Visitas: 38
  • Presiona El 0.jpg
    Presiona El 0.jpg
    376.5 KB · Visitas: 51
Hola juliocesar71

El circuito que mostró Darzeck en su mensaje #8 no tiene la tecla para el 0.
Tendrías que agregar una circuiteria como se muestra en el circuito adjunto en la imagen.

Hay otro circuito con el cual puedes experimentar. Te lo adjunto

saludos
a sus ordenes

MRCARLOS Buenas noches

Muchas gracias por la ayuda con el circuito, funciona bien, adjunto el diseño que implemente claro esta después de observar el suyo.

Un saludo

JULIO CESAR
 

Adjuntos

  • TECLADO.jpg
    TECLADO.jpg
    149.1 KB · Visitas: 39
Hola juliocesar71

El circuito que mostró Darzeck en su mensaje #8 no tiene la tecla para el 0.
Tendrías que agregar una circuiteria como se muestra en el circuito adjunto en la imagen.

Hay otro circuito con el cual puedes experimentar. Te lo adjunto

saludos
a sus ordenes

Buenas noches MrCarlos

Solicito su colaboración en el mismo circuito, la inquietud es como se puede manejar 2 display mas con el mismo teclado, los display adicionales deben funcionar independientemente de los primeros display, es decir es como tener dos de estos circuitos pero funcionando con un solo teclado, imagino el primer circuito que indique un determinado número luego activar el otro circuito pero que funcione con el mismo teclado (un solo teclado manejando los 2 grupos de display independientes).

Adjunto un diagrama de bloques de la idea del circuito, ahora si hay otra manera de realizar el diseño bienvenida sea.

Gracias por su amable atención.

Un saludo

JULIO CESAR
 

Adjuntos

  • Teclado.jpg
    Teclado.jpg
    16.1 KB · Visitas: 24
Hola juliocesar71

Lo que tienes que hacer es enviar:
las 4 salidas de los INVERTER,
la salida de la compuerta OR U6-A
y la terminal del botón Reset,
al otro circuito. O al circuito actual.

Esto lo puedes hacer con compuertas de 3 estados como por ejemplo: 74LS365, 74LS241, 74LS44.
Te adjunto un ejemplo de cómo sería con el 74LS365.

saludos
a sus ordenes
 

Adjuntos

  • Selector.jpg
    Selector.jpg
    281.8 KB · Visitas: 38
Hola juliocesar71

Lo que tienes que hacer es enviar:
las 4 salidas de los INVERTER,
la salida de la compuerta OR U6-A
y la terminal del botón Reset,
al otro circuito. O al circuito actual.

Esto lo puedes hacer con compuertas de 3 estados como por ejemplo: 74LS365, 74LS241, 74LS44.
Te adjunto un ejemplo de cómo sería con el 74LS365.

saludos
a sus ordenes

Buenas noches MrCARLOS

Gracias por su valioso interés

He estado trabajando en las modificaciones del circuito con el 74ls241 a fin de obtener 2 juegos de display independientes, el diseño funciona bien en los dos circuitos al presionar el teclado, pero, al cambiar el selector borra los números del ya marcado y al cambiar nuevamente el selector borra la numeración del segundo, la idea es que los números queden encendidos al cambiar el selector y marque la numeración en el seleccionado.

Agradezco su valioso aporte en el desarrollo de este proyecto

Adjunto imagen del circuito

Un saludo

JULIO CESAR
 

Adjuntos

  • Selector..jpg
    Selector..jpg
    175.5 KB · Visitas: 25
Hola juliocesar71

Creo que no hiciste el circuito como te mencioné:

Lo que tienes que hacer es enviar:
A)- las 4 salidas de los INVERTER,
B)- la salida de la compuerta OR U6-A
C)- y la terminal del botón Reset,
al otro circuito. O al circuito actual.

Te faltó el punto B)- y Parte Del C)-

Si utilizas el 74LS241 requerirás cuando de menos 2 de ellos.
Uno para enviar los datos de número al primer circuito o al otro
Otro para enviar las lineas de control al primer circuito o al otro.
Te sobrarían BIT’s utilizando este 74LS241.

saludos
a sus ordenes
 

Adjuntos

  • Selector &.jpg
    Selector &.jpg
    225.7 KB · Visitas: 24
Hola juliocesar71

Creo que no hiciste el circuito como te mencioné:

Lo que tienes que hacer es enviar:
A)- las 4 salidas de los INVERTER,
B)- la salida de la compuerta OR U6-A
C)- y la terminal del botón Reset,
al otro circuito. O al circuito actual.

Te faltó el punto B)- y Parte Del C)-

Si utilizas el 74LS241 requerirás cuando de menos 2 de ellos.
Uno para enviar los datos de número al primer circuito o al otro
Otro para enviar las lineas de control al primer circuito o al otro.
Te sobrarían BIT’s utilizando este 74LS241.

saludos
a sus ordenes

Buenas tardes MrCARLOS

Gracias por su paciencia

Le comento que no puedo simular el circuito con el 74ls365 ya que al momento de ubicarlo en la plantilla del PROTEUS y simular me indica error (incluso sin realizarle ninguna conexión) , no se que sucede recurro nuevamente para que me indique que debo hacer para solucionar este inconveniente.

Mi versión de proteus es 7.1

GRACIAS

JULIO CESAR

Adjunto figura con error
 

Adjuntos

  • Error.jpg
    Error.jpg
    68.1 KB · Visitas: 16
Hola juliocesar71

Quiere decir que no puedes trabajar con ese IC –74LS365- pues tu ISIS no trae las librerías para poder hacerlo.
Se requeriría conseguir la versión 7.8 de ISIS de Proteus para poder utilizarlo.

Pero sí puedes trabajar con el 74LS241. Cierto??
Pues hazlo como se muestra en la imagen adjunta o en el archivo comprimido que te envío.
Solo tienes que completarlo con los decodificadores y los Display’s.

saludos
a sus ordenes
 

Adjuntos

  • Selector Con 74LS241.jpg
    Selector Con 74LS241.jpg
    319.7 KB · Visitas: 32
  • Selector Con 74LS241.zip
    20.7 KB · Visitas: 18
Hola juliocesar71

Quiere decir que no puedes trabajar con ese IC –74LS365- pues tu ISIS no trae las librerías para poder hacerlo.
Se requeriría conseguir la versión 7.8 de ISIS de Proteus para poder utilizarlo.

Pero sí puedes trabajar con el 74LS241. Cierto??
Pues hazlo como se muestra en la imagen adjunta o en el archivo comprimido que te envío.
Solo tienes que completarlo con los decodificadores y los Display’s.

saludos
a sus ordenes

Buenas noches MrCARLOS

Muchas gracias por su gran aporte en este proyecto, con su valiosa colaboración logre montar el diseño final, funciona perfectamente, espero contar con sus conocimientos en próximas ocasiones.

Un saludo (y)

Cordialmente,

JULIO CESAR
 
Atrás
Arriba