Você está na página 1de 10

EETI- Escola de Engenharia e Tecnologia da

Informação Curso de Engenharia

RELATÓRIO DO PROJETO DE UM
RELÓGIO DIGITAL COM ATMEGA328 EM
ASSEMBLY

Trabalho realizado como parte


avaliativa da N2, da disciplina
Microcontroladores e Aplicações,
ministrada pelo docente Euclério
Ornellas do curso de Engenharia.

Gabriel Costa de Oliveira


Daniel Abbehusen Miguel Cruz
Suzana Passos
CÓDIGO

.equ BOTAO = INT0


.equ BOTAO2 = INT1
.equ DISPLAY = PORTC
.def Uniseg = R16 // unidade dos segundos
.def Dezseg = R20 // dezena dos segundos
.def Unimin = R23 // unidade dos minutos
.def Dezmin = R24 // dezena dos minutos
.def Unihor = R17 // unidade dos hora
.def Dezhor = R18 // dezena dos hora
.def flag01 = R22 // primeiro Botao
.def flag02 = R25 // segundo Botao
.def Dis = R19 // dispositivo
.ORG 0x000 // endereço de Resert
jmp inicio // Pula para lebel inicio
jmp int01 // emdereço de interrupção. INT0
jmp int02 // emdereço de interrupção. INT1
.ORG 0x1A // endereço de inicio do codigo

inicio:
sei // habilita interrupões
ldi Uniseg, 0b00000011 // carrega com o valor 0x03
out EIMSK, Uniseg // habilita INT0 e INT1
ldi Uniseg, 0b00000000 // carrega Uniseg cm o valor 0
sts EICRA, Uniseg // confgura o tipo de interrupçao para ser acoionado
ldi Dezseg,0x00 // carrega Dezseg cm o valor 0
ldi Unimin,0x00 // carrega Unimin cm o valor 0
ldi Dezmin,0x00 // carrega Dezmin cm o valor 0
ldi Unihor,0x00 // carrega Unihor cm o valor 0
ldi Dezhor,0x00 // carrega Dezhor cm o valor 0
ldi flag01,0x00 // carrega flag01 cm o valor 0
ldi flag02,0x00 // carrega flag02 cm o valor 0
ldi Uniseg, 0b11110011
out DDRD, Uniseg // confg entradas e saidas portD
ldi Uniseg, 0xFF
out PORTD, Uniseg // habilita o pull-up
out DDRB, Uniseg //PORTB saida
out DDRC, Uniseg //PORTC saida
out PORTB, Uniseg // Inicia Com Display Apagado
ldi Uniseg, 0x00

main:// gerencia o inicio do relógio quando o flag01 = 1


sbrs flag01, 0 // se o bit do flag for 1, pula linha
rjmp main2
cpi Uniseg, 0x09 //compara se o valor é máximo (9)
brne incr_s1 // se n for igual vai para incr_s1
ldi Uniseg, 0x00 // carrega com valor minimo
cpi Dezseg, 0X05 //compara se o valor é máximo (5)
brne incr_s2 // se n for igual vai para incr_s2
ldi Dezseg, 0x00 // carrega com valor minimo
cpi Unimin, 0x09 //compara se o valor é máximo (9)
brne incr_m1 // se n for igual vai para incr_m1
ldi Unimin, 0x00 // carrega com valor minimo
cpi Dezmin, 0X05 //compara se o valor é máximo (5)
brne incr_m2 // se n for igual vai para incr_m2
ldi Dezmin, 0x00 // carrega com valor minimo
cpi Dezhor, 0x02 //compara se o valor é máximo (2)
brne inc_normal // se n for igual vai para inc_normal
cpi Unihor, 0X03 //compara se o valor é máximo (3)
brne incr_h1 // se n for igual vai para incr_h1
ldi Unihor, 0x00
ldi Dezhor, 0x00
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

inc_normal: // gerencia o incremento das horas quando a dezena de horas n for


max
cpi Unihor, 0x09 // compara se o valor é max (9)
brne incr_h1 // se n for igual, vai para incr_h1
ldi Unihor, 0x00
inc Dezhor //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

incr_h1:
inc Unihor //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

incr_m1:
inc Unimin //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

incr_m2:
inc Dezmin //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

incr_s1:
inc Uniseg //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

incr_s2:
inc Dezseg //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

