# pregunta microcontrolador 89c52 y teclado



## kstriyhon (Nov 20, 2005)

hola tengo un problema con un microcontrolador y un teclado matricial de 4 x 4 la cuestion es que necesito hacer una calculadora usando ensamblador mas especificamente el asem8x5x2 estoy empezando a hacer las rutinas para imprimir en el LCD los numero que entran en el teclado pero tengo un problema, yo leo los numeros que entran al teclado desde una memoria externa pues el teclado lo tengo conectado a un decodificador 74C922 que se encarga de escanear la entrada de teclado.

despues de inicializar todo en mi codigo capturo la tecla presionada por medio de estas lineas 


dato:
        MOV DPTR,#0C000H
	MOVX A,@DPTR
        CJNE A,#0F0H,dato


donde #0F0H hace referencia a la recla 1 del teclado,la cuestion es que este codigo esta capturando bien el teclado pero una vez realizo la funcion correspondiente a cada tecla quiero que el programa vuelva a un ciclo de espera pero cuando regreso al ciclo de espera en memoria externa se encuentra guardada la ultima tecla presionada en el teclado lo que hace que el programa se quede en un ciclo infinito de impresion de esa tecla hasta que presione otra,esto no es muy util en mi caso de una calculadora

he intentado cada que leo el valor de memoria limpiar esa posicion de memoria #0C000H poniendo un numero cualquiera alli.

estas son las lineas usadas

        MOV A,#00FFH
	MOVX @DPTR,A

pero esto no ha dado resultado.

cualquier idea o codigo de ejemplo seria de mucha ayuda
agradeciendoles de antemano


----------



## Marcelo (Nov 20, 2005)

Hola kstriyhon,

No conozco el micro 89c52 pero me parece que lo que quieres hacer lo debes realizar por medio de interrupciones.

Al momento de presionar un tecla, esa acción deberá generar una interrupción.

Esa interrupción hace que el curso normal de tu programa salte sin otra condición a la rutina que has escrito para que se actúa cuando esto se genera.

Dentro de la rutina de interrupción, haces lo que comentas en tu mensaje respecto a la lectura del teclado, colocando en una variable de control cual es el caracter ingresado o enviado.

Al salir de la rutina de interrupción, podrás actuar en consecuencia de acuerdo a que caracter hayas recibido desde el teclado (0 - 9  +  -  * / . , =  C  CE ), sabiendo entonces si debes presentarlo en pantalla, hacer una operación aritmética, borrar la pantalla, etc. donde desvuiarás el programa a su rutina respectiva.

Creo que en líneas generales es como debería funciona.

Saludos,
Marcelo.


----------



## kstriyhon (Nov 20, 2005)

gracias Marcelo. alguien me habia comentado lo mismo y creo que tienes razon es la mejor forma de hacerlo el problema entonces es que realmente no sabria como implementar las interrupciones para lectura de teclado, depronto tu tienes esto un poco mas claro.

el teclado lo tengo conectado a un decodificador que es el encargado de hacer el escaneo del mismo con el fin de identificar que tecla en el teclado ha sido presionada, luego de esto este valor de tecla es la que llega al micro en un numero hexadecimal que va desde el F0 al FF esta información llega al micro por el bus de datos del micro desde el D0 a D3 por el puerto uno P0
la interupcion deberia de activarse cada que un valor llegue a este puerto?? o como seria la verificacion de la interrupcion??

gracias de antemano

cualquier codigo o ayuda seria grandioso.


----------



## Marcelo (Nov 20, 2005)

Tardé en responderte porque tuve que hechar un ojo en las datasheets.

Esto es una idea pues nunca lo he implementado.

El 74C922 tiene un pin que se llama "Data Available".  Ese pin se va a estado alto cuando una tecla válida ha sido presionada en el keyboard.

La señal de ese pin es la que deberías usar para activar la interrupción
(ahora vemos como).

Una vez que se activó la interrupción, la rutina que diseñastes para manejarla, toma el control del firmware. Esto deberás ver como hacerlo  en la datasheet del microcontrolador.

