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