You are on page 1of 7

ESCUELA POLITECNICA NACIONAL

LABORATORIO DE SISTEMAS MICROPROCESADOS


PRCTICA 8
TEMA: BARRIDO DE TECLADO Y SUBRUTINAS
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, 8, 9, A, B, C, X, =, BORRAR.
teclado:
;almaceno registros en stack
push r16
push r17
ldi
r17,0
;registro r16 hace barrido de columnas
;reconoce caracteres de la primera fila
ldi
r16,0b11111110
out
portd,r16
sbis
pind,4
ldi
r17,0
sbis
pind,5
ldi
r17,1
sbis
pind,6
ldi
r17,2
sbis
pind,7
ldi
r17,3
;reconoce caracteres de la segunda fila
ldi
r16,0b11111101
out
portd,r16
sbis
pind,4
ldi
r17,4
sbis
pind,5
ldi
r17,5
sbis
pind,6
ldi
r17,6
sbis
pind,7
ldi
r17,7
;reconoce caracteres de la tercera fila
ldi
r16,0b1111011
out
portd,r16
sbis
pind,4
ldi
r17,8
sbis
pind,5
ldi
r17,9
sbis
pind,6
ldi
r17,10
sbis
pind,7
ldi
r17,11
;reconoce caracteres de la cuarta fila
ldi
r16,0b11110111
out
portd,r16
sbis
pind,4
ldi
r17,12
sbis
pind,5
ldi
r17,13
sbis
pind,6

ldi
r17,14
sbis
pind,7
ldi
r17,15
;almaceno caracter encontrado en la sram
sts
tecla,r17
;reestituyo registros
pop
r17
pop
r16
ret

2. Desarrollar un programa que permita resolver la siguiente funcin f(x):

Donde los valores de A, B, C y X son ingresados mediante el teclado


matricial. Conforme se vayan aplastando las teclas de nmeros, stos deben
ir apareciendo el dgito menos significativo, y conforme se vayan
presionando otros nmeros se van desplazando a la izquierda como en una
calculadora. Solo se pueden ingresar hasta dos dgitos, es decir el mayor
nmero que se puede ingresar ser el 99.
Luego de ingresar el operando se debe presionar A, B, C o X para guardar el
valor a utilizarse en la funcin, y el display debe volver a 0000. Para mostrar
el resultado se debe presionar la tecla [=], esta se puede presionar en
cualquier momento, es decir, no se necesita haber ingresado todos y cada
uno de los valores de A, B, C y X previamente. Si el resultado es mayor a
9999 mostrar [- - - -] en los displays.
Si en cualquier momento se presiona la tecla BORRAR durante el ingreso de
los nmeros, el display vuelve a 0000 y se reinicia el ingreso del operando.
Si se presiona BORRAR cuando se est mostrando el resultado, se muestra
0000 y los valores de A, B, C y X vuelven a 0.
DIAGRAMA DE FLUJO DEL PROGRAMA:

CODIGO IMPLEMENTADO:
.include "m164pdef.inc"
.def
.def
.def
.def
.def
.def
.def

a=r5
b=r6
c=r7
var=r8
anterior=r9
tempo=r16
aux=r17

.dseg
tecla: .byte 1
binariol: .byte 1
binarioh: .byte 1
dig: .byte 4
segmentos: .byte 4
.cseg

.org 0x00
rjmp inicio
.org 0x06
rjmp nueva_tecla
inicio:
;configuro puertos
clr
tempo
out
ddrb,tempo
out
porta,tempo
com
tempo
out
portb,tempo
out
ddra,tempo
;para el teclado y control display uso 4 bits como salida y 4 como entrada
ldi
tempo,0b00001111
out
ddrc,tempo
out
ddrd,tempo
com
tempo
out
portc,tempo
out
portd,tempo
;activo pull up
in
tempo,mcucr
andi
tempo,0b11101111
out
mcucr,tempo
;configuro stack pointer
ldi
tempo,high(ramend)
out
sph,tempo
ldi
tempo,low(ramend)
out
spl,tempo
;activo interrupciones
ldi tempo,0b00100000
sts eicra,tempo
ldi tempo,0b00000100
out eimsk,tempo
sei
;lazo principal
lazo:
call
bin_bcd
call
bcd_7seg
call
barrido
rjmp lazo
;inicio interrupcion
nueva_tecla:
;evalua condicion para ingresar dos digitos
cpi r18,0xf
brne dig2
;llama teclado para reconocer tecla
call teclado
lds anterior,tecla ;almaceno tecla en registro
sts binariol,anterior ;almacena valor en la sram
ldi r21,0
sts binarioh,r21
;reestablece el teclado
ldi tempo,0b11110000
out portd,tempo
clr r18 ;condicion para digitos
reti
;lo mismo para el segundo digito
dig2:
call teclado
lds r20,tecla

