Vous êtes sur la page 1sur 6

Aplicación del microcontrolador ATmega 164p en modo extendido

(Código en assembler)

.include "m164pdef.inc"
.def puerto=r16
.def dato=r17
.def centena=r18
.def decena=r19
.def unidad=r20
.def aux=r21
.def pulsador=r22

.dseg
num: .byte 1

.cseg

ldi dato,high(ramend) ;habilitación del stack pointer


out sph,dato
ldi dato,low(ramend)
out spl,dato
ser puerto
clr dato
out ddra,dato
out ddrc,dato ;puertos que no son usados como
entradas
out ddrd,puerto ;puerto de control como salida
out porta,puerto
out portc,puerto
out portd,dato
ser dato
sts num,dato
sts num+1,dato
inicio:

call conmutación ;se asigna un valor de 0 o 1 al


registro pulsador
ldi dato,0b00000000 ;código (ABC=000) para leer datos del
dip-switch
out portd,dato
call config_entrada ;puerto b como entrada
in dato,pinb ;datos del dip-switch
sts num,dato ;almaceno el dato leido en num
sts num+1,dato ;almaceno el dato leido en num+1
call conver_BCD ;convertir el dato a BCD de tres
cifras
mov dato,centena ;convertir centenas a BCD 7segmentos
call siete_seg
mov centena,dato
mov dato,decena ;convertir decenas a BCD 7segmentos
call siete_seg
mov decena,dato
mov dato,unidad ;convertir unidades a BCD 7segmentos
call siete_seg
mov unidad,dato
cpi pulsador,1 ;selección de visualización
brne selec_leds
call activar_displays ;ir a visualizar displays
rjmp inicio
selec_leds:

call activar_leds ;ir a visualizar leds


rjmp inicio

;****************Activación de diplays********************************

activar_displays:

call leer_num1
ldi xh,high(num+2) ;leer el dato almacenado en num+2
ldi xl,low(num+2)
ld puerto,x
cp dato,puerto ;comparar los datos leidos
brne continuar ;si son iguales continuar terminar
subrutina
ret
continuar:

call config_salida ;configurar puerto b como salida


ldi dato,0b00000100 ;apagar leds
out portd,dato
clr dato
out portb,dato
ldi dato,0b00000001 ;código (ABC=001) para activar el
display 1
out portd,dato
out portb,centena
ldi dato,0b00000010 ;código (ABC=010) para activar el
display 2
out portd,dato
out portb,decena
ldi dato,0b00000011 ;código (ABC=011) para activar el
display 3
out portd,dato
out portb,unidad
call leer_num1 ;leer dato almacenado en num
sts num+2,dato ;enviar el dato leido a num+2
clr dato ;encerar dato
sts num+3,dato ;enviar 0 a num+3
ret

;********************Activación de Leds****************************

activar_leds:

call leer_num ;leer el número almacenado en num


ldi xh,high(num+3)
ldi xl,low(num+3)
ld puerto,x ;leer el número almacenado en num+3
cp dato,puerto ;comparar los números
brne continuar_1 ;si son iguales terminar subrutina
ret
continuar_1:

call config_salida
ldi dato,0b00000001 ;código (ABC=001) para activar el
display 1
out portd,dato
ser aux
out portb,aux ;apagar diaplay 1
ldi dato,0b00000010 ;código (ABC=010) para activar el
display 2
out portd,dato
out portb,aux ;apagar display 2
ldi dato,0b00000011 ;código (ABC=011) para activar el
display 3
out portd,dato
out portb,aux ;apagar display 3
ldi dato,0b00000100 ;código (ABC=100) para activar los
leds
out portd,dato
call leer_num ;leer el dato ingresado
out portb,dato ;visualizar en los leds
sts num+3,dato ;almacenar el dato en num+3
clr dato ;poner cero en dato
sts num+2,dato ;almacenar en num+2
ret
;********************* Subrutinas de E/S ************************

config_entrada:

ser dato ;poner dato en $FF


clr puerto ;poner puerto en $00
out ddrb,puerto ;activar puerto b como entrada
out portb,dato
ret
config_salida:

ser puerto ;poner puerto en $00


