Language Assembler
(Atmel AVR 8-bit Controller)
| Date: | 09/23/09 |
| Author: | Michael Strosche |
| URL: | http://www.roboter-projekte.de |
| Comments: | 1 |
| Info: | http://www.mikrocontroller.net/articles/AVR-Tutorial |
| Score: |
; 99 bottles of beer on the wall for Atmel AVR 8-bit MCU with USART, LPM-Command
;
; written by Michael Strosche
; http://www.roboter-projekte.de
;
; tested on ATMega32 @ 16 MHz
.include("m32def.inc")
; 9600 Baud @ 16 MHz
.equ BAUD = 0x0067
.org 0x0000
rjmp init
.org 0x002A
init:
; init stackpointer
ldi r16, LOW (RAMEND)
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
; init usart
ldi r16, HIGH(BAUD)
out UBRRH,r16
ldi r16, LOW (BAUD)
out UBRRL,r16
; enable transmitter
ldi r16, (1<<TXEN)
out UCSRB,r16
; set frame format: 8data, 2stop bit
ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
out UCSRC,r16
; number of bottle = 99
ldi r17, 99
main:
rcall dec2ascii
ldi r31, HIGH(txt0<<1)
ldi r30, LOW (txt0<<1)
rcall put_string
rcall plural
ldi r31, HIGH(txt1<<1)
ldi r30, LOW (txt1<<1)
rcall put_string
rcall dec2ascii
ldi r31, HIGH(txt0<<1)
ldi r30, LOW (txt0<<1)
rcall put_string
rcall plural
ldi r31, HIGH(txt2<<1)
ldi r30, LOW (txt2<<1)
rcall put_string
; decrement number of bottles
dec r17
cpi r17, 0
brne main__more_than_zero
ldi r31, HIGH(nomore<<1)
ldi r30, LOW (nomore<<1)
rcall put_string
rjmp main__no_numbers
main__more_than_zero:
mov r16, r17
rcall dec2ascii
main__no_numbers:
ldi r31, HIGH(txt0<<1)
ldi r30, LOW (txt0<<1)
rcall put_string
rcall plural
ldi r31, HIGH(txt3<<1)
ldi r30, LOW (txt3<<1)
rcall put_string
; more bottles? goto main
cpi r17, 0
brne main
; no more bottles
ldi r31, HIGH(nomore_txt0<<1)
ldi r30, LOW (nomore_txt0<<1)
rcall put_string
ldi r31, HIGH(nomore<<1)
ldi r30, LOW (nomore<<1)
rcall put_string
ldi r31, HIGH(txt0<<1)
ldi r30, LOW (txt0<<1)
rcall put_string
rcall plural
ldi r31, HIGH(nomore_txt1<<1)
ldi r30, LOW (nomore_txt1<<1)
rcall put_string
ldi r17, 99
rcall dec2ascii
ldi r31, HIGH(txt0<<1)
ldi r30, LOW (txt0<<1)
rcall put_string
rcall plural
ldi r31, HIGH(txt3<<1)
ldi r30, LOW (txt3<<1)
rcall put_string
idle:
; endless loop
rjmp idle
put_string:
; load character from string
lpm r16, Z+
; zero == eof
cpi r16, 0x00
breq put_string__no_more_characters
; transmit character
rcall put_char
; next character
rjmp put_string
put_string__no_more_characters:
ret
put_char:
; wait for empty buffer
sbis UCSRA,UDRE
rjmp put_char
; transmit character
out UDR, r16
ret
dec2ascii:
mov r18, r17
ldi r19, 0
cpi r18, 10
brlo dec2ascii_one_digit
dec2ascii_loop:
inc r19
subi r18, 10
cpi r18, 10
brsh dec2ascii_loop
rcall print_digit
dec2ascii_one_digit:
mov r19, r18
rcall print_digit
ret
print_digit:
ldi r16, '0'
add r16, r19
rcall put_char
ret
plural:
; 0 and 2-99 => 's', else => ''
cpi r17, 1
breq plural__only_one
ldi r16, 's'
rcall put_char
plural__only_one:
ret
txt0:
.db " bottle", 0x00
txt1:
.db " of beer on the wall, ", 0x00
txt2:
.db " of beer.", 0x0a, "Take one down and pass it around, ", 0x00
txt3:
.db " of beer on the wall.", 0x0a, 0x0a, 0x00
nomore:
.db "no more", 0x00
nomore_txt0:
.db "No more bottles of beer on the wall, ", 0x00
nomore_txt1:
.db " of beer. ", 0x0a, "Go to the store and buy some more, ", 0x00
Download Source | Write Comment
Download Source | Write Comment
Add Comment
Please provide a value for the fields Name,
Comment and Security Code.
This is a gravatar-friendly website.
E-mail addresses will never be shown.
Enter your e-mail address to use your gravatar.
Please don't post large portions of code here! Use the form to submit new examples or updates instead!
Comments
Wouldn't it be a good idea to give each one its own browser heading like the rest of
the assembly language entries?