cpi r20,10
;comparo el maximo lugar de digitos en el teclado
brcc guardar ;si es mayor va a evaluar el resto de teclas
ldi r27,10
mul anterior,r27
mov r25,r0
mov r26,r1
add r25,r20
clr r20
adc r26,r20
sts binariol,r25
sts binarioh,r26
ldi tempo,0b11110000
out portd,tempo
ser r18
reti
guardar:
;evalua si fue tecla A
cpi r20,10
breq movera
;evalua si fue tecla B
cpi r20,11
breq moverb
;evalua si fue tecla C
cpi r20,12
breq moverc
;evalua si fue tecla X
cpi r20,13
breq movervar
;evalua si fue tecla =
cpi r20,14
breq moverigual
;evalua si fue tecla BORRAR
cpi r20,15
breq borrar
;almacena valor en la variable deseada
movera:
mov a,anterior
sts binariol,a
ldi r21,0
sts binarioh,r21
;reestablece teclado
ldi tempo,0b11110000
out portd,tempo
reti
;almacena valor en la variable deseada
moverb:
mov b,anterior
sts binariol,b ;
ldi r21,0
sts binarioh,r21
;reestablece teclado
ldi tempo,0b11110000
out portd,tempo
reti
;almacena valor en la variable deseada
moverc:
mov c,anterior
sts binariol,c
ldi r21,0
sts binarioh,r21

;reestablece teclado
ldi tempo,0b11110000
out portd,tempo
reti
;almacena valor en la variable deseada
movervar:
mov var,anterior
sts binariol,var
ldi r21,0
sts binarioh,r21
;reestablece teclado
ldi tempo,0b11110000
out portd,tempo
reti
;realiza operacion de la f(x)
moverigual:
mul var,var
mov r10,r0
mov r11,r1
mul b,r10
mov r12,r0
mov r13,r1
mul a,var
add r10,r12
adc r11,r13
add r10,r0
adc r11,r1
add r10,r7
clr r7
adc r11,r7
sts binariol,r10
sts binarioh,r11
;reestablece teclado
ldi tempo,0b11110000
out portd,tempo
reti
;limpia los registros reinicia todo
borrar:
clr tempo
sts binariol,tempo
sts binarioh,tempo
rjmp nueva_tecla
.include
.include
.include
.include

"teclado.asm"
"binarioabcd.asm"
"bcda7seg.asm"
"barrido.asm"

SIMULACION:

0 1 2 3

f0

4 5 6 7

f1

8 9 A B

f2

ON

a
b
c
d
e
f
g

R11

R8

d4
d3
d2
d1

C X = CEROf3

R9

10k

10k

10k

R10

DIODE

RP1
D3

DIODE

RESPACK-8

D4
DIODE

En la practica no es necesario estas resistencias


es un error que presenta proteus

U2

U1
40
41
42
43
44
1
2
3
f0
f1
f2
f3
c0
c1
c2
c3

9
10
11
12
13
14
15
16
29
27
4

PB0/XCK0/T0/PCINT8
PB1/T1/CLKO/PCINT9
PB2/AIN0/INT2/PCINT10
PB3/AIN1/OC0A/PCINT11
PB4/SS/OC0B/PCINT12
PB5/MOSI/PCINT13
PB6/MISO/PCINT14
PB7/SCK/PCINT15
PD0/RXD0/PCINT24
PD1/TXD0/PCINT25
PD2/INT0/RXD1/PCINT26
PD3/INT1/TXD1/PCINT27
PD4/OC1B/XCK1/PCINT28
PD5/OC1A/PCINT29
PD6/ICP/OC2B/PCINT30
PD7/OC2A/PCINT31
AREF
AVCC
RESET
ATMEGA164P

PA0/ADC0/PCINT0
PA1/ADC1/PCINT1
PA2/ADC2/PCINT2
PA3/ADC3/PCINT3
PA4/ADC4/PCINT4
PA5/ADC5/PCINT5
PA6/ADC6/PCINT6
PA7/ADC7/PCINT7
PC0/SCL/PCINT16
PC1/SDA/PCINT17
PC2/TCK/PCINT18
PC3/TMS/PCINT19
PC4/TDO/PCINT20
PC5/TDI/PCINT21
PC6/TOSC1/PCINT22
PC7/TOSC2/PCINT23
XTAL1
XTAL2

37
36
35
34
33
32
31
30

1
2
3
4
5
6
7

1B
2B
3B
4B
5B
6B
7B

COM
1C
2C
3C
4C
5C
6C
7C

9
16
15
14
13
12
11
10

D2

DIODE

9
8
7
6
5
4
3
2

D1

c3

c0

c2

c1

10k

R1
R2
47
R3
47
R4
47
R5
47
R6
47
R7
47
1k

19
20
21
22
23
24
25
26
8
7

U3

a
b
c
d
e
f
g
d1

U4
NOT
d2

U5
NOT
d3

U6
NOT
d4

En la practica se conecta transistores PNP que trabajan en corte y saturacion


NOT

BIBLIOGRAFIA:
Apuntes de clase de Sistemas Microprocesados, Ing. Jhon Pilataxi
Apuntes de clase de Laboratorio de Sistemas Microprocesados, Ing. Roberto
Guachi

You might also like