Você está na página 1de 3

.

equ baud = 9600 ; definindo o baudrate


.equ F_CPU = 8000000 ; clock em 8MHz
.equ bps = (F_CPU/16/baud) - 1 ; cálculo para o baundrate
.equ DISPLAY = PORTB ; PORTD é onde está conectado o Display (seg a = LSB)
.def AUX = R16 ; R16 tem agora o nome de AUX

Begin:
rcall initUART ;Iniciar a Uart
rcall IniciarPortB ;Iniciar a portaB

Loop:
rcall uartRxOk ; Verifica se a Uart pode enviar os dados
rcall DadoUartAT ; Envia os dados da Uart para o Atmega
ldi r20, 0x3F ; Adciona no R20 o valor 0x3F, que corresponde ao valor de
"-" no display
rcall CompValor ; Chama a função para comparar o valor que entrou da UART
rcall Mostra ; mostra no display o dado esperado
rcall uartTxOk ; Verifica se todos os dados foram enviados
rcall DadoATuart ; Envia o dado do Atmega para a Uart
rjmp loop ; Retorna para a função Loop

initUART:
ldi r16,(1<<RXEN0)|(1<<TXEN0) ; Habilita a transmissão da porta Uart
sts UCSR0B,r16 ; Habilita o receptor

ldi r16,LOW(bps) ; carregar pré-escala de transmissão


ldi r17,HIGH(bps)

sts UBRR0L,r16 ; carregar pré-escala de transmissão do UBRROL


sts UBRR0H,r17 ;carregar pré-escala de transmissão para UBRR0

uartTxOk: ; Verifica se todos os dados foram enviados


lds r17,UCSR0A ; Carrrega o UCSR0A para o r17
sbrs r17,UDRE0 ; esperar por buffer vazio para a transmissão
rjmp uartTxOk ; Retornar para o uartTxOk
ret

DadoATUart: ; Enviar os dados do Atmega para a Uart


sts UDR0, r18 ; Carrega o que está no R16 para a UDR0
ret ; retornar para onde foi chamada

uartRxOk: ; Verifica se o dado pode ser enviado


lds r17,UCSR0A ; Carrrega o UCSR0A para o r17
sbrs r17,RXC0 ; esperar por buffer vazio para a transmissão
rjmp uartRxOk
ret

DadoUartAT: ; Envia os dados da Uart para o Atmega


lds r18, UDR0 ; Carrega o que está no UDR0 para o R16
ret

IniciarPortB:
ldi AUX, 0x7F ;carrega AUX com o valor 0xFE
out ddrb, AUX ;configura PORTB, PB0 entrada e PB1 .. PB7 saídas
out PORTB, AUX ;Desliga os segmentos do Display
ret
/*
Realiza alguns processos
1- Compara os dois valores: Do registrador 18 e valor exadecimal (r18 - K)
2 - Se r18 - k = 0, Z = 1, então a subrotina abaixo é chamada
3 - Se r18 - k != 0, z = 0, então a sobrotina não é chamada e continua o
desenvolvimento do código
*/
CompValor: ; Sub rotina criada para comparar os valores
CPI r18, 0x30 ; Realiza a subtração do R18 - 0x30
breq If0 ; Se Z = 1, chama a sub rotina If0

CPI r18, 0x31 ; Realiza a subtração do R18 - 0x31


breq If1 ; Se Z = 1, chama a sub rotina If1

CPI r18, 0x32 ; Realiza a subtração do R18 - 0x32


breq If2 ; Se Z = 1, chama a sub rotina If2

CPI r18, 0x33 ; Realiza a subtração do R18 - 0x33


breq If3 ; Se Z = 1, chama a sub rotina If3

CPI r18, 0x34 ; Realiza a subtração do R18 - 0x34


breq If4 ; Se Z = 1, chama a sub rotina If4

CPI r18, 0x35 ; Realiza a subtração do R18 - 0x35


breq If5 ; Se Z = 1, chama a sub rotina If5

CPI r18, 0x36 ; Realiza a subtração do R18 - 0x36


breq If6 ; Se Z = 1, chama a sub rotina If6