En esa rutina de interrupción, lees el estado de los pines  D0 a D3 del puerto P0 tal como lo haces ahora y almacenas el caracter en algún lado para usarlo luego.

Según la datasheet del micro, las interrupciones externas las puedes capturar en el puerto 3, pin 2 o pin 3 y a uno de ellos deberás llevar la señal de "Data Available" del 74C922. Cuando esa señal sea "High", el micro disparará la bandera de interrupción externa.

Fíjate en la datasheet porque deberás actuar en los registros IE y P3, y posiblemente en el IP e IPH#

En ella hay un apartado que dice "Interrupt Priority Structure" donde te explica como manejarlas.

El programa principal debería ser un bucle que en su inicio, lee la variable que contiene el caracter recibido:

1) Si esta variable contiene un valor escogido por tí, que no pueda ser generado por el teclado (el valor "00" por ejemplo) y que siginifica "No he recibido nada", el bucle se reiniciaría una y otra vez esperando un caracter válido.

2) Cuando presiones el teclado, la señal "Data Available" activará el nivel a "High" del pin 2 o 3 (el que tu decidas usar) del puerto 3. Esto hará que el microprocesador "levante" la bandera de interrupción y desvíe la ejecución del programa hacia la rutina de interrupción. En ella, leerás el dato por el puerto P0 mediante los pines D0 a D3; almacenarás el valor en una variable, bajarás "manualmente" la rutina de interrupción y harás que salga de ella.

3) Al regresar de la rutina de interrupción, el programa principal retoma el control. Ahora, en la variable del caracter recibido no hay "00" sino otra cosa. En base a su valor, sabrás a que subrutina desviarlo. Si es un número, lo presentas en pantalla; si es un "+" harás tu rutina de suma, etc. etc.

Creo que esto resume en casi pseudo código lo que podrías hacer. 

¿Como manejar la interrupción desde el firmware?, deberás leerlo en los hoja de datos de tu micro, buscarlo en Internet o esperar que alguien que lo haya programado te explique como hacerlo paso a paso.

Por lo general se resume en indicar en el encabezado del programa donde debe saltar o apuntar el vector que señala la próxima instrucción cuando se genera una interrupción.

Luego se deben manejar las banderas y registros de estado para "borrar" la interrupción y esperar la póxima.

Ojo que quizás deberás mandar desde el microcontrolador, una señal hacia el "Output Enbled" del 74C922 para resetearlo cada vez que recibas un caracter. creo que el lugar ideal para hacerlo es antes de salir de la rutina de interrupción o al inicio del bucle del programa principal.

Saludos,
Marcelo.


----------



## leny.8 (May 30, 2007)

te salio al final la calculadora ??? sera que me puedes mandar tu codigo... porfa.. pq estoy predidisima en el tema gracias un beso


----------



## jorgitogq (May 10, 2010)

a mi me salio bien la calculadora con el at89c52,si deseas el codigo te lo paso a tu correo sin problema, y de paso te mando un programa que estoy probando, es para un porton electrico, quiero mandar datos en serie con el atmel, y lamentablemente no he tenido la suerte que mi docente nos enseñe jaja, pero a ver si me das una mano con eso te lo agradeceria mucho


----------



## antiworldx (May 11, 2010)

jorgitogq dijo:


> a mi me salio bien la calculadora con el at89c52,si deseas el codigo te lo paso a tu correo sin problema, y de paso te mando un programa que estoy probando, es para un porton electrico, quiero mandar datos en serie con el atmel, y lamentablemente no he tenido la suerte que mi docente nos enseñe jaja, pero a ver si me das una mano con eso te lo agradeceria mucho



1. El tema es viejisimo, si te fijas es del 30-may-2007.. Hace tres años del ultimo post!!!
2. Cual problema hay que todos observemos los codigos? 
3. Seguro en el buscador podras encontrar como usar el serial.
4. Seguro sera movido tu mensaje a moderacion, no lo tomes personal


----------