main2:// gerencia o inicio do relógio quando o flag01 = 0


cpi Uniseg, 0x00 //compara se o valor é minimo (0)
brne dec_s1 // se n for igual vai para dec_s1
ldi Uniseg, 0x09 // carrega com valor máximo
cpi Dezseg, 0X00 //compara se o valor é minimo (0)
brne dec_s2 // se n for igual vai para dec_s2
ldi Dezseg, 0x05 // carrega com valor máximo
cpi Unimin, 0x00 //compara se o valor é minimo (0)
brne dec_m1 // se n for igual vai para dec_m1
ldi Unimin, 0x09 // carrega com valor máximo
cpi Dezmin, 0X00 //compara se o valor é minimo (0)
brne dec_m2 // se n for igual vai para dec_m2
ldi Dezmin, 0x05 // carrega com valor máximo
cpi Dezhor, 0x00 //compara se o valor é minimo (0)
brne dec_normal // se n for igual vai para dec_normal
cpi Unihor, 0X00 //compara se o valor é minimo (0
brne dec_h1 // se n for igual vai para dec_h1
ldi Dezhor, 0x02
ldi Unihor, 0x03
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

dec_normal: // gerencia o incremento das horas quando a dezena de horas n for


max
cpi Unihor, 0x00 // compara se o valor é max (9)
brne dec_h1 // se n for igual, vai para incr_h1
ldi Unihor, 0x09
dec Dezhor //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

dec_h1:
dec Unihor //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

dec_m1:
dec Unimin //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

dec_m2:
dec Dezmin //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

dec_s1:
dec Uniseg //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

dec_s2:
dec Dezseg //incrementa
sbrc flag02, 0 // se o bit 0 de flag for 0, pula a linha
rjmp Decod02
rjmp Decod

//--------------------------------------------------------------------------------------------------
-------------------

int01: // interrupção gerada pelo valor 0 de INT0


sbrs flag01, 0 //se o bit 0 de flag for 1, pula linha
rjmp inc_flag01
dec flag01
reti

inc_flag01:
inc flag01
reti

int02: // interrupção gerada pelo valor 0 de INT1


sbrs flag02, 0 //se o bit 0 de flag for 1, pula linha
rjmp inc_flag02
dec flag02
reti

inc_flag02:
inc flag02
reti

Decod: // Exibe no Display horas e minutos


out DISPLAY, Unimin // carrega o display com o valor dos minutos
ldi Dis, 0x0E // carrega o dis com o valor 14
out PORTB, Dis // carrega portD com dis
rcall atraso
out DISPLAY, Unihor // carrega o display com o valor das horas
ldi Dis, 0x0B // carrega o dis com o valor 11
out PORTB, Dis // carrega portD com dis
rcall atraso
out DISPLAY, Dezmin // carrega o display com o valor dos minutos
ldi Dis, 0x0D // carrega o dis com o valor 13
out PORTB, Dis // carrega portD com dis
rcall atraso
out DISPLAY, Dezhor // carrega o display com o valor das horas
ldi Dis, 0x07 // carrega o dis com o valor 7
out PORTB, Dis // carrega portD com dis
rcall atraso
rjmp main // pula pro main

Decod02: // Exibe no Display minutos e segundos


out DISPLAY, Uniseg // carrega o display com o valor das horas
ldi Dis, 0x0E // carrega o dis com o valor 14
out PORTB, Dis // carrega portD com dis
rcall atraso
out DISPLAY, Unimin // carrega o display com o valor dos minutos
ldi Dis, 0x0B // carrega o dis com o valor 11
out PORTB, Dis // carrega portD com dis
rcall atraso
out DISPLAY, Dezseg // carrega o display com o valor das horas
ldi Dis, 0x0D // carrega o dis com o valor 13
out PORTB, Dis // carrega portD com dis
rcall atraso
out DISPLAY, Dezmin // carrega o display com o valor dos minutos
ldi Dis, 0x07 // carrega o dis com o valor 7
out PORTB, Dis // carrega portD com dis
rcall atraso
rjmp main // pula pro main

atraso: // função delay


ldi R26, 1

volta:
dec R27
brne volta
dec R28
brne volta
dec R26
brne volta
ret
IMAGENS DO FUNCIONAMENTO

DECREMENTO
INCREMENTO

Você também pode gostar