Está en la página 1de 17

ESCUELA POLITÉCNICA NACIONAL

LABORATORIO DE SISTEMAS MICROPROCESADOS


PRÁCTICA N° 10
NOMBRE: Hansel Lara GRUPO: GR2-1
1. TEMA
BARRIDO DE TECLADO
2. OBJETIVOS

Diseñar un circuito, y el software asociado para manejar un teclado matricial de 16 teclas en conjunto
con 4 display de 7 segmentos.
3. INFORME

3.1. Realizar lo que el instructor solicite.

3.1.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, A, B, C, =,
enter, BORRAR

La subrutina para identificar las teclas antes mencionadas es la siguiente:


BARRIDOTeclado:
ldi tecla,0xFF

ldi r16,0b11111110
out portb,r16
sbis pinb,7
rcall rutinaA
sbis pinb,6
rcall rutina9
sbis pinb,5
rcall rutina8
sbis pinb,4
rcall rutina7

ldi r16,0b11111101
out portb,r16

sbis pinb,7
rcall rutinaB
sbis pinb,6
rcall rutina6
sbis pinb,5
rcall rutina5
sbis pinb,4
rcall rutina4

ldi r16,0b11111011
out portb,r16
sbis pinb,7
rcall rutinaC
sbis pinb,6
rcall rutina3
sbis pinb,5
rcall rutina2
sbis pinb,4
rcall rutina1

ldi r16,0b11110111
out portb,r16
sbis pinb,7
rcall GNumro
sbis pinb,6
rcall igual
sbis pinb,5
rcall rutina0
sbis pinb,4
ldi tecla,0xEE
Esta subrutina se basa en la siguiente conexión del teclado:

3.1.2 Desarrolle un programa que pueda resolver la siguiente función f(x)


f(x) =AC+(B+C)
Donde los valores de A, B y C son ingresados mediante el teclado matricial.
Conforme se vayan aplastando las teclas de números, éstos deben ir apareciendo desde el
dígito menos significativo de los displays 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.

Las instrucciones para el programa a desarrollarse se presentan en la siguiente imagen:


El código desarrollado se presenta a continuación:
El código es el siguiente:

; Informe10.asm
;
; Created: 10/08/2022 3:05:48
; Author : Hansel Lara
;
.def llevar=r19
.def aux1=r21
.def aux2=r22
.def tecla=r23
.def presionar=r20
.def cont=r24
.def NUM=r5
.def a=r6
.def b=r7
.def c=r8
.def d=r2
.def e=r15
.def f=r3
.def Unidad=r9
.def Decena=r10
.def Digito1=r11
.def Digito2=r12
.def contador=r18
.def aux=r13
.def decena_mil=r1

.dseg

.cseg
.org 0x00

;Configurar Puertos de entrada y salida


ldi r16,0b00001111
out ddrb,r16
com r16
out portb,r16

ldi r16,0xFF
out ddra,r16
out ddrc,r16

in r16,mcucr
andi r16,0b11101111
out mcucr,r16

nop

clr Digito1
clr Digito2

reset:
;inicializacion de las variables
clr r16
clr Unidad ; Valor donde se almacena la unidad
clr Decena ; Valor donde se almacena la unidad
clr cont
ldi presionar,0xFF
rcall Visaluizar
Programa:
rjmp BARRIDOteclado
Code:
cpi cont,2
breq presionado
cpi cont,4
breq presionado
inc cont
rcall gtecla
rcall Visaluizar
rjmp Programa

igual:
rcall D_operacion
rcall Visaluizar
ldi cont,4
rjmp Programa

GNumro:
mov r16,num
cpi r16,1
breq guardarA
cpi r16,2
breq guardarB
cpi r16,3
breq guardarC
GuardarA:
mov a,Unidad
mov b,Decena
rjmp finalizarGN
GuardarB:
mov E,Unidad
mov F,Decena
rjmp finalizarGN
GuardarC:
mov C,Unidad
mov D,Decena
rjmp finalizarGN

finalizarGN:
ret
GTecla:
cpi cont,1
breq guardarUnidad
cpi cont,2
breq guardarDecena
guardarUnidad:
mov Unidad,tecla
rjmp finalizarG
guardarDecena:
mov Decena,Unidad
mov Unidad,tecla
rjmp finalizarG
finalizarG:
ret
presionado:
mov presionar,tecla
rcall Visaluizar
rjmp Programa

BARRIDOTeclado:
ldi tecla,0xFF

ldi r16,0b11111110
out portb,r16
sbis pinb,7
rcall rutinaA
sbis pinb,6
rcall rutina9
sbis pinb,5
rcall rutina8
sbis pinb,4
rcall rutina7

ldi r16,0b11111101
out portb,r16

