Está en la página 1de 2

DISPLAY BINARIO BCD 2 DIGITOS out PORTC,aux IF2: brne ELSE2

rjmp Inicio ; DESPLEGAR DECENAS inc contador


Inicio: mov aux,decenas ldi s1,0
ser R16 rcall Mostrar rcall bocina
clr R17 out PORTA,aux rjmp NEXT2
out DDRB,R16 ; Puerto B como salida ldi aux, 0b00000010 ELSE2:
out DDRD,R16 ; Puerto D como salida out PORTC,aux ldi s2,1
out DDRC,R17 ; Puerto C como entrada rcall delay NEXT2: ; Cotinua con
lazo: in R4,PINC ; Leo el puerto C clr aux el código
rcall Mostrar out PORTC,aux rcall mostrar
rjmp lazo ;DESPLEGAR CENTENAS // recupero estado
mostrar: mov aux,centenas pop r16
mov R18,R4 rcall Mostrar out sreg,r16
andi R18,$0F ; Extrae 4 bit out PORTA,aux pop r16
mov R6,R18 ; guardar en R6 4 bits bajos ldi aux, 0b00000001 // finalizacion recuperacion de estado
mov R18,R4 out PORTC,aux reti
swap R18 rcall delay bocina:
andi R18,$0F clr aux ldi sound,255
mov R7,R18 out PORTC,aux out porta,sound
ldi ZH,high(tabla<<1) ; Carga puntero Z dirección de tabla rjmp lazo rcall retardo0
ldi ZL,low(tabla<<1) mostrar: ldi sound, 0
add ZL,R6 ldi ZH,high(tabla<<1) ; Craga puntero Z direccion de tabla ret
lpm R8,z ldi ZL,low(tabla<<1)
ldi ZH,high(tabla<<1) ; Carga puntero Z dirección de tabla add ZL,aux retardo0: ldi tempo, 255; a
ldi ZL,low(tabla<<1) lpm aux,z retardo1: ldi tempo1,255; b
add ZL,R7 ret retardo2: dec tempo1
lpm R9,z ; Lee de la Tabla brne retardo2
out PORTB,R8 ; escribe unidad BinBCD: dec tempo
out PORTD,R9 ; escribe decenas lazo1: ; resto 100 para centenas brne retardo1
ret ldi aux,100 ret
tabla: sub dato,aux ;(3b+3) a+4=#cm
.db $40,$79,$24,$30,$19,$12,$2,$78,$0,$18,$8,$3,$46,$21,$6,$0E brcs bin_bcd2 ; salta si hay carry mostrar:
DISPLAY BINARIO BCD 3 DIGITOS inc centenas mov R18,contador
.def aux=r16 rjmp lazo1 andi R18,$0F ; Extrae 4 bit
.def dato=r17 bin_bcd2: mov R6,R18 ; guardar en R6 4 bits bajos
.def unidades=r18 add dato, aux mov R18,contador
.def decenas = r19 lazo2: ; resto 10 para decenas swap R18
.def centenas = r20 ldi aux,10 andi R18,$0F
rjmp Inicio sub dato,aux mov R7,R18
Inicio: brcs bin_bcd3 ldi ZH,high(tabla<<1)
;configuracion de puertos inc decenas ldi ZL,low(tabla<<1)
ldi aux,0b0000_0000; configuro como entrada pull - up puerto B rjmp lazo2 add ZL,R6
out DDRB,aux bin_bcd3: lpm R8,z
ldi aux,0b1111_1111 add dato, aux out PORTA,R8 ; suma puerto
out PORTB,aux lazo3: ; lo que sobra son unidades ret
; configuro como salida puerto A,C,D mov unidades,dato tabla:
.db $40,$79,$24,$30,$19,$12,$2,$78,$0,$18,$8,$3,$46,$21,$6,$0E
ldi aux,0b0111_1111 Ret
out DDRA,aux INTERRUPCIONES CAMBIO DE ESTADO
out DDRC,aux Delay: ; Para una frecuencia de 300Hz y barrido de tres .def tempo = r16
out DDRD,aux displays, el tiempo en ON en cada uno sería de 1.1ms = .def contaa = r17
ldi aux,0b0000_0000 1100CM .def contab = r18
out PORTA,aux ldi tempo,60 ; reemplazar Tempo=tempo1=255 para observar .def ant = r19
out PORTC,aux de mejor forma la tecnica de barrido .cseg
out PORTD,aux ldi tempo1,6 .org 0x00 ; direccion del vector de interrupcion RESET
Delay1: rjmp inicio ; salta a etiqueta inicio
dec tempo .org 0x08 ; direccion de la interrupcion por cambio PCINT 0
lazo:
brne Delay1; hasta que la bandera Z=1 rjmp interrup ; salta a interrup cuando detecta la interrupcion
clr unidades ; encero registros
ldi tempo, 60; reemplazar tempo=255 para observar de mejor inicio:
clr decenas
forma la técnica de barrido //configuro el puerto A como entrada y salidas
clr centenas ldi tempo,0b11000000
dec tempo1
in dato,PINB ; leo el puerto out ddra,tempo
brne Delay1
rcall BinBCD ; llamo conversion Binario BCD ldi tempo,0b00000011
ret
mov aux,unidades out porta,tempo
rcall Mostrar ; conversion a 7 segmentos ldi tempo, 0b1111_1111
tabla:
out PORTD,aux out portb,tempo
.db
mov aux,decenas 0b0111111,0b0000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111100,0b00000111,0b01111111,0 // configuro el pud para el pull up
rcall Mostrar b01100111 in tempo,mcucr
out PORTC,aux TALLER 3 andi tempo,0b11101111
mov aux,centenas .def tempo = r16 out mcucr,tempo
rcall Mostrar .def contador = r17 //configuro el stack pointer
out PORTA,aux .def s1 = r19 ldi tempo,high(ramend)
rjmp lazo .def s2 = r20 out sph,tempo
.def sound = r21 ldi tempo,low(ramend)
.def tempo1 = r22 out spl,tempo
mostrar: 1
ldi ZH,high(tabla<<1) ; Carga puntero Z direccion de tabla
// Direcciono las interrupciones reset - interrupcion externa //configuro las interrupciones
.org 0x0 ldi tempo,0b00000001
ldi ZL,low(tabla<<1) rjmp inicio
add ZL,aux sts pcicr,tempo
.org 0x2 ldi tempo,0b00000011
lpm aux,z
rjmp sensor1 sts pcmsk0,tempo
ret
.org 0x4 ldi tempo,0b00000010 ;activa la bandera
BinBCD: rjmp sensor2
lazo1: ; resto 100 para centenas out pcifr,tempo ; z
ldi aux,100 sei ;activa interrupciones
// inicio del programa in ant,pina ;se lee el estado del puerto A
sub dato,aux inicio:
brcs bin_bcd2 ; salta si hay carry ldi contaa,0
ldi tempo,0b0000_0000; Para configurar puerto ldi contab,0
inc centenas out DDRD ,tempo ; Puerto D como entrada
rjmp lazo1 lazo:
out PORTA,tempo ; Salida a 0L puerto A rjmp lazo ; lazo infinito
bin_bcd2: ldi tempo,0b1111_1111
add dato, aux out DDRA ,tempo ; Configuro puerto como salida // subrutina donde se realiza el analisis y deteccion de la interrupcion
lazo2: ; resto 10 para decenas interrup:
out PORTD,tempo ; entrada como pull up
ldi aux,10 push r16 ; se salva el estado con esto
sub dato,aux ; pud en cero in r16,sreg ; n ose tiene problemas con
brcs bin_bcd3 in tempo,mcucr push r16 ; el sreg
inc decenas in r16,pina ; leo el puerto A
andi tempo,0b11101111
rjmp lazo2 out mcucr,tempo eor r16,ant ; realizo una eor para q ver q cambio con el registro ant
bin_bcd3: clr contador ; contador a cero in ant,pina ;leo el puerto A y guardo en ant
add dato, aux sbrc r16,0;compruebo si cambio el bit 0 del r16
lazo3: ; lo que sobra son unidades ; inicializacion del stack pointer necesario para interrupciones rcall usuarioA ; si cambio llamo a usuarioA
mov unidades,dato ldi tempo,high(ramend) sbrc r16,1 ;compruebo si cambio el bit 1 del r16
Ret out sph,tempo rcall usuarioB ; si cambio llamo a usuarioB
tabla: ldi tempo,low(ramend) pop r16
.db $40,$79,$24,$30,$19,$12,$2,$78,$0,$10 out spl,tempo out sreg,r16
BARRIDO DE DISPLAY pop r16
.def aux=r16 ;configuracion de interrupciones reti ;regresa de nuevo a lazo infinito
.def dato=r17 cli ; Deshabilita interrupciones globales //si el pulsador A es presionado ejecuta estas lineas
.def unidades=r18 ldi tempo,0b00000010 ;int0 por flanco de bajada usuarioA:
.def decenas = r19 sts eicra,tempo out portb,contaa
.def centenas = r20 ldi tempo,0b00000011; Habilito Interrupción inc contaa ;incrementa el contador A
.def tempo=r21 out eimsk,tempo cpi contaa,5 ;compara si ya llego a 5
.def tempo1=r22 sei ; sreg se pone en 1 activacion de interrupciones breq ledA ;si llego a 5 salta a ledA
rjmp Inicio ldi tempo, 0b01000000 escA:
Inicio: out PORTA,tempo ret ;retorna
;configuracion de puertos lazo: rjmp lazo ledA:
ldi aux,0b0000_0000 ; configuro como entrada pull - up puerto B sbi porta,6 ;llego a 5 prende led
out DDRB,aux sensor1: ldi r20,0b00000000 ;descativo las interrupciones del
ldi aux,0b1111_1111 // Salvamos el estado puerto A
out PORTB,aux push r16 sts pcicr,r20 ;solo valdra de nuevo si aplasto el reset
; configuro como salida puerto A,C,D in r16,sreg rjmp escA ;salta a escA y sale
ldi aux,0b0111_1111 push r16 // si el pulsador B es aplastado ejecuta estas lineas

