Preparatorio microprocesados 8
-Se debe modificar el hardware de la práctica anterior, de manera que los datos a ser ingresados al microcontrolador no provengan de interruptores, si no de un teclado matricial. Mantener todo el hardware asociado al barrido de display. Se deben realizar las siguientes modificaciones:
-Desarrollar una subrutina que permita identificar o decodificar las teclas quese presionan en un teclado de 16 teclas. Las teclas a identificar deben ser: 0,1,2,3,4,5,6,8,9,*, =, BORRAR; las otras teclas quedarán sin función. El funcionamiento de esta rutina será de la siguiente manera: conforme se vayan aplastando las teclas de números, éstos deben ir apareciendo el el dígito menos significativo, y conforme se vayan presionando otros números se van desplazando a laizquierda como en una calculadora. Solo se pueden ingresar hasta dos dígitos, es decir el mayor número que se puede ingresar será el 99. Luego de ingresado el primer operando se debe presionar la tecla de multiplicación (*) y luego el segundo operando de hasta dos dígitos (de manera similar al primer operando), luego se presiona el igual (=), y en los 4 display se debe mostrar el resultado de laoperación. Si en cualquier momento se presiona la tecla BORRAR durante el ingreso de los números, el display vuelve a 0000 y se reinicia el ingreso del operando. Si se presiona BORRAR cuando se está mostrando el resultado de la operación anterior, se muestra 0000 y se vuelve a iniciar con el ingreso del primer operando.
.include "m164pdef.inc"
.def dato = r13
.def RESIDUOL= r14
.def RESIDUOH=r15 ; residuo
.def DIVIDENL = r16
.def DIVIDENH= r17 ; resultado y dividendo
.def DIVISL = r18
.def DIVISH = r19 ; divisor
.def AUX= r20 ; número de iteraciones
.def COMP=r21
.def UNIDA=r22
.def DECEN=r23
.def CENTEN=r24
.def MILLAR=r25
.def FLAG=r28
.def KEYB=r29
;Inicio de Programa
.org 0x00
.DSEG
DIG0: .byte 1
DIG1: .byte 1DIG2: .byte 1
DIG3: .byte 1
.CSEG
;ldi mil,0
ldi AUX,0
ldi r16,255
out ddrb,r16
out ddrd,r16
ldi r16,0b00001111
out ddra,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,low(ramend)
out spl,r16
ldi r16,255
out portb,r16
ldi r18,0
out porta,r18 ;pongo las salidas a0 a a3 en 0L
;INICIO
main:
call barridorcall testear
cpi FLAG,1
brne main
;TOMA EL VALOR Y MUESTRA EN DISPLAY
cpi KEYB,11
breq multi
cpi KEYB,15
breq borrar
cpi KEYB,14
breq resultado
inc auxiliar
ST x+,KEYB
multi:
ldi FLAG,0
;SECCION ANTIREBOTE
ldi r18,0
out porta,r18
mantener: in r18,pina
andi r18,0b11110000
cpi r18,0b11110000brne mantener
rcall retardo ;por posibles rebotes
rjmp main
Borrar:
ldi r16,255
out portb,r16
clr r16
out portd,r16
ldi r18,0
out porta,r18
ldi auxiliar,0
ldi FLAG,0
rjmp multi
; Rutina de Multiplicar
resultado:
ldi xh,high(DIG0)
ldi xl,low(DIG0)
ld r17,x+
ldi r19,10
mul r19,r17
ld r17,x+
addr17,r0
ld r18,x+
ldi r19,10
mul r19,r18
ld r18,x+
add r18,r0
mul R17,R18
mov DIVIDENL,r0
mov dividendohigh,r1
call conversion
ldi xh,high(DIG0)
ldi xl,low(DIG0)
ST X+,MILLAR
ST X+,CENTEN
ST X+,DECEN
ST X,UNIDA
Rcall BARRIDO
rjmp MULTI
CONVERSION: ldi COMP,4
cp dividendohigh,COMPbrsh condicion1
ldi COMP,3
cp dividendohigh,COMP
breq condicion2
rjmp a
condicion1: ldi DIVISL,232
ldi DIVISH,3
rcall division
mov MILLAR,DIVIDENL
mov DIVIDENL,residuol
mov dividendohigh,residuoh
rjmp menor_1000
condicion2: ldi COMP,232
cp DIVIDENL,COMP
brcs a
ldi DIVISL,232
ldi DIVISH,3
call division
mov...
Regístrate para leer el documento completo.