









Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Este documento contiene el código Assembly de un programa que permite ingresar dos números y realizar las operaciones básicas de suma y resta. El programa utiliza un microcontrolador AVR y se basa en la lectura de teclas del teclado numérico para ingresar los números y la tecla '=' para indicar la operación a realizar. El resultado se muestra en un display de siete segmentos.
Tipo: Ejercicios
1 / 15
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!










.def tempo = R .def cont = R .def num1 = R .def num2 = R .def opera = R .def resultado = R .def ante = R .dseg TECLA: .BYTE 1 BCD3: .BYTE 1 BCD2: .BYTE 1 BCD1: .BYTE 1 BCD0: .BYTE 1 DIG3: .BYTE 1 DIG2: .BYTE 1 DIG1: .BYTE 1 DIG0: .BYTE 1 BINARIO: .BYTE 1 .cseg ;configuracion de entradas y salidas ldi tempo, 0b0000_ out DDRB, tempo ;PORTB no se usa ldi tempo, 0b0111_ out DDRC, tempo ;C6:C0 son salidas (7 segmentos) ldi tempo, 0b0000_ out DDRD, tempo ;D3:D0 son salidas (digitos) ldi tempo, 0b0000_1111 ;A3:0 salidas para escoger las columnas, A7:4 entradas para filas out DDRA, tempo ldi tempo, 0b1111_ out PORTA, tempo ;no se escoge nada ldi tempo, 0b1111_ out PORTB, tempo ldi tempo, 0b1000_ out PORTC, tempo ldi tempo, 0b1111_ out PORTD, tempo in tempo, MCUCR andi tempo, 0b1110_ out MCUCR, tempo ldi ante, 10 sts TECLA, ante ;programa: lazo_principal: ;ingreso el primer numero: rcall INGRESAR_NUM rcall INGRESAR_OPERACION rcall INGRESAR_NUM PRESIONA_IGUAL: rcall BORRAR_TODO rcall BCD_7SEG_ rcall BARRIDO_DISPLAY
rcall BARRIDO_TECLADO lds tempo, TECLA cpi tempo, '=' brne PRESIONA_IGUAL cpi opera, '+' breq SUMAR ;si opera = '+' brne RESTAR SUMAR: mov resultado, num add resultado, num sts binario, resultado ;guarda en "BINARIO" la respuesta ldi tempo, 10 sts BCD3, tempo ;primer digito apagado rcall BIN_BCD_ rcall PRESIONA_BORRAR ;sigue aqui hasta que se presione BORRAR rjmp lazo_principal RESTAR: mov resultado, num sub resultado, num brcs resultado_negativo sts binario, resultado ;guarda en "BINARIO" la respuesta ldi tempo, 10 sts BCD3, tempo ;primer digito apagado rcall BIN_BCD_ rcall PRESIONA_BORRAR ;siguie aqui hasta que se presione BORRAR rjmp lazo_principal resultado_negativo: neg resultado ;se guarda el valor absoluto del resultado sts binario, resultado ;guarda en "BINARIO" la respuesta ldi tempo, 11 sts BCD3, tempo ;primer digito '-' rcall BIN_BCD_ rcall PRESIONA_BORRAR ;siguie aqui hasta que se presione BORRAR rjmp lazo_principal ;------------------------------------------------------------------------------------- BORRAR_TODO: rcall BCD_7SEG_ rcall BARRIDO_DISPLAY rcall BARRIDO_TECLADO lds tempo, TECLA cpi tempo, 'b' breq lazo_principal ret ;------------------------------------------------------------------------------------- PRESIONA_BORRAR: rcall BORRAR_TODO rcall BCD_7SEG_ rcall BARRIDO_DISPLAY rcall BARRIDO_TECLADO lds tempo, TECLA cpi tempo, 'b' brne PRESIONA_BORRAR ret ;------------------------------------------------------------------------------------- INGRESAR_NUM1: push tempo in tempo, SREG push tempo push cont push XH push XL LAZO_INGRESAR_NUM1:
cpi tempo, '=' breq LAZO_OPERACION ;si la tecla presionada es = se regresa a leer el teclado cpi tempo, 'b' breq LAZO_OPERACION cpi tempo, 10 breq LAZO_OPERACION ;si logra llegar hasta tan lejos la tecla presionada es + o - , entonces: mov opera, tempo pop cont pop tempo out SREG, tempo pop tempo ret ;------------------------------------------------------------------------------------- INGRESAR_NUM2: push tempo in tempo, SREG push tempo push cont push XH push XL LAZO_INGRESAR_NUM2: rcall BORRAR_TODO rcall BORRAR rcall BCD_7SEG_ rcall BARRIDO_DISPLAY ldi num2, 0 ldi XH, HIGH(BCD2) ldi XL, LOW(BCD2) ;apunto a BCD ldi cont, 3 lazo_num2: rcall INGRESO_NUMERO lds tempo, TECLA ;guardo en tempo el valor de la tecla presionada cpi tempo, 'b' breq LAZO_INGRESAR_NUM2 ;si la tecla presionada es BORRAR st X+, tempo ;se guarda en el correspondiente BCD2:0 el valor ingresado dec cont brne lazo_num rcall VERIFICAR_127 ;devuelve en tempo el valor de 1 si es mayor a 127 y 0 si no es cpi tempo, 1 breq LAZO_INGRESAR_NUM2 ;si es mayor a 127 vuelve a hacer todo ;toca guardar el valor de num ;X apunta a lo que viene despues de BCD0 entonces puedo hacer pre decrementos: ld tempo, - X add num2, tempo ;guarda unidades ld tempo, - X ldi cont, 10 mul cont, tempo mov tempo, R add num2, tempo ;guarda decenas ld tempo, - X ldi cont, 100 mul cont, tempo mov tempo, R add num2, tempo ;guarda centenas pop XL pop XH pop cont
pop tempo out SREG, tempo pop tempo ret ;---------------------------------------------------------------------------------- BORRAR: push tempo in tempo, SREG push tempo push cont ldi tempo, 10 ldi XH, HIGH(BCD3) ldi XL, LOW(BCD3) st X+, tempo ;guarda en BCD3 10 que corresponde al display apagado ldi cont, 3 ldi tempo, 0 lazo_borrar: st X+, tempo ;se guarda 0 en X dec cont brne lazo_borrar pop cont pop tempo out SREG, tempo pop tempo ret ;regresa luego de borrar todo ;---------------------------------------------------------------------- INGRESO_NUMERO: push tempo in tempo, SREG push tempo LAZO_INGRESO_NUMERO: rcall BCD_7SEG_ rcall BARRIDO_DISPLAY rcall BARRIDO_TECLADO lds tempo, TECLA cp tempo, ante breq LAZO_INGRESO_NUMERO lds ante, TECLA cpi tempo, '+' breq LAZO_INGRESO_NUMERO ;si la tecla presionada es + vuelve a leer cpi tempo, '-' breq LAZO_INGRESO_NUMERO ;si la tecla presionada es - vuelve a leer cpi tempo, '=' breq LAZO_INGRESO_NUMERO ;si la tecla presionada es = vuelve a leer cpi tempo, 10 breq LAZO_INGRESO_NUMERO ;si no se presiona ninguna tecla vuelve a leer ;si la tecla presionada es un numero o BORRAR se almacena en tempo pop tempo out SREG, tempo pop tempo ret ;--------------------------------------------------------------------- VERIFICAR_127: push XH push XL ldi XH, HIGH(BCD2) ldi XL, LOW(BCD2) ld tempo, X+ ;verifica centenas cpi tempo, 1 breq VERIFICAR_127_DECENAS ;si centenas = 1 hay que verificar el siguiente brcc MAYOR_ rjmp MENIGU_
add R20, R19 ;tecla tiene un valor entre 0 y 15 (tecla=4F+C) que corresponde a lo que dice en TABLA_TECLAS ;se convierte al caracter correspondiente ldi ZH, HIGH(TABLA_TECLAS<<1)
add ZL, R clr R adc ZH, R20 ;se suman los MSB con 0 y C lpm R20, Z ;almacena en "tecla" el numero u operación correspondiente sts TECLA, R20 ;se guarda en TECLA el caracter correspondiente pop R pop R pop R pop R pop R out SREG, R pop R ret ;solo sale de la subrutina cuando se haya presionado alguna tecla NO_TECLA: ldi R20, 10 sts TECLA, R pop R pop R pop R pop R pop R out SREG, R pop R ret TABLA_TECLAS: .DB 10, 2, 3, '+' .DB 1, 5, 6, '-' .DB 4, 8, 9, '=' .DB 7, 0, 10, 'b' ;10 = no tiene funcion, 'b' = borrar ;--------------------------------------------------------------------------------- BCD_7SEG_4: push R in R16, SREG push R push R push XH push XL push YH push YL push ZH push ZL ;X y Y apuntan a los numeros mas significativos pero en el lazo se disminuye ;hasta llegar al primero. Por eso R17 es 4 inicialmente ldi XH, HIGH(BCD3) ;con el puntero X se extrae la informacion en BCD3: ldi XL, LOW(BCD3) ldi YH, HIGH(DIG3) ;con el puntero Y se almacenan las conversiones en DIG3: ldi YL, LOW(DIG3) ldi R17, 4 ;contador (para los 4 digitos) LAZO_BCD_7SEG_4: ldi ZH, HIGH(TABLA_BCD_7SEG<<1) ldi ZL, LOW(TABLA_BCD_7SEG<<1) ld R16, X+ add ZL, R clr R adc ZH, R lpm R16, Z st Y+, R dec R brne LAZO_BCD_7SEG_ pop ZL pop ZH pop YL
lds R16, binario clr R BIN_BCD_3_CENTENAS: subi R16, 100 brcs BIN_BCD_3_DECENAS ;cuando sea negativo acabo centenas va a decenas inc R rjmp BIN_BCD_3_CENTENAS BIN_BCD_3_DECENAS: sts BCD2, R17 ;guarda en BCD2 el valor de centenas subi R16, - 100 ;se restaura el valor para empezar a restar 10 clr R BIN_BCD_DEC_1: subi R16, 10 brcs BIN_BCD_3_UNIDADES inc R rjmp BIN_BCD_DEC_1 ;REVISAR ESTA PARTE BIN_BCD_3_UNIDADES: sts BCD1, R17 ;se guarda el valor de las decenas subi R16, - 10 sts BCD0, R16 ;se guarda el valor de las unidades pop R17 ;restaurar todo pop R out SREG, R pop R ret ;fin