out DDRA,aux // finalizacion de salvar el estado usuarioB:


out DDRC,aux cpi s2,1 inc contab ;incrementa el contador
out DDRD,aux IF1: brne ELSE1 cpi contab,5 ;compara si llego a cinco
ldi aux,0b0000_0000; empiezo con cero ldi s2,0 breq ledB ;si llego salta a ledB
out PORTA,aux rjmp NEXT1 escB:
out PORTC,aux ELSE1: ret ;regresa
out PORTD,aux ldi s1,1 ledB:
lazo: NEXT1: sbi porta,7 ;prende el led 7 del puerto A
clr unidades ; encero registros // recupero estado ldi r20,0b00000000 ;desactiva la interrupcion del puerto A
clr decenas pop r16 sts pcicr,r20 ;solo valdra de nuevo si se aplasta el reset
clr centenas out sreg,r16 rjmp escB ;salta a escB
in dato,PINB ; leo el puerto pop r16 BARRIDO DE TECLADO
rcall BinBCD ; llamo conversion Binario BCD // finalizacion recuperacion de estado .org 0x00
;DEFINICION DE VARIABLES
;DESPLEGAR UNIDADES reti
mov aux,unidades sensor2: .def aux=r16
rcall Mostrar ; conversion a 7 segmentos // Salvamos el estado .def aux1=r17
out PORTA,aux push r16 .def tempo=r18
ldi aux, 0b00000100 in r16,sreg .def tempo1=r19
out PORTC,aux push r16 ;CONFIGURACION DE PUERTOS
rcall delay // finalizacion de salvar el estado Ldi aux,0b0000_1111 ;PIN 4-7(IN) 0-3(OUT)
clr aux cpi s1,1 Out ddrb,aux ;Configuración del PortB
Ldi aux,0b1111_0000 ;Pull-Up brne retardo rjmp ESPERA
ldi aux,0xff dec tempo1 lds tempo,adch ; leo bits mas significativos
out ddra,aux ;PortA como salidas brne retardo ; se toman cuatro muestras y se las suman para luego sacar
out porta,aux ;Pull-Up ret el promedio
ldi tempo,255 ;TABLA PARA DISPLAY 7SEG ANODO COMUN add r18,tempo
ldi tempo1,1 tabla: clr tempo
;BARRIDO DE FILAS .db 0b11000000,0b11111001 ;0 y 1 adc r19, tempo
Inicio: .db 0b10100100,0b10110000 ;2 y 3 dec r17
ldi aux,0b1111_0111 .db 0b10011001,0b10010010 ;4 y 5 brne datos
out portb,aux .db 0b10000010,0b11111000 ;6 y 7 ldi r17,2
rcall Fila1 .db 0b10000000,0b10010000 ;8 y 9 ; se divide para 4 con lo que se saca el promedio
ldi aux,0b1111_1011 .db 0b10001000,0b10000011 ;A y b div_4:
out portb,aux .db 0b11000110,0b10100001 ;C y d lsr r19
rcall Fila2 .db 0b10000110,0b10001110 ;E y F ror r18
ldi aux,0b1111_1101 CONVERSOR A/D dec r17
out portb,aux .def tempo=R16 brne div_4
rcall Fila3 .CSEG mov DATO,r18
ldi aux,0b1111_1110 .org 0x00 RET
out portb,aux rjmp inicio ;REDUCCIÓN A 8 BITS:
rcall Fila4 // configuracion sts adcsra,aux4 ;enableadc,start,prescaler64
rjmp inicio inicio: Espera:
ldi tempo,0 lds aux4,adcsra
;FILAS Y SUS TECLAS out DDRA,tempo ; Entrada por el puerto A Para conversores sbrc aux4,6 ;verifica si finalizo conversion
Fila1: out PORTB, tempo ; salida a 0l rjmp Espera
sbis pinb,4 com tempo ; Dividir para 4 o deplazar 3 veces
rcall Siete out DDRB,tempo ; Configuro como salida para leds menos lds aux3,adcl
sbis pinb,5 significativos lds aux2,adch
rcall Ocho ldi tempo,0b00000011 lsr aux2
sbis pinb,6 out DDRD,tempo ; Configuro como salida para leds menos ror aux3
rcall Nueve significativos lsr aux2
sbis pinb,7 com tempo ror aux3
rcall A out PORTD,tempo ; salida a 0l los mas significativos mov DATO,aux3
ret // configuro memoria SRAM
Fila2: ldi tempo,high(ramend)
sbis pinb,4 out sph,tempo
rcall Cuatro ldi tempo,low(ramend)
sbis pinb,5 out spl,tempo
rcall Cinco // Configuracion conversor AD
sbis pinb,6 ldi tempo,0b000000001
rcall Seis sts DIDR0,tempo ; activo como entrada a analógico al ADC0
sbis pinb,7 ldi tempo,0b01000000
rcall B sts ADMUX,tempo
ret ; bit 7-6: 01 entrada de referencia por AVCC, bit 5:
Fila3: justiificacion derecha, Selecciono canal 0
sbis pinb,4 LAZO:
rcall Uno ldi tempo,0b11000110
sbis pinb,5 sts ADCSRA,tempo
rcall Dos ; bit 7: enciendo adc, bit 6: start conversion, bit:5
sbis pinb,6 autotriger manual, bit 2:0:presacaler 64
rcall Tres ESPERA:
sbis pinb,7 lds tempo,adcsra
rcall C sbrc tempo,6 ; salta cuando termine la conversion se pone
ret 0L
Fila4: rjmp ESPERA
sbis pinb,4 lds tempo,adcl
rcall E out PORTB,tempo ; salida al puerto MBS
sbis pinb,5 lds tempo,adch
rcall Cero ori tempo,0b11111100
sbis pinb,6 out PORTD,tempo ; salida puerto LSB
rcall F rjmp LAZO
sbis pinb,7 CONVERSOR A/D 2
rcall D .def TEMPO=R16
ret .CSEG
;VALOR DE LAS TECLAS .org 0x00
Cero: rjmp inicio
ldi aux1,0 .org 0x02 ; interrupcion int0
rcall display rjmp interrupcion ; subrutina interrupcion
ret inicio:
Uno: // configuro puertos
ldi aux1,1 ldi tempo,0
rcall display out ddra,tempo ; puerto A entrada
ret out portb,tempo ; Puerto b salida 0 logico
Dos: com tempo
ldi aux1,2 out ddrb,tempo ; puerto B como salida
rcall display ldi tempo,0b00000011
ret out ddrd,tempo ; salida puerto d
Tres: com tempo
ldi aux1,3 out portd,tempo ; salida puerto d a 0 logico
rcall display // configuro SRAM
ret ldi tempo,high(ramend)
Cuatro: out sph,tempo
ldi aux1,4 ldi tempo,low(ramend)
rcall display out spl,tempo
ret // configuro AD
Cinco: ldi tempo,0b000000011
ldi aux1,5 sts didr0,tempo ; habilito AD0 y AD1
rcall display ldi tempo,0b01000001
ret sts admux,tempo ; referencia por AVCC, ajuste resultado
Seis: derecha, conexion ADC1
ldi aux1,6 // Configuro interrupion
rcall display ldi tempo,0b00000010
ret sts eicra,tempo ; activacion int0 por flanco negativo
Siete: ldi tempo,0b00000001
ldi aux1,7 out eimsk,tempo ; activo interrupcion
rcall display sei
ret LAZO:
Ocho: ldi tempo,0b11000110
ldi aux1,8 sts ADCSRA,tempo ; Activo ADC, start conversion, prescaler
rcall display 64
Ret ESPERA:
Nueve: lds tempo,ADCSRA
ldi aux1,9 sbrc tempo,6 ; espero finalizacion de conversion
rcall display rjmp ESPERA
ret lds tempo,adcl ; leo bit mesnos signficativos
A: ldi aux1,10 out portb,tempo
rcall display lds tempo,adch ; leo bits mas significativos
ret ori tempo,0b11111100
B: ldi aux1,11 out portd,tempo
rcall display rjmp LAZO
ret interrupcion:
C: ldi aux1,12 // salvo registros
rcall display push r16
ret in r16,sreg
D: ldi aux1,13 push r16
rcall display lds r16,admux
ret sbrs r16,0 ; veo que ADC esta activado
E: ldi aux1,14 rjmp CAMBIAR
rcall display ldi r16,0b01000000 ; leo ADC0
ret rjmp SALIR
F: ldi aux1,15 CAMBIAR:
rcall display ldi r16,0b01000001 ; leo ADC1
ret SALIR:
;SUBRUTINA HEXADECIMAL sts admux,r16
Display: pop r16
rcall numero out sreg,r16
out porta,aux1;Hex menos significativo pop r16
rcall retardo reti
rjmp Inicio ;Promedio de 4 valores:
;BUSCADOR DEL DATO, EN UNA TABLA AD:
numero: ldi r17,4
ldi zh,high(tabla<<1) ldi r18,0
ldi zl,low(tabla<<1) datos:
add zl,aux1 ldi tempo,0b11000011
lpm aux1,z sts ADCSRA,tempo ; Activo ADC, start conversion, prescaler
ret 8 (1 MHZ OSC INTERNO)
ESPERA:
;RETARDO lds tempo,ADCSRA
retardo: sbrc tempo,6 ; espero finalizacion de conversion
dec tempo