Você está na página 1de 7

ESCUELA POLITCNICA NACIONAL

DEPARTAMENTO DE CONTROL Y AUTOMATIZACIN

LABORATORIO DE SISTEMAS MICROPROCESADOS PREPARATORIO

TEMA: Utilizacin de subrutinas, barrido de teclado. PRCTICA: 8

REALIZADO POR: Nathaly Johanna Daz Enrquez GRUPO: GR2/04 HORARIO: Lunes, 11-13h FECHA DE ENTREGA: 2014-04-21

PRCTICA N8 1. TEMA: Utilizacin de Subrutinas, Barrido de Teclado 2. OBJETIVO: Disear un circuito, y el software asociado para manejar un teclado matricial de 16 teclas en conjunto con 4 display de 7 segmentos. En los dos casos se usar la tcnica de barrido. Desarrollar programas en forma modular usando subrutinas. 3. PREPARATORIO:

Se debe modificar el hardware de la prctica anterior, de manera que los datos a ser ingresados al microcontrolador no provengan de interruptores, sino de un teclado matricial. Mantener todo el hardware asociado al barrido de display. Se deben realizar las siguientes modificaciones: o 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, *, =, BORRAR; las otras teclas quedarn sin funcin. El funcionamiento de esta rutina ser de la siguiente manera: conforme se vayan aplastando las teclas de nmeros, stos deben ir apareciendo el 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 ingresado el primer operando se debe presionar la tecla de multiplicacin (*) y luego el segundo operando de hasta dos dgitos (de manera similar al primer operando), luego se presiona el igual (=), y en los 4 display se debe mostrar el resultado de la operacin. 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 de la operacin anterior, se muestra 0000 y se vuelve a iniciar con el ingreso del primer operando. o Al final se muestra un circuito sugerido para el barrido de teclado. Las resistencias se deben poner a fin de evitar cortocircuitos que pueden ocurrir a las salidas del micro controlador cuando se presionan dos teclas simultneamente. Los diodos son optativos, y se colocan si se desea manejar el teclado por medio de una interrupcin. o Mientras dura el ingreso de cada uno de los nmeros en BCD desde el teclado, stos deben ser almacenados en cuatro localidades consecutivas llamadas DIG3, DIG2, DIG1, y DIG0. desde donde los tomar la subrutina de barrido de display para mostrarlos. Luego esta rutina de barrido de display tambin se usar para mostrar el resultado. o Para la rutina de barrido de teclado se debe tomar precaucin con el rebote de las teclas; y tambin considerar el caso de que se mantenga presionado durante mucho tiempo una tecla debe ser reconocida como una sola pulsacin, hasta que se libere la tecla. o El algoritmo para convertir de BCD a su equivalente en 7 segmentos debe ser modificado para que pueda ser llamado como una subrutina. Se deben tomar las precauciones para que esta rutina no modifique registros que puedan estar siendo utilizados en el programa principal, por lo que se pueden salvar en el STACK los registros que se piense usar en la subrutina, y antes de retornar al programa principal se los puede recuperar del STACK y volverlos a sus valores originales. o El algoritmo de barrido de display debe ser modificado para que pueda ser llamado como una subrutina, debe tomar los datos a mostrar desde la memoria SRAM desde cuatro localidades consecutivas. Tambin tomar las precauciones necesarias para que no se modifiquen registros del programa principal. /* * barrido_teclado.asm * * Created: 20/04/2014 5:36:24 * Author: Nathy */ .include "m164pdef.inc" ;definicion de variables .def teclado=r16 .def bandera=r17 .def display=r18 .def tempo=r19 .def contador=r20 .def conver=r21 .def tempo1=r22