clr dato ;poner dato en $FF
out ddrb,puerto ;activar puerto b como salida
out portb,dato
ret

;***************** Transformación a BCD *************************

conver_BCD:

clr centena ;poner centena en $00


clr decena ;poner decena en $00
clr unidad ;poner unidad en $00
cpi dato,0 ;comparar dato,0
breq cero ;si es igual a 0 dip-switch apagado
cpi dato,100 ;compara dato con 100
brsh centenas ;si es mayor de 100 ir a centenas
rjmp decenas ;si es menor ir a decenas
centenas:

subi dato,100 ;restar 100 de dato


inc centena ;incrementar centena
cpi dato,100 ;comparar dato con 100
brsh centenas ;si es mayor volver a retar 100
decenas:
cpi dato,10 ;comparar con 10
brlo unidades ;si es menor de 10 ir a unidades
subi dato,10 ;restar 10 de dato
inc decena ;incrementar decena
cpi dato,10 ;comparar dato con 10
brsh decenas ;si es mayor de 10 volver a restar 10
unidades:

cpi dato,1 ;comparar dato con 1


brlo salir ;si es menor terminar subrutina
subi dato,1 ;si es mayor restar 1 de dato
inc unidad ;incrementar unidad en 1
cpi dato,1 ;comparar dato con 1
brsh unidades ;si es mayor volver a restar 1
salir:

ret
cero:

clr centena ;si dato es cero poner cero en unidad,


decena y centena
clr decena
clr unidad
ret

;****************** Conversión a Siete segmentos *******************

siete_seg:

ldi zh,high(tabla<<1) ;buscar la dirección que apunta tabla


en la memoria flash
ldi zl,low(tabla<<1)
andi dato,0b00001111 ;seleccionar los cuatro bits menos
significativos de dato
add zl,dato ;sumar este número a los bits menos
significativos de la
;dirección apuntada por tabla
clr dato ;poner dato en cero
adc zh,dato ;sumar cero a los bits más
significativos de la
; dirección apuntada por tabla
lpm dato,z ;poner la información de la dirección
de z en dato
ret
tabla:

.db 0b11000000, 0b11111001 ;0 en 7_seg, 1 en 7_seg almacenados en


la memoria flash
.db 0b10100100, 0b10110000 ;2 en 7_seg, 3 en 7_seg almacenados en
la memoria flash
.db 0b10011001, 0b10010010 ;4 en 7_seg, 5 en 7_seg almacenados en
la memoria flash
.db 0b10000010, 0b11111000 ;6 en 7_seg, 7 en 7_seg almacenados en
la memoria flash
.db 0b10000000, 0b10010000 ;8 en 7_seg, 9 en 7_seg almacenados en
la memoria flash

;**************************retardo********************************
conmutacion:

ldi dato,0b00000101 ;activar el pulsador


out portd,dato
call config_entrada ;configurar el puerto b como entrada
call retardo ;hacer un retardo para sensar el
pulsador
andi dato,0b00000001 ;aislar el bit 0 del puerto b
cpi dato,1 ;comparar dato con 1
brne comparar ;si no es igual cambiar pulsador a 0 o 1
ret ;si es igual a 1 no se a activado el
pulsador
comparar:

cpi pulsador,1 ;comparación de pulsador para poner en 0 o 1


breq leds
displays:

inc pulsador ;si pulsador es 0 cambiar a 1


ret
leds:

dec pulsador ;si pulsador es 1 cambiar a 0


ret

;**********************retardo para el pulsador*********************

retardo:

ldi aux,255 ;poner aux en $FF


lazo_1:

ldi puerto,255 ;poner puerto en $FF


lazo:

in dato,pinb ;detectar si pulsador a sido


presionado
dec puerto ;decrementar puerto
brne lazo ;contar hasta llegar a 0
dec aux ;decrementar aux
brne lazo_1 ;contar hasta llegar a 0
ret

;***********************leer dato****************************

leer_num1:

ldi xh,high(num+1) ;leer el dato almacenado en num+1


ldi xl,low(num+1)
ld dato,x
ret
leer_num:

ldi xh,high(num) ;leer el dato almacenado en num


ldi xl,low(num)
ld dato,x
ret

Vous aimerez peut-être aussi