sbis pinb,7
rcall rutinaB
sbis pinb,6
rcall rutina6
sbis pinb,5
rcall rutina5
sbis pinb,4
rcall rutina4

ldi r16,0b11111011
out portb,r16
sbis pinb,7
rcall rutinaC
sbis pinb,6
rcall rutina3
sbis pinb,5
rcall rutina2
sbis pinb,4
rcall rutina1

ldi r16,0b11110111
out portb,r16
sbis pinb,7
rcall GNumro
sbis pinb,6
rcall igual
sbis pinb,5
rcall rutina0
sbis pinb,4
ldi tecla,0xEE

cp presionar,tecla
breq presionado
mov presionar,tecla
cpi tecla,0xEE
breq superreseteo
cpi tecla,0xFF
breq presionado
RJMP CODE
superreseteo:
cpi cont,4
brne finalizars
clr r16

mov Digito2,r16
mov Digito1,r16

clr num

finalizars:
rjmp reset

rutinaA:
mov presionar,tecla
clr Unidad
clr Decena
clr cont
ldi r16,1
mov num,r16
ldi r16,10
mov Digito2,r16
ldi r16,13
mov Digito1,r16
rcall Visaluizar
rjmp Programa

rutinaB:
mov presionar,tecla
clr Unidad
clr Decena
clr cont
ldi r16,2
mov num,r16
ldi r16,11
mov Digito2,r16
ldi r16,13
mov Digito1,r16
rcall Visaluizar

rjmp Programa

rutinaC:
mov presionar,tecla
clr Unidad
clr Decena
clr cont
ldi r16,3
mov num,r16
ldi r16,12
mov Digito2,r16
ldi r16,13
mov Digito1,r16
rcall Visaluizar

rjmp Programa

Visaluizar:
;mostrar en el primer display
mov llevar,Unidad
ldi r17,0b01110011
out porta,r17
rcall buscar
out portc,r17
rcall Retardo

;mostrar en el segundo display


mov llevar,Decena
ldi r17,0b10110011
out porta,r17
rcall buscar
out portc,r17
rcall Retardo

;mostrar en el tercer display


mov llevar,Digito1
ldi r17,0b11010011
out porta,r17
rcall buscar
out portc,r17
rcall Retardo

;mostrar en el cuarto display


mov llevar,Digito2
ldi r17,0b11100011
out porta,r17
rcall buscar
out portc,r17
rcall Retardo

ret

Buscar:
ldi zh,high(tabla<<1)
ldi zl,low(tabla<<1)
add r30,llevar
clr llevar
adc r31,llevar
lpm r17,z
ret

rutina0:
mov r16,num
cpi r16,0
breq finalizar0
cpi r16,4
breq finalizar0
ldi tecla,0
finalizar0:
ret

rutina1:
mov r16,num
cpi r16,0
breq finalizar1
cpi r16,4
breq finalizar1
ldi tecla,1
finalizar1:
ret
rutina2:
mov r16,num
cpi r16,0
breq finalizar2
cpi r16,4
breq finalizar2
ldi tecla,2
finalizar2:
ret

rutina3:
mov r16,num
cpi r16,0
breq finalizar3
cpi r16,4
breq finalizar3
ldi tecla,3
finalizar3:
ret

rutina4:
mov r16,num
cpi r16,0
breq finalizar4
cpi r16,4
breq finalizar4
ldi tecla,4
finalizar4:
ret

rutina5:
mov r16,num
cpi r16,0
breq finalizar5
cpi r16,4
breq finalizar5
ldi tecla,5
finalizar5:
ret

rutina6:
mov r16,num
cpi r16,0
breq finalizar6
cpi r16,4
breq finalizar6
ldi tecla,6
finalizar6:
ret

rutina7:
mov r16,num
cpi r16,0
breq finalizar7
cpi r16,4
breq finalizar7
ldi tecla,7
finalizar7:
ret
rutina8:
mov r16,num
cpi r16,0
breq finalizar8
cpi r16,4
breq finalizar8
ldi tecla,8
finalizar8:
ret

rutina9:
mov r16,num
cpi r16,0
breq finalizar9
cpi r16,4
breq finalizar9
ldi tecla,9
finalizar9:
ret

;baA feB (cd)C


D_operacion:

Solucion_Del_Producto:
//unidad del segundo por unidad del primero
clr contador
clr llevar
mul c, a
rcall descomponer
mov llevar, contador //carry
mov xl, aux //primer valor
//unidad del segundo por decena del primero
clr contador
mul c, b
rcall descomponer
mov xh, aux
mov yl, contador

//decena del segundo por unidad del primero


clr contador
clr llevar
mul d, a
rcall descomponer
mov llevar, contador //carry
mov yh, aux //primer valor
//decena del segundo por decena del primero
clr contador
mul d, b
rcall descomponer
mov zl, aux
mov zh, contador

