Está en la página 1de 7

CENTRO UNIVERSITARIO DE VALLADOLID YUCATAN

SUB RUTINAS
Llamado de una funcin de ensamblador a C
Rodrigo Mendoza Nahuat, Jebebai Cen Chooc
26/02/2014
Octavo cuatrimestre
Ingeniera Mecatrnica
Proyecto Mecatrnico

OBJETIVOS
Comprender la utilidad de las subrutinas y la comunicacin con el programa
principal, realizando la exportacin de una rutina hecha en el lenguaje
ensamblador para hacer uso de ello en un cdigo principal hecho en c.
Analizar el funcionamiento del programa y realizar la correccin
correspondiente para evitar el problema que este transmite.

Desarrollo
El siguiente programa hace uso de una rutina creada en ensamblador para
despus ser usada por nuestro programa principal creada en el lenguaje C.
El programa principal realiza la impresin de una cantidad en unidades,
decenas, centenas con datos de entrada desde un teclado matricial, en esta parte
el cdigo inicializa la variables a utilizar y condiciones de trabajo as como la
operacin para poder imprimir la cantidad requerida en el orden que se requiere.
El programa hace el llamado hace uso de la rutina creada en ensamblador
#include "sub_rutina.h"

en donde dentro de esta funcin encontramos

expresados los pines a utilizar para la lectura de la LCD para la lectura del teclado
matricial.
De igual manera se hace uso de una librera de tiempo #include "delay.h"
esto para mantener un tiempo de espera, antes de la impresin de datos
ingresadas a la LCD se hizo uso de esta porque se observ que al momento de
imprimir los datos estos se impriman varias veces por lo que no se permita
visualizar la cantidad correcta debido a la lectura del micro controlador que
interpretaba varias impresiones de datos a la vez, por lo que con el uso de la
librera se logr detectar un pulso a la vez lo que permiti un retardo en la lectura.
#pragma

fastcall16

para poder utilizar la rutina creada en ensamblador

se utiliz esta funcin para poder procesar ciertos registros para la exportacin

Cdigo
Programa principal
#include <m8c.h>
// part specific constants and macros
#include "PSoCAPI.h"
// PSoC API definitions for all User Modules
#include "sub_rutina.h"
#include "delay.h"
int valor;
char unidades,decenas,centenas;tecla;
void main(void)
{
LCD_1_Start ();// inicializacion de la LCD
PRT1DR=0;//
unidades ='0';//variable
decenas ='0';//variable
centenas ='0';//variable
LCD_1_Position (0,0);//posicion LCD
LCD_1_PrCString ("numero");//imprimir valor rom
LCD_1_Position (1,0);//
LCD_1_PrCString ("valor hex");//
//****************************************************************
while (1)
{
LCD_1_Position (0,8);//**************************
LCD_1_WriteData (centenas);// escribe el dato centenas
Delay10msTimes(10);
LCD_1_WriteData (decenas);//*********************
Delay10msTimes(10);
LCD_1_WriteData (unidades);//******************** impresin
de datos
Delay10msTimes(10);
tecla=0;// inicio tecla 0************************
while (tecla==0)//mientras sea 0*****************
{
tecla =ReadKey();//realiza la exportacion de readkey creado
en las subrutinas, especificdo como export readkey
if ((tecla>9| tecla<0))//condicion mayor menor
{
if (tecla=='D'){// si la tecla presionada es D
valor =(100*(centenas-'0')+10*(decenas'0')+(unidades-'0'));// el valor es igual a la operacin declarada para
poder representarlos en sus posiciones
LCD_1_Position (1,11);
LCD_1_PrHexInt(valor);
}
tecla=0;
}
}
centenas=decenas;
decenas=unidades;

unidades=tecla;
}}
Rutina a exportar (#include "sub_rutina.h")
include"m8c.inc"; part specific constants and macros
include"memory.inc"; Constants & macros for SMM/LMM and Compiler
include"PSoCAPI.inc"; PSoC API definitions for all User Modules
Filas:
Columnas:
Row4:
Row3:
Row2:
Row1:
Col4:
Col3:
Col2:
Col1:
KeyPort:

equ
equ
equ
equ
equ
equ
equ
equ
equ

equ 0x0F
equ 0xF0
0b00000111
0b00001011
0b00001101
0b00001110
0b11100000
0b11010000
0b10110000
0b01110000
PRT1DR

export ReadKey
export _ReadKey
area text(ROM, REL)
; ------------------------------------------------------------------------; Subrutina de Lectura de un Teclado Matricial en el Puerto "KeyPort"
; Regresa en el Acumulador el valor ASCII de la tecla presionada
; Esta subrutina modifica el valor del Acumulador
; Esta subrutina requiere que el puerto este configurado como Pull-Up
; ------------------------------------------------------------------------.section
macro AsignColValues
mov reg[KeyPort], ~Filas
; Activo todas las Filas
mov A, reg[KeyPort]
; Leo el Puerto
cmp A, Col1
jz
Columna1
cmp A, Col2
jz
Columna2
cmp A, Col3
jz Columna3
cmp A, Col4
jz Columna4
mov A,0x00
ret
Columna4:
mov A, @3
ret
Columna3:
mov A, @2
ret
Columna2:
mov A, @1
ret
Columna1:

mov A, @0
ret
endm
ReadKey:
_ReadKey:
mov reg[KeyPort],~Columnas
mov A, reg[KeyPort]
cmp A, Row1
jz Fila1
cmp A, Row2
jz Fila2
cmp A, Row3
jz Fila3
cmp A, Row4
jz Fila4
mov A,0x00
ret
Fila1:
// C1, C2, C3, C4
AsignColValues'1', '2', '3', 'A'
Fila2:
AsignColValues'4', '5', '6', 'B'
Fila3:
AsignColValues'7', '8', '9', 'C'
Fila4:
AsignColValues'*', '0', '#', 'D'
.endsection

archivo punto h
#pragma fastcall16 ReadKey
extern BYTE ReadKey(void);

; Activo todas las Columnas


; Leo el Puerto

Conclusiones
Se analiz las funciones que se establecieron en el programa as como las
libreras utilizadas, la utilizacin de un rutina fuera de nuestro programa principal
nos ayud a una mayor comprensin de nuestro cdigo debido a que no fue
extenso, se dio la resolucin adecuada al problema que se tenan en el cdigo
aplicando un retardo en cada pulso mandado por el teclado matricial aunque una
manera de hacerlo ms ptimo y la manera adecuada es la utilizacin de las
interrupciones.

También podría gustarte