.def aux=r23 .def AUX1=r24 .def AUX2=r25 .dseg BINARIO: .BYTE 2 BCD0: .BYTE 4 DIG0: .BYTE 4 DATOS: .BYTE 4 .cseg .org 0x0 ;configuracion de puertos ldi r16,255;cargo unos al registro r16 out ddra,r16;con esto defino puerto b como salida ldi r16,0b00001111; cargo al puerto b como entrada y salida esto porque ah ir el teclado out ddrb,r16;se enva datos para testear mi teclado y a la vez recibir los datos de las pulsaciones ;bits de control LDI tempo,0b00001111 OUT DDRC,tempo ;inicializo mi stack pointer ldi r16,high(ramend) out sph,r16 ldi r16,low(ramend) out spl,r16 ;para activar el pull up ldi r16,255 out porta,r16 ;pongo todas las salidas de la a1-a4 en 0L ldi r18,0b00000000 out portb,r18 ; RUTINA DEL BARRIDO DE TECLADO main: rcall testear cpi bandera,1 brne main MULTIPLICACION: call BCD_7SEG call BARRIDO lds teclado,BCD0 ldi AUX,10 mul teclado,AUX mov AUX1,R0 lds teclado,BCD0+1 add AUX1,teclado ;AUX1 PRIMER NUMERO A MULTIPLICAR lds teclado,BCD0+2 mul teclado,AUX mov AUX2,R0 lds teclado,BCD0+3 add AUX2,teclado ;AUX2 SEGUNDO NUMERO A MULTIPLICAR ;LA MULTIPLICACION SERIA: mul AUX1,AUX2 sts BINARIO, R0 sts BINARIO+1,R1 call BIN_BCD call BCD_7SEG call BARRIDO ldi bandera,0 ldi r18,0b00000000 out portb,r18 mantener: in r18,pinb

andi r18,0b11110000 cpi r18,0b11110000 brne mantener rcall RET_BARRIDO rjmp main ;en esta subrutina se busaca si alguna tecla fue presionada ;esta realizando un senso de las filas si una esta activada ;entonces va a buscar cual es la tecla presionada testear: sbis pinb,7 rcall buscar sbis pinb,6 rcall buscar sbis pinb,5 rcall buscar sbis pinb,4 rcall buscar ret ;SUBRUTINA DE BARRIDO DE TECLADO ;ahora reviso la columnas con la subrutina buscar para establecer que teclas se precion ;y le asigno un valor a cada letra q se presione en el teclado buscar: rcall RET_BARRIDO ;este retardo lo desarrollopara posibles rebotes ;pongo en cero a la cuarta columna que es a la que voy a revisar si tiene o no una tecla presionada ldi r18,0b00000111 out portb,r18 ;reviso de tecla en tecla cual esta presionada sbis pinb,7;testeamos la cuarta fila de la cuarta columna ldi teclado,13; se asigna a la tecla un nombre y en hexadecimal es la "D" sbis pinb,6 ldi teclado,12 sbis pinb,5 ldi teclado,11 sbis pinb,4 ldi teclado,10 ;pongo en cero la tercera columna y busco si se presiono alguna tecla ldi r18,0b00001011 out portb,r18 sbis pinb,7 ldi teclado,14 sbis pinb,6 ldi teclado,3 sbis pinb,5 ldi teclado,6 sbis pinb,4 ldi teclado,9 ;pongo en cero la segunda columna y busco sis e presiono alguna tecla ldi r18,0b00001101 out portb,r18 sbis pinb,7 ldi teclado,0 sbis pinb,6 ldi teclado,2 sbis pinb,5 ldi teclado,5 sbis pinb,4 ldi teclado,8 ;pongo en cero la primera columna y busco si presiono alguna tecla ldi r18,0b00001110 out portb,r18

sbis pinb,7 ldi teclado,15 sbis pinb,6 ldi teclado,1 sbis pinb,5 ldi teclado,4 sbis pinb,4 ldi teclado,7 ldi bandera,1 ret ; Subrutina de Binario a BCD para 16 bits BIN_BCD: PUSH r16 PUSH r17 PUSH r18 PUSH r19 LDS r16,BINARIO LDS r18,BINARIO+1 CLR r17 BIN_BCD_0: SUBI r16,232 SBCI r18,3 BRCS BIN_BCD_CEN INC r17 RJMP BIN_BCD_0 BIN_BCD_CEN:LDI r19,232 ADD r16,r19 LDI r19,3 ADC r18,r19 STS BCD0+3,r17 CLR r17 BIN_BCD_1: SUBI r16,100 SBCI r18,0 BRCS BIN_BCD_DEC INC r17 RJMP BIN_BCD_1 BIN_BCD_DEC:SUBI r16,-100 STS BCD0+2,r17 CLR r17 BIN_BCD_2: SUBI r16,10 BRCS BIN_BCD_UNI INC r17 RJMP BIN_BCD_2 BIN_BCD_UNI:SUBI r16,-10 STS BCD0+1,r17 STS BCD0,r16 POP r19 POP r18 POP r17 POP r16 RET ;rutina para convertir 4 digitos decimales a 7 segmentos(display) y almacenarlos en la sram BCD_7SEG: PUSH ZH PUSH ZL PUSH YH PUSH YL PUSH XH PUSH XL PUSH r16 PUSH r17