Suma_Productos:
clr llevar
clr contador
mov aux, xl
mov Unidad, aux //Tengo el valor de unidad del producto

clr contador
mov aux, xh //tengo el valor de decena del producto 81 => 8 y 1
mov aux1, yh
add aux, aux1
mov r0, aux
rcall descomponer
mov Decena, aux
mov llevar, contador

clr contador
mov aux, yl
mov aux1, zl
add aux, aux1
mov r0, aux
rcall descomponer
mov Digito1, aux
mov llevar, contador

clr contador
mov aux, zh
mov r0, aux
rcall descomponer
mov Digito2, aux
mov decena_mil, contador

Solucion_Ecuacion:

clr contador
clr llevar
mov aux, Unidad
add aux, e
add aux, c
mov r0, aux
rcall descomponer
mov Unidad, aux
Mov llevar, contador

clr contador
mov aux, Decena
add aux, f
add aux, d
mov r0, aux
rcall descomponer
mov Decena, aux
Mov llevar, contador

clr contador
mov aux, Digito1
mov r0, aux
rcall descomponer
mov Digito1, aux
Mov llevar, contador

clr contador
mov aux, Digito2
mov r0, aux
rcall Descomponer
mov Digito2, aux
mov decena_mil, Contador
ret

descomponer: //sale de contador las decenas y de aux las unidades


//poner a sumar el carry
//tienes carry ya sea 0 o distinto
mov aux2, r0 //Valor de la multi o de la suma
add aux2, llevar //considero el carry
clr aux1 //contador de decenas
DECENA_1:
cpi aux2,10
brcs Establecer_Decena
inc aux1
subi aux2,10
rjmp DECENA_1
Establecer_Decena:
mov contador,aux1
clr aux1
UNIDAD_1:
mov aux,aux2
ret
ret
Retardo:
ldi r16,10
tiempo3:
ldi r17,10
tiempo2:
ldi r18,10
tiempo1:
dec r18
brne tiempo1
dec r17
brne tiempo2
dec r16
brne tiempo3
ret
tabla:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
.db 0b01110111,0b01111100 ;10 (A),11 (b)
.db 0b00111001,0b01001000 ;12 (C),13 (=)

La implementación en Proteus es la siguiente


Al inicio permanecerá en cero como se observa

Luego se aplasta la tecla % (A) y se ingresa el número para poder guardar dicho número se ingresa
Enter que está representada por la tecla suma para la letra B es la tecla de multiplicación y para la
letra C es la tecla de menos, esto se muestra en las siguientes imágenes:

Cuando el pin7 del puerto B está en bajo y el pin7 del puerto D está en bajo se presenta el segundo
número como se muestra en la siguiente imagen
Para obtener el resultado se presiona la tecla igual (=) y se mostrará el resultado de la función:
𝑓(𝑥) = 𝐴 × 𝐶 + (𝐵 + 𝐶 ) = 93 × 54 + (32 + 54) = 5108
Y esto se muestra en la siguiente imagen:
Solo se podrá ingresar hasta el número 99 por cada letra en este caso si se ingresa 99 a cada letra el
resultado será
𝑓(𝑥) = 𝐴 × 𝐶 + (𝐵 + 𝐶 ) = 99 × 99 + (99 + 99) = 9999

Nunca se desbordará y esto se muestra a continuación:


3.2 Conclusiones y Recomendaciones.
Conclusiones:

• El barrido de teclado es de mucha utilidad dado que nos permite ingresar un número
especifico sin tener que ingresarlo de manera binaria, además con el teclado se puede crear
varios programas como una calculadora entre muchos más.
• Se noto que para realizar el barrido de teclado es necesario identificar que parámetros serán
entrada o salida dependiendo de eso se puede realizar varios metodos de barrido de teclado,
además cada vez que se complica la implementación de un programa como en este caso el
barrido es necesario dividirlo en subrutinas.
• Se evidencio que a través del teclado se facilita la transferencia de información de manera
visual entre el usuario y el hardware dado que las personas se encuentran mas familiarizadas
con el sistema decimal en base a esto se puede crear o implementar programas que sean
mucho mas amigables para muchas personas.
Recomendaciones:

• Se recomienda verificar que metodo de barrido de teclado se puede implementar y en base a


es realizar las condiciones específicas.
• Se recomienda tener en cuenta que al momento de presionar una tecla puede existir rebotes
por lo tanto se debe tener en cuenta dicho detalle, así como el detectar correctamente el flanco
de subida o bajada y evitar errores de procesamiento de la información.
Referencias:
[1]. Atmel, “AVR Instruction Set”, [En línea], Disponible en:
http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf,
[Ultimo acceso: 11/08/2022]

También podría gustarte