Progene; Matrícula:161131197 LOOP1: ;LINHA DE RETORNO DE LOOP
- 8 LEDS – CONTAGEM BINÁRIA: // OR R17,R16 ;R17=R17 OR R16 .ORG 0x000 OUT PORTB,R16 ;PORTB=R17 INICIO: LSL R16 ;DESLOCA BIT DO R16 LDI R16,$FF ; CAREGA R16 COM FF(HEXA) SBIS PORTB,PB7 ;TESTA DE O PB7=1, OUT DDRB,R16 ;CONFIGURA DDRB PARA SAIDA (DDRB=FF) SE FOR PULA A PROXIMA LINHA LDI R16,$01 ;CAREGA R16 COM 01(HEXA) RJMP LOOP1 ;SALTA PARA A LINHA LOOP1 LDI R17,$01 ;CAREGA R17 COM 00(HEXA) LDI R16,$00 LOOP1: ;LINHA DE RETORNO DE LOOP - ACENDE LED TRÊS VEZES LENTO E TRES VEZES RÁPIDO: INC R16 ;R17=R17 OR R16 .equ LED = PB5 OUT PORTB,R16 ;PORTB=R17 .ORG 0x000 ;RCALL ATRASO INICIO: ;LSL R16 ;DESLOCA BIT DO R16 LDI R16,0xFF SBIS PORTB,PB7 ;TESTA DE O PB7=1, SE FOR PULA A PROXIMA OUT DDRD,R16 LINHA PRINCIPAL: RJMP LOOP1 ;SALTA PARA A LINHA LOOP1 SBI PORTD,LED LDI R16,$00 ; CAREGA R16 COM 00(HEXA) RCALL ATRASO1 OUT PORTB,R16 ;PORTB=$00 RCALL ATRASO RJMP INICIO CBI PORTD,LED ;SALTA PARA A LINHA LOOP1 RCALL ATRASO1 ATRASO: //atraso de aprox. 200 ms SBI PORTD,LED LDI R19,2 RCALL ATRASO1 volta: CBI PORTD,LED DEC R20 //decrementa R17, começa com 0x00 RCALL ATRASO1 BRNE volta //enquanto R17 > 0 fica decrementando R17 SBI PORTD,LED DEC R18 //decrementa R18, começa com 0x00 RCALL ATRASO1 BRNE volta //enquanto R18 > 0 volta a decrementar R18 CBI PORTD,LED DEC R19 //decrementa R19 RCALL ATRASO1 BRNE volta //enquanto R19 > 0 vai para volta SBI PORTD,LED RET //retorno de sub rotina RCALL ATRASO2 - 8 LEDS – ACENDE UM DE CADA VEZ E APAGA TODOS JUNTOS: CBI PORTD,LED .ORG 0x000 RCALL ATRASO2 INICIO: SBI PORTD,LED LDI R16,$FF ; CAREGA R16 COM FF(HEXA) RCALL ATRASO2 OUT DDRB,R16 ;CONFIGURA DDRB PARA SAIDA (DDRB=FF) CBI PORTD,LED LDI R16,$01 ;CAREGA R16 COM 01(HEXA) RCALL ATRASO2 LDI R17,$01 ;CAREGA R17 COM 00(HEXA) SBI PORTD,LED LOOP1: ;LINHA DE RETORNO DE LOOP RCALL ATRASO2 OR R17,R16 ;R17=R17 OR R16 CBI PORTD,LED OUT PORTB,R17 ;PORTB=R17 RCALL ATRASO2 RCALL ATRASO RJMP PRINCIPAL LSL R16 ;DESLOCA BIT DO R16 ATRASO1: SBIS PORTB,PB7 ;TESTA DE O PB7=1, SE FOR PULA A PROXIMA LDI R19,0x05 LINHA VOLTA1: RJMP LOOP1 ;SALTA PARA A LINHA LOOP1 DEC R17 LDI R16,$00 ; CAREGA R16 COM 00(HEXA) BRNE volta1 OUT PORTB,R16 ;PORTB=$00 RCALL ATRASO RJMP INICIO DEC R18 ;SALTA PARA A LINHA LOOP1 BRNE volta1 ATRASO: //atraso de aprox. 200 ms DEC R19 LDI R19,2 BRNE volta1 volta: RET DEC R20 //decrementa R17, começa com 0x00 ATRASO2: BRNE volta //enquanto R17 > 0 fica decrementando R17 LDI R19,0x0A DEC R18 //decrementa R18, começa com 0x00 VOLTA2: BRNE volta //enquanto R18 > 0 volta a decrementar R18 DEC R17 DEC R19 //decrementa R19 BRNE volta2 BRNE volta //enquanto R19 > 0 vai para volta DEC R18 RET //retorno de sub rotina BRNE volta2 - 8 LEDS – ACENDE UM DE CADA VEZ E APAGA UM DE CADA VEZ: DEC R19 INICIO: BRNE volta2 LDI R16,$FF ; CAREGA R16 COM FF(HEXA) RET OUT DDRB,R16 ;CONFIGURA DDRB PARA SAIDA (DDRB=FF) - INSTRUÇÕES DE ARITIMÉTICA: LDI R16,$01 ;CAREGA R16 COM 01(HEXA) •LDI R16,10;carrega 10 em decimal para r16 LDI R17,$00 ;CAREGA R17 COM 00(HEXA) •LDI R17,11;carrega 11 em decimal para r17 LOOP1: ;LINHA DE RETORNO DE LOOP •ADD R17,R16 ;R17= R17+R16 e coloca o resultado em R17 OR R17,R16 ;R17=R17 OR R16 •LDI R16,10 OUT PORTB,R17 ;PORTB=R17 •LDI R17,11 LSL R16 ;DESLOCA BIT DO R16 •SUB R17,R16 ;R17= R17-R16, o resultado fica em R17 LDI R17,$00 ; CAREGA R16 COM 00(HEXA) •LDI R16,100 ;carrega 100 em decimal para r16 SBIS PORTB,PB7 ;TESTA DE O PB7=1, •LDI R17,10 ;carrega 10 em decimal para r167 SE FOR PULA A PROXIMA LINHA •MUL R17,R16 ;R1:R0=R17xR16 coloca o resultado nos registradores R1:R0 RJMP LOOP1 ;SALTA PARA A LINHA LOOP1 (1000 ou 0x3E8) OUT PORTB,R16 ;PORTB=$00 •LDI R16,$10 ; carrega 10 hexadou 16 em decimal para r16 - 8 LEDS – ACENDE UM DE CADA VEZ E APAGA UM DE CADA VEZ: •ASR R16 ; R16=R16 / 2 (desloca para a direita para dividir por 2) INICIO: - INSTRUÇÕES DE LÓGICA: LDI R16,$FF ; CAREGA R16 COM FF(HEXA) OUT DDRB,R16 ;CONFIGURA DDRB PARA SAIDA (DDRB=FF) •LDI R16,$2F; CARREGA 2F(HEXA) EM R16 LDI R16,$01 ;CAREGA R16 COM 01(HEXA) •LDI R17,$60 ; CARREGA 60(HEXA) EM R17 LDI R17,$00 ;CAREGA R17 COM 00(HEXA) •AND R17,R16 ; R17= R17 AND R16, RESULTADO EM R17 •LDI R16,$2F CBI PORTB, PB2 ; ZERA PB2 •LDI R17,$60 SBI PORTB, PB3;SETA PB3=1 •OR R17,R16 ;R17= R17 OR R16, RESULTADO EM R17 SBI PORTB, PB4;SETA PB4=1 •LDI R16,$2F JMP LEPORTAB ;PULA PARA LEPORTAB •LDI R17,$60 - LIGANDO E DESLIGANDO UM LED QUANDO UM BOTÃO É •EOR R17,R16 ;R17= R17 XOR R16, RESULTADO EM r17 PRESSIONADO: •LDI R17,$60 //DEFINIÇÕES •COM R17;COMPLEMENTO DE UM, RESULTADO EM R17 .equ LED = PD2 //LED é o substituto de PD2 na programação - INSTRUÇÕES DE DESVIO: .equ BOTAO = PD7 //BOTAO é o substituto de PD7 na •LDI R16,$FF; CAREGA R16 COM FF(HEXA) programação •OUT DDRB,R16;CONFIGURA DDRB PARA SAIDA (DDRB=FF) .def AUX = R16 /*R16 tem agora o nome de AUX (nem todos os 32 registradores de uso geral podem ser empregados em •LDI R16,$01;CAREGA R16 COM 01(HEXA) todas as instruções) */ •LDI R17,$00;CAREGA R17 COM 00(HEXA) •LOOP1:;LINHA DE RETORNO DE LOOP .ORG 0x000 /*endereço de início de escrita do código na •OR R17,R16;R17=R17 OR R16 memória flash, após o reset o contador do programa aponta •OUT PORTB,R17;PORTB=R17 para cá.*/ •LSL R16;DESLOCA BIT DO R16 Inicializacoes: •SBIS PORTB,PB7;TESTA DE O PB7=1, SE FOR PULA A PROXIMA LINHA LDI AUX,0b00000100 //carrega AUX com o valor 0x04 (1 = •RJMP LOOP1;SALTA PARA A LINHA LOOP1 saída e 0 = entrada) •LDI R16,$00; CAREGA R16 COM 00(HEXA) OUT DDRD,AUX //configura PORTD, PD2 saída e demais pinos •OUT PORTB,R16;PORTB=$00 entradas - INSTRUÇÕES PARA TRANSFERÊNCIA DE DADOS: LDI AUX,0b11111111 /*habilita o pull-uppara o botão e •LDI R16,0x00 ; CARREGA O NUMERO 0XF0 NO REGISTRADOR R16 apaga o LED (pull-upem todas as entradas)*/ •LDI R17,0x08 ; CARREGA O NUMERO 0X8 NO REGISTRADOR R17 OUT PORTD,AUX •OUT SPL, R16 ; COLOCA O VALOR DE R16 EM SPL NOP /*sincronização dos dados do PORT. Necessário somente •OUT SPH, R17 para uma leitura imediatamente após uma escrita no PORT*/ •LDI R16, 0x33 ; CARREGA O VALOR 0X33 NO REGISTRADOR 0x33 •LDI R17, 0x25 ; CARREGA O VALOR 0X25 NO REGISTRADOR 0x25 Principal: •PUSH R16 ;COLOCA O CONTEÚDO DE R16 NO ENDEREÇO $0800 SBIC PIND,BOTAO //verifica se o botão foi pressionado, •PUSH R17 ;COLOCA O CONTEÚDO DE R16 NO ENDEREÇO $07FF senão •LDS r2,$0800 ; CARREGA R2 COM O CONTEÚDO DO ENDEREÇO $0800 RJMP Principal //volta e fica preso no laço Principal •LDS r1,$07FF ; CARREGA R2 COM O CONTEÚDO DO ENDEREÇO $07FF Esp_Soltar: •ADD r2,r1; R2=R2+R1 SBIS PIND,BOTAO //se o botão não foi solto, espera soltar •STS $0800,r2 ; ESCREVE O CONTEÚDO DE R2 NO ENDEREÇO $0800 RJMP Esp_Soltar - 1 LED – ACENDE UM E APAGA: RCALL Atraso /*após o botão ser solto gasta um tempo para .equ LED = PB5 //LED é o substituto de PB0 na programação eliminar o .ORG 0x000 //endereço na memória flash de início de ruído proveniente do mesmo*/ escrita do código SBIC PORTD,LED //se o LED estiver apagado, liga e vice- INICIO: versa LDI R16,0xFF //carrega R16 com o valor 0xFF RJMP Liga OUT DDRD,R16 //configura todos os pinos do PORTD como SBI PORTD,LED //apaga o LED saída RJMP Principal //volta ler botão PRINCIPAL: Liga: SBI PORTD,LED //coloca o pino PB0 em 5 V CBI PORTD,LED //liga LED RCALL ATRASO //chama a sub-rotina de atraso RJMP Principal //volta ler botão CBI PORTD,LED //coloca o pino PB0 em 0 V - Tratamentos: RCALL ATRASO //chama a sub-rotina de atraso .ORG 0x000 RJMP PRINCIPAL //vai para PRINCIPAL INICIO: ATRASO: //sub-rotina de atraso ; AddR1:R0 toR3:R2 LDI R19,0x02 //carrega R19 com o valor 0x02 LDI R16, 0xF5; volta: LDI R17, 0xF0 DEC R17 //decrementa R17, começa com 0x00 ADD R17,R16 BRNE volta //enquanto R17 > 0 fica decrementando R17 BRCS VAI1 ; O VALOR ULTRAPASSA OS 8 BITS, SETA CARRY DO DEC R18 //decrementa R18, começa com 0x00 SREG. BRNE volta //enquanto R18 >0 volta a decrementar R18 LDI R16, 0x0F; DEC R19 //decrementa R19 LDI R17, 0x05 BRNE volta //enquanto R19 >0 vai para volta SUB R17,R16 RET//retorna da sub-rotina BRMI NEGATIVO; CARACTERIZADO COM BIT 7=1, SETA S E C DO - Reservatório: SREG. INICIO: NEG R17; FAZ O COMPLEMENTO DE 2, O VALOR É AJUSTADO. LDI R16,0b00011100 ; CONFIGURA PB2 1 PB4 COMO SAIDA LDI R16, 0x05; OUT DDRB, R16; CONFIGURAPORTA B LDI R17, 0x05 LDI R16,0xE3 SUB R17,R16; SETA BIT Z DO SREG. OUT PORTB,R16;CONFIGURA AS ENTRADAS EM PULL-UP BREQ TRATA LEPORTAB: JMP INICIO IN R16,PORTB;LÊ A PORTA B TRATA: SBRC R16,0; SE O BIT 0 TEM O VALOR ZERO PULA LINHA LDI R17, 0x05 JMP LEPORTAB;PULA PARA LEPORTAB JMP INICIO JMP LIGA_BP;PULA PARA LIGA_BP NEGATIVO: LIGA_BP: LDI R17, 0x08 SBRS R16,1; SE O BIT 1 TIVER VALOR 1, PULA LINHA JMP INICIO JMP LIGA_BR;PULA PARA LIGA_BR VAI1: CBI PORTB, PB3 ; ZERA PB3=0 LDI R17, 0x01 CBI PORTB, PB4;ZERA PB4=0 JMP INICIO SBI PORTB, PB2;SETA PB2=1 JMP LEPORTAB;PULA PARA LEPORTAB LIGA_BR: