Vous êtes sur la page 1sur 12

ESCUELA POLITÉCNICA NACIONAL

FACULTAD DE INGENIERÍA ELÉCTRICA Y


ELECTRÓNICA

LABORATORIO DE
SISTEMAS MICROPROCESADOS

TRABAJO PREPARATORIO

Práctica No:8
Tema: BARRIDO DE TECLADO

Grupo: 1

Realizado por: Cesar Miranda

Fecha de Entrega: 18/06/2016


Semestre 2018ª
OBJETIVO

 Diseñar un circuito, y el software asociado para manejar un teclado matricial de 16 teclas


en conjunto con 4 display de 7 segmentos.
 Desarrollar programas en forma modular usando 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, 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

//en caso de que tenga la brlo ingresar_numero1H


tecla aplastada mucho tiempo dos:
cp ante,tempo cpi tempo,10
;ingresar siguiente número
//si son iguales, salto a
continuar11 breq ingresar_numero2
breq continuar11 cpi tempo,11
cpi tempo,16 ;borrar

breq continuar1 breq borrar1


rjmp continuar
cpi tempo,10
;ingresar siguiente número ingresar_numero1L:
breq ingresar_numero22 lds tempo,tecla
cpi tempo,11 sts numero1,tempo
;borrar
ldi zl,low(tabla<<1)
breq borrar1 ;inicializar el puntero Z a la tabla
cpi tempo,12 ldi zh,high(tabla<<1)
;resolver la multiplicación
add zl,tempo
breq resolver1
clr tempo
sbrc bandera,2
;preguntar si ya está ingresado el adc zh,tempo
segundo número lpm tempo,z
rjmp tres sts dig0,tempo
sbrc bandera,3 rjmp continuar
;pregunta si ya se va a ingresar el
segundo numero continuar11:
rjmp continuar1 rjmp resolver
continuar1:
rjmp continuar ingresar_numero2:
ingresar_numero1H: ori bandera,0b0000_1000
lds tempo,tecla cpi tempo,14
lds num2,numero1 breq continuar1
ldi zl,low(tabla<<1) cpi tempo,10
;inicializar el puntero Z a la tabla
breq continuar1
ldi zh,high(tabla<<1)
lds num1,numero1
add zl,tempo
cpi num1,100
clr tempo
breq continuar1
adc zh,tempo
lds num1,numero2
lpm tempo,z
cpi num1,100
lds num1,dig0
breq ingresar_numero2L
sts dig1,num1
cpi num1,10
sts dig0,tempo
brlo ingresar_numero2H
ldi num1,10
mul num2,num1
tres:
lds tempo,tecla
cpi tempo,11
add tempo,r0 ;borrar
sts numero1,tempo breq borrar
ori bandera,0b00000010 cpi tempo,12
;bit 1 para indicar que ya está lleno ;resolver multiplicación
el primer digito
breq resolver
rjmp continuar
rjmp continuar

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,4 push r17


;de conversión a BCD
//fila a
push r18
ldi tempo,0b1111_0111
push r19
out porta,tempo
push r20
//columna 4, /
push xl
sbis pina,7
push xh
ldi r17,16
ldi xl,low(respuesta)
//columna 3, 9
ldi xh,high(respuesta)
sbis pina,6
ld r16,x+
ldi r17,9 ;LSB del número converdido a cm
//columna 2, 8 ld r17,x+
sbis pina,5 ;MSB del número converdido a cm

ldi r17,8
//columna 1, 7 mil: clr r20

sbis pina,4 ldi r18,0b1110_1000

ldi r17,7 ldi r19,0b0000_0011

//almaceno el valor de la mil1: sub r16,r18


tecla aplastada sbc r17,r19
sts tecla,r17 brcs cien
pop r17 inc r20
pop r16 rjmp mil1
out sreg,r16 cien: sts bcd3,r20
pop r16 clr r20
ret add r16,r18
bin_bcd: adc r17,r19
ldi r18,100 //BCD_7SEG
ldi r19,0 segmentos:
cien1: sub r16,r18 push r16
;Almacenar el estado anterior
sbc r17,r19
in r16,sreg
brcs dies
;de los registros en el stack point
inc r20 push r16
rjmp cien1 ;para poder utilizarlos con la rutina

dies: sts bcd2,r20 push r17


;de conversión a siete segmentos
clr r20
push xl
subi r16,-100
push xh
ldi r18,10
push yl
dies1: sub r16,r18
push yh
brcs uno
ldi xl,low(bcd0)
inc r20 ;inicializar el puntero X en el
rjmp dies1 número

uno: sts bcd1,r20 ldi xh,high(bcd0)


;que contiene los dígitos BCD
subi r16,-10
ldi yl,low(dig0)
sts bcd0,r16 ;inicializar el puntero Y en el
número
pop xh
ldi yh,high(dig0)
pop xl
;donde se almacenarán los
pop r20 segmentos
;Restaurar los valores
ldi r17,4
almacenados
pop r19
;desde el stack point tabla_seg:
pop r18 ldi zl,low(tabla<<1)
;inicializar el puntero Z a la tabla
pop r17
ldi zh,high(tabla<<1)
pop r16
;que contienen los segmentos
out sreg,r16
ld r16,x+
pop r16 ;rutina para obtener los
segmentos del
ret
add zl,r16 push xh
;correspondiente número
BCD ldi xl,low(dig0)
;inicializo el puntero X
clr r16
ldi xh,high(dig0)
adc zh,r16 ;donde se encuentra el primer
dígito
lpm r16,z
ldi r18,4
st y+,r16
ldi r17,0b1111_1110
dec r17
brne tabla_seg
barrido1:
pop yh
;Restaurar los valores ser r16
almacenados ;rutina de barrido de
pop yl ldi r23,0b1000_0000 ; apago
;desde el stack point los diplays
pop xh out portb,r23
pop xl out portd,r16
pop r17 ld r16,x+
pop r16 out portb,r16
out sreg,r16 out portd,r17
pop r16 call retardo
ret ser r16
;rutina de barrido de
//BARRIDO
ldi r23,0b1000_0000
barrido:
out portb,r23
push r16
;Almacenar el estado anterior out portd,r16
;los displays de siete segmentos
in r16,sreg
;de los registros en el stack point sec
push r16 rol r17
;para poder utilizarlos con la rutina
dec r18
push r17
brne barrido1
;de conversión a siete segmentos
push r18 pop xh
;Restaurar los valores
push xl almacenados
pop xl nop
;desde el stack point
nop
pop r18
dec r16
pop r17
brne retardo0
pop r16
pop r16
out sreg,r16
ret
pop r16
//Codigo para Displays Anodo comun
ret
// se activa con 1
retardo:
tabla: // 0b1gfedcba
push r16
.db 0b10111111, 0b10000110 ; 0 y 1
ldi r16, 255
.db 0b11011011, 0b11001111 ; 2 y 3
retardo0:
.db 0b11100110, 0b11101101 ; 4 y 5
nop
.db 0b11111101, 0b10000111 ; 6 y 7
nop
.db 0b11111111, 0b11101111 ; 8 y 9

3. Armar el hardware necesario para probar el sistema planteado

BIBLIOGRAFIA

 Datasheet ATmega164P/V, Atmel, Noruega. Disponible en:


http://www.atmel.com/Images/Atmel-42742- ATmega164P_Datasheet.pdf

Vous aimerez peut-être aussi