LDI LDI LDI LDI LDI BCD_7SEG_0: LDI LDI LD ADD CLR ADC LPM ST DEC BRNE POP POP POP POP POP POP POP POP RET ;Subrutina de Barrido BARRIDO: PUSH PUSH PUSH PUSH PUSH LDI LDI LDI LDI BARRIDO_0: LDI OUT LD OUT OUT CALL SEC ROL DEC BRNE LDI OUT RET BARRIDO1: PUSH PUSH PUSH PUSH PUSH LDI LDI LDI LDI BARRIDO_1: LDI OUT

XH,HIGH(BCD0) XL,LOW(BCD0) YH,HIGH(DIG0) YL,LOW(DIG0) r17,4 ZH,HIGH(Tabla_BCD_7SEG<<1) ZL,LOW(Tabla_BCD_7SEG<<1) r16,X+ ZL,r16 r16 ZH,r16 r16,Z Y+,r16 r17 BCD_7SEG_0 r17 r16 XL XH YL YH ZL ZH

r16 r17 YH YL r18 r17,4 r18,0b11111110 YH,HIGH(DIG0) YL,LOW(DIG0) r16,0b11111111 PORTC,r16 r16,Y+ PORTA,r16 PORTC,r18 RET_BARRIDO r18 r17 BARRIDO_0 r16,0b11111111 PORTC,r16

r16 r17 YH YL r18 r17,4 r18,0b11111110 YH,HIGH(DATOS) YL,LOW(DATOS) r16,0b11111111 PORTC,r16

LD r16,Y+ OUT PORTA,r16 OUT PORTC,r18 CALL RET_BARRIDO SEC ROL r18 DEC r17 BRNE BARRIDO_1 LDI r16,0b11111111 OUT PORTC,r16 RET ;Retardo de Barrido RET_BARRIDO: LDI r16,100 RET_BARRIDO_0: NOP DEC r16 BRNE RET_BARRIDO_0 RET Tabla_BCD_7SEG: .db 0b01000000,0b01111001 ;0,1 .db 0b00100100,0b00110000 ;2,3 .db 0b00011001,0b00010010 ;4,5 .db 0b00000010,0b01111000 ;6,7 .db 0b00000000,0b00010000 ;8,9 .db 0b00001000,0b00000011 ; (10)A,B(11) .db 0b01000110,0b00100001 ; (12)C,D(13) .db 0b00000110,0b00001110 ; (14)E,F(15)

7 4 1
ON C
1

8 5 2 0
2

9 6 3 =
3

+
4

R? R? 100R R? 100R R6 100R R7 100R R3 100R R4 100R R5


100R 100R

Reset
40 41 42 43 44 1 2 3 9 10 11 12 13 14 15 16 29 27 4 PB0/T0/XCK0/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
Reset

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 19 20 21 22 23 24 25 26 7 8

A1 A2 A3 A4 A5 A6 A7

R1
1.5k

C1 C2 C3 C4

R2
200 Reset

U2
A1 A2 A3 A4 A5 A6 A7 1 2 3 4 5 6 7 1B 2B 3B 4B 5B 6B 7B COM 1C 2C 3C 4C 5C 6C 7C

U2(COM) 9 16 15 14 13 12 11 10 A B C D E F G

A B C D E F G

A B C D E F G R42(1)

A B C D E F G

A B C D E F G

ULN2003A

R8 R30 R29 R28 R27 R26 R24


100R 100R 100R 100R 100R 100R 100R R24(1)

R41
1k

R42
1k

R43
1k

R44
1k

R31
C4 1k

Q1
2N3904 C3

R32
1k

Q2
2N3904 C2

R33
1k

Q3
2N3904 C1

R34
1k

Q4
2N3904

Construya el circuito diseado, el mismo que deber ser llevado al laboratorio el da de la prctica. Realice un modelo de simulacin en proteus del circuito pedido y pruebe el funcionamiento de todos los programas solicitados.

4. BIBLIOGRAFA:

ATMEL, 8-bit AVR Instruction Set, ATmega164p. Ana Rodrguez, Sistemas Microprocesados, Apuntes de clase, 2014, EPN. Jaime Velarde, Sistemas Digitales, Apuntes de clase, 2013, EPN.