CPI r18, 0x37 ; Realiza a subtração do R18 - 0x37


breq If7 ; Se Z = 1, chama a sub rotina If7

CPI r18, 0x38 ; Realiza a subtração do R18 - 0x38


breq If8 ; Se Z = 1, chama a sub rotina If8

CPI r18, 0x39 ; Realiza a subtração do R18 - 0x39


breq If9 ; Se Z = 1, chama a sub rotina If9

CPI r18, 0x61 ; Realiza a subtração do R18 - 0x61


breq IfA ; Se Z = 1, chama a sub rotina IfA

CPI r18, 0x62 ; Realiza a subtração do R18 - 0x62


breq IfB ; Se Z = 1, chama a sub rotina IfB

CPI r18, 0x63 ; Realiza a subtração do R18 - 0x63


breq IfC ; Se Z = 1, chama a sub rotina IfC

CPI r18, 0x64 ; Realiza a subtração do R18 - 0x64


breq IfD ; Se Z = 1, chama a sub rotina IfD

CPI r18, 0x65 ; Realiza a subtração do R18 - 0x65


breq IfE ; Se Z = 1, chama a sub rotina IfE

CPI r18, 0x66 ; Realiza a subtração do R18 - 0x66


breq IfF ; Se Z = 1, chama a sub rotina IfF

ret
If0: ; Se o valor inserido na Uart for 0
ldi r20,0x40 ; Guarda em R20 o 0x40
ret ; retorna pra função que foi chamada
If1: ; Se o valor inserido na Uart for 1
ldi r20,0x79 ; Guarda em R20 o 0x79
ret ; retorna pra função que foi chamada
If2: ; Se o valor inserido na Uart for 2
ldi r20,0x24 ; Guarda em R20 o 0x24
ret ; retorna pra função que foi chamada
If3: ; Se o valor inserido na Uart for 3
ldi r20,0x30 ; Guarda em R20 o 0x30
ret ; retorna pra função que foi chamada
If4: ; Se o valor inserido na Uart for 4
ldi r20,0x19 ; Guarda em R20 o 0x19
ret ; retorna pra função que foi chamada
If5: ; Se o valor inserido na Uart for 5
ldi r20,0x12 ; Guarda em R20 o 0x12
ret ; retorna pra função que foi chamada
If6: ; Se o valor inserido na Uart for 6
ldi r20,0x02 ; Guarda em R20 o 0x02
ret ; retorna pra função que foi chamada
If7: ; Se o valor inserido na Uart for 7
ldi r20,0x78 ; Guarda em R20 o 0x78
ret ; retorna pra função que foi chamada
If8: ; Se o valor inserido na Uart for 8
ldi r20,0x00 ; Guarda em R20 o 0x00
ret ; retorna pra função que foi chamada
If9: ; Se o valor inserido na Uart for 9
ldi r20,0x18 ; Guarda em R20 o 0x18
ret ; retorna pra função que foi chamada
IfA: ; Se o valor inserido na Uart for A
ldi r20,0x08 ; Guarda em R20 o 0x08
ret ; retorna pra função que foi chamada
IfB: ; Se o valor inserido na Uart for B
ldi r20,0x03 ; Guarda em R20 o 0x03
ret ; retorna pra função que foi chamada
IfC: ; Se o valor inserido na Uart for C
ldi r20,0x46 ; Guarda em R20 o 0x46
ret ; retorna pra função que foi chamada
IfD: ; Se o valor inserido na Uart for D
ldi r20,0x21 ; Guarda em R20 o 0x21
ret ; retorna pra função que foi chamada
IfE: ; Se o valor inserido na Uart for E
ldi r20,0x06 ; Guarda em R20 o 0x06
ret ; retorna pra função que foi chamada
IfF: ; Se o valor inserido na Uart for F
ldi r20,0x0E ; Guarda em R20 o 0x0E
ret ; retorna pra função que foi chamada
Mostra: ; Sub rotinha para mostrar o valor no display
OUT DISPLAY, r20 ; saí para o display o valor de R20
ret

Você também pode gostar