Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * AssemblerApplication12.asm
- *
- * Created: 3/31/2015 11:00:04 AM
- * Author: Laurens
- */
- .include "m32def.inc"
- .org 0x0000
- rjmp init
- .org OC1Aaddr
- rjmp timerInterrupt
- stuff:
- .equ baudRate = 35
- .def tmp = r16
- .def count = r17
- .def data = r18
- .def hours = r19
- .def minutes = r20
- .def seconds = r21
- .def moduloCounter = r22
- .def multiplyRegister = r23
- .def NumberToConvert = r24
- init:
- ;init stack pointer
- ldi tmp, LOW(RAMEND)
- out SPL, tmp
- ldi tmp, HIGH(RAMEND)
- out SPH, tmp
- ldi r17, high(baudRate)
- ldi r16, low(baudRate)
- rcall USART_Init
- ldi r16, 40
- ;create output compare register
- ldi r16, high(43200)
- out OCR1AH, r16
- ldi r16, low(43200)
- out OCR1AL, r16
- ;Set prescaler to 256 and put timer in CTC mode
- ldi r16, (1<<CS12) | (1<<WGM12)
- out TCCR1B, r16
- ;enable interrupts
- ldi r16, (1<<OCIE1A)
- out TIMSK, r16
- sei ; enables all interrupts
- ldi seconds, 0
- ldi minutes, 0
- ldi hours, 0
- done:
- rjmp done
- USART_Init:
- ; Set baud rate
- out UBRRH, r17
- out UBRRL, r16
- ; Enable receiver and transmitter
- ldi r16, (1<<RXEN)|(1<<TXEN)
- out UCSRB,r16
- ; Set frame format: 8data, 2stop bit
- ldi r16, (1<<URSEL)|(0<<USBS)|(3<<UCSZ0)
- out UCSRC,r16
- ret
- USART_Transmit:
- ; Wait for empty transmit buffer
- sbis UCSRA,UDRE
- rjmp USART_Transmit
- ; Put data (r16) into buffer, sends the data
- out UDR,data
- ret
- modulo:
- cp tmp, multiplyRegister
- brlo smaller
- ;breq smaller
- ldi multiplyRegister, 10
- mul moduloCounter, multiplyRegister
- mov multiplyRegister, r0
- inc moduloCounter
- rjmp modulo
- smaller:
- subi multiplyRegister, 10
- sub tmp, multiplyRegister
- dec moduloCounter
- dec moduloCounter
- ret
- showTime:
- ;show time
- ;For hours
- rcall USART_Transmit
- mov tmp, hours
- rcall twoBytesToTime
- mov tmp, minutes
- rcall twoBytesToTime
- mov tmp, seconds
- rcall twoBytesToTime
- ldi data, 0x2E ; send last character
- rcall USART_Transmit
- ret
- checkIntToTime:
- ldi multiplyRegister, 10
- ldi moduloCounter, 2
- rcall modulo
- ret
- twoBytesToTime:
- ;the tmp register should have the variable you want
- rcall checkIntToTime
- ;moduloCounter has first character
- mov NumberToConvert, moduloCounter
- rcall ConvertToSegments
- mov data, NumberToConvert
- skipChange:
- rcall USART_Transmit
- ;tmp has second character
- mov NumberToConvert, tmp
- rcall ConvertToSegments
- mov data, NumberToConvert
- rcall USART_Transmit
- re
- USART_Receive:
- ; Wait for data to be received
- sbis UCSRA, RXC
- rjmp USART_Receive
- ; Get and return received data from buffer
- in r16, UDR
- ret
- ConvertToSegments:
- cpi NumberToConvert, 0
- brne N1
- ldi NumberToConvert, 0b01110111
- rjmp End_CTS
- N1:
- cpi NumberToConvert, 1
- brne N2
- ldi NumberToConvert, 0b00100100
- rjmp End_CTS
- N2:
- cpi NumberToConvert, 2
- brne N3
- ldi NumberToConvert, 0b01011101
- rjmp End_CTS
- N3:
- cpi NumberToConvert, 3
- brne N4
- ldi NumberToConvert, 0b01101101
- rjmp End_CTS
- N4:
- cpi NumberToConvert, 4
- brne N5
- ldi NumberToConvert, 0b00101110
- rjmp End_CTS
- N5:
- cpi NumberToConvert, 5
- brne N6
- ldi NumberToConvert, 0b01101011
- rjmp End_CTS
- N6:
- cpi NumberToConvert, 6
- brne N7
- ldi NumberToConvert, 0b01111011
- rjmp End_CTS
- N7:
- cpi NumberToConvert, 7
- brne N8
- ldi NumberToConvert, 0b00100101
- rjmp End_CTS
- N8:
- cpi NumberToConvert, 8
- brne N9
- ldi NumberToConvert, 0b01111111
- rjmp End_CTS
- N9:
- ldi NumberToConvert, 0b01101111
- rjmp End_CTS
- End_CTS:
- timerInterrupt:
- inc seconds
- cpi seconds, 60
- brne skipCall
- rcall incMinutes
- skipCall: rcall showTime
- reti
- incMinutes:
- ldi seconds, 0
- inc minutes
- cpi minutes, 60
- brne skipCall2
- rcall incHours
- skipCall2:
- ret
- incHours:
- ldi minutes, 0
- inc hours
- cpi hours, 24
- brne skipCall3
- rcall resetHours
- skipCall3:
- ret
- resetHours:
- ldi hours, 0
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement