Académique Documents
Professionnel Documents
Culture Documents
LABORATORIO DE
SISTEMAS MICROPROCESADOS
TRABAJO PREPARATORIO
Práctica No:8
Tema: BARRIDO DE TECLADO
Grupo: 1
TRABAJO PREPARATORIO
1. Desarrollar una subrutina que permita identificar o decodificar las teclas que se presionan
en un teclado de 16 teclas. Las teclas a identificar deben ser: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
*,=, BORRAR, las demás teclas quedan sin función.
andi tempo, 0b1110_1111
; Barrido_Display2.asm out mcucr, tempo
; //stack
; Created: 12/6/2018 18:36:57 ldi tempo, low(ramend)
; Author : Cesar Miranda out spl, tempo
ldi tempo, high(ramend)
out sph, tempo
//Barrido de Teclado //ante
.def tempo = r16 //me indica que tecla se apalsto antes
.def aux = r17 ldi ante,16
.def tecla = r18 otro:
.def ante = r19 //tecla
//me indica que letra se aplasto
.cseg ldi tecla, 16
.org 0x00 //mando 0 por la columna 4
ldi tempo, 0b0111_1111
//configuracion de puerto out porta, tempo
//evaluo la columna 4
//Puerto A, mitad entrada, mitad salida //d4
ldi tempo, 0b1111_0000 // sbis pina, 0
out ddra, tempo // ldi tecla, 13
ldi tempo, 0b1111_1111 //c4
out porta, tempo // sbis pina, 1
// ldi tecla, 12
//Puerto B, salida de leds //b4
ldi tempo, 0b11111111 sbis pina, 2
out ddrb, tempo ldi tecla, 11
ldi tempo, 0b00000000 ; Leds //a4
apagados // sbis pina, 3
out portb, tempo // ldi tecla, 10
//evaluo la columna 3
//Puerto C y D, puertos no usados ldi tempo, 0b10111111
clr tempo out porta, tempo
//ldi tempo, 0b00000000 //d3
out ddrc, tempo sbis pina, 0
out ddrd, tempo ldi tecla, 14
//c3
ser tempo sbis pina, 1
//ldi tempo,0b11111111 ldi tecla, 3
out portc, tempo //b3
out portd, tempo sbis pina, 2
ldi tecla, 6
//mcucr //a3
in tempo, mcucr sbis pina, 3
ldi tecla, 9 sbis pina, 1
//evaluo la columna 2 ldi tecla, 1
ldi tempo, 0b11011111 //b1
out porta, tempo sbis pina, 2
//d2 ldi tecla, 4
sbis pina, 0 //a1
ldi tecla, 0 sbis pina, 3
//c2 ldi tecla, 7
sbis pina, 1
ldi tecla, 2 //Codigo para detectar si apalste una
//b2 tecla
sbis pina, 2 cp tecla, ante
ldi tecla, 5 breq otro
//a2 mov ante, tecla ; que tecla
sbis pina, 3 aplaste antes
ldi tecla, 8 //Proceso
//evaluo la columna 1 //Mandar por e PORTB el valor de tecla
ldi tempo, 0b11101111 cpi tecla, 16
out porta, tempo breq otro
//d1 out portb, tecla
sbis pina, 0 rjmp otro
ldi tecla, 15
//c1
2. Modificar el programa de la práctica anterior, de tal manera que los números a multiplicar
sean ingresados por el teclado matricial, de tal manera que el sistema funcione de la
siguiente manera.
a. Conforme se vayan presionando las teclas de números, éstos deben ir
apareciendo en los displays por la derecha de manera similar a una calculadora.
Considerar que solo se pueden ingresar hasta dos dígitos, es decir el mayor
número que se puede ingresar será el 99.
b. Después 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), y si se presiona el igual (=) en los 4 display se debe
mostrar el resultado de la operación.
; .def bandera=r21
; calcu4.asm //DEFINICION DE VARIABLES
; Created: 14/6/2018 14:25:14 .dseg
; Author : Cesar Miradan tecla: .byte 1
; numero1: .byte 1
//DEFINICION DE VARIABLES numero2: .byte 1
.def tempo=r16 respuesta: .byte 2
.def ante=r18 bcd0: .byte 1
.def num1=r19 bcd1: .byte 1
.def num2=r20 bcd2: .byte 1
bcd3: .byte 1
dig0: .byte 1 ;DECLARO MCUCR
dig1: .byte 1 in tempo,mcucr
dig2: .byte 1 andi tempo,0b11101111
dig3: .byte 1 out mcucr,tempo
//CODIGO DEL PROGRAMA ;INICIO EL STACK
.cseg ldi tempo,high(ramend)
.org 0x00 out sph,tempo
;puertos ldi tempo,low(ramend)
//puerto a y d, mitad salida, mitad entrada out spl,tempo
ldi tempo,0b0000_1111 ;PROGRAMA
out ddra,tempo clr bandera
out ddrd,tempo ldi tempo,16
//activo pull-up sts tecla,tempo
ldi tempo,0xff ldi tempo,100
out porta,tempo sts numero1,tempo
out portd,tempo sts numero2,tempo
//puerto c, como entrada, puerto no usado clr tempo
clr tempo ldi xl,low(respuesta)
out ddrb, tempo ldi xh,high(respuesta)
//pull-up st x+,tempo
com tempo st x,tempo
out portc,tempo ldi tempo, 0b10111111
//puerto b, salida para displays //ldi tempo, 0
ldi tempo, 0b000_0000 sts dig0,tempo
out ddrb, tempo sts dig1,tempo
//pull-up sts dig2,tempo
com tempo sts dig3,tempo
//ldi tempo,0b01111111 ;programa
out portb,tempo; inicio:
// cargo un tecla en ante, rjmp ingresar_numero2
inicial 16, clear
sbrc bandera,1
lds ante,tecla ;preguntar si ya está ingresado el
primer número
//obtengo en tempo la tecla
apretada rjmp dos
rcall teclado ingresar_numero1:
//almaceno en tecla la tecla lds num1,numero1
aplastada
cpi num1,100
lds tempo,tecla
breq ingresar_numero1L
//comparo la si la tecla
aplastada es diferente de la anterior cpi num1,10
ingresar_numero22:
ingresar_numero2L:
rjmp ingresar_numero2
lds tempo,tecla
borrar1:
sts numero2,tempo
rjmp borrar
ldi zl,low(tabla<<1)
resolver1: ;inicializar el puntero Z a la tabla
ldi zh,high(tabla<<1) borrar:
add zl,tempo
clr tempo ldi tempo,16
adc zh,tempo sts tecla,tempo
lpm tempo,z clr bandera
sts dig2,tempo ldi tempo,100
rjmp continuar sts numero1,tempo
sts numero2,tempo
ingresar_numero2H: clr tempo
lds tempo,tecla ldi xl,low(respuesta)
lds num2,numero2 ldi xh,high(respuesta)
ldi zl,low(tabla<<1) st x+,tempo
;inicializar el puntero Z a la tabla
st x,tempo
ldi zh,high(tabla<<1)
//ldi tempo, 0
add zl,tempo
ldi tempo, 0b10111111
clr tempo
sts dig0,tempo
adc zh,tempo
sts dig1,tempo
lpm tempo,z
sts dig2,tempo
lds num1,dig2
sts dig3,tempo
sts dig3,num1
rjmp continuar
sts dig2,tempo
ldi num1,10
resolver:
mul num2,num1
lds num1,numero1
lds tempo,tecla
cpi num1,100
add tempo,r0
breq continuar
sts numero2,tempo
lds num2,numero2
ori bandera,0b0000_0100
;bit 0 para indicar que ya está lleno cpi num2,100
el primer digito breq continuar
rjmp continuar mul num1,num2
sts respuesta,r0
sts respuesta+1,r1 //columna 2, 0
ori bandera,0b0000_0001 sbis pina,5
;bit 0 para iniciar con _ _ _ _
ldi r17,0
continuar:
//columna 1, C/ON
//esta condicion me llena de
sbis pina,4
ceros los displays
;bit 0 para iniciar con _ _ _ _, apaga ldi r17,11
los dispays //columna c
sbrs bandera, 0 ldi r16,0b1111_1101
rjmp barridos out porta,tempo
rcall bin_bcd //columna 4, -
rcall segmentos sbis pina,7
barridos: ldi r17,16
rcall barrido //columna 3, 3
rjmp inicio sbis pina,6
//TECLADO ldi r17,3
teclado: //columna 2, 2
push r16 sbis pina,5
in r16,sreg ldi r17,2
push r16 //columna 1, 1
push r17 sbis pina,4
ldi r17,16 ldi r17,1
//fila d //fila b
ldi r16,0b1111_1110 ldi tempo,0b1111_1011
out porta,r16 out porta,tempo
//columna 4, + //columna 4, x
sbis pina,7 sbis pina,7
ldi r17,16 ldi r17,10
//columna 3, = //columna 3, 6
sbis pina,6 sbis pina,6
ldi r17,12 ldi r17,6
//columna 2, 5 push r16
;Almacenar el estado anterior
sbis pina,5
in r16,sreg
ldi r17,5 ;de los registros en el stack point
//columna 1, 4 push r16
sbis pina,4 ;para poder utilizarlos con la rutina
ldi r17,8
//columna 1, 7 mil: clr r20
BIBLIOGRAFIA