AVR Assembler Övningsexempel 4 (7 / 9 steg)
Steg 7: Final version av koden
;********************************
; Skrivet av: 1o_o7
; datum: < 2014|11|02 >
; version: 2.0
; filen sparas som: paradise2.asm
; för AVR: atmega328p
; klockfrekvens: 16MHz
;********************************
; Programmera funcion:---
;
; En tärning roller
;
; Lysdioderna på PC0 till 5
; och en center på PB1
; Knappen på PB0
; anoder på PB4 och PB5
;
; Lade till makro och uppslagstabeller
;
;--------------------------------
.nolist
.include ". / m328Pdef.inc"
.lista
;=================
; Förklaringar:
.def temp = r16
.def flödar över = r17
def die1 = r18
def die2 = r19
.def millisekunder = r20
.def utsäde = r21
.Macro fördröjning
CLR svämmar över
LDI millisekunder
sec_count:
cpse flödar över, millisekunder
rjmp sec_count
.endmacro
;=================
; Början av Program
.org 0x0000
rjmp Reset; rjmp tar 2 cykler, jmp tar 3
.org 0x0020; Timer0 spill handler
rjmp overflow_handler
nummer:
DB 0b01111111, 0b11011110, 0b01011110, 0b11010010
DB 0b01010010, 0b11000000
;=================
Reset:
LDI temp, 0b00000011
ut TCCR0B, temp; TCNT0 i FCPU/64-läge, 2500000 cnts/SEK
LDI temp, 249
ut OCR0A, temp; toppen av counter så 250 räknas/spill
; så Buffertspill inträffar varje 1/1000 SEK
; Detta innebär ett dataspill varje 1ms
LDI temp, 0b00000010
ut TCCR0A, temp; återställa TCNT0 längst upp på OCR0A
STS TIMSK0, temp; Aktivera timern Overflow avbryter
SEI; Aktivera global avbryter
LDI temp, 0b11111110
ut DDRB, temp; PB0 ingång resten utdata
LDI temp, 0b11111111
ut DDRC, temp; PortC alla utgång
viktigaste:
ser temp
ut PORTB, temp; alla PortB på 5V
ut PORTC, temp; alla PortC på 5V
rcall button_push; vänta tills knappen
rcall random; få rand tal die1, die2
rcall dice; Ställ in tärningarna lysdioder
ser härda; Set temp för bära
rcall cykel. Animera tärningar kasta
rcall displayen. Visa resultatet
rjmp huvudsakliga
button_push:
sbic PINB, 0; hoppa över om PB0 är GND
rjmp button_push
ret
Random:
; att generera slumptal
Lägg till die1, utsäde
swap utsäde
dröjsmål 37
Lägg till die2, utsäde
CLC
D1:
CPI die1, 6. Jämför die1 med 5
brlo d2; om die1 < 6 rulla sedan
Johan die1, 6. annars subtrahera 6
rjmp d1; gå tillbaka och jämföra igen
D2:
CPI die2, 6. Jämför die2 med 6
brlo rullen. om die < 6 då rulla
Johan die2, 6. annars subtrahera 6
rjmp d2; gå tillbaka och jämföra igen
rulle:
Inc die1; Lägg till 1 så mellan 1 och 6
Inc die2
ret
Dice:
LDI ZH, high(2*numbers)
LDI ZL, low(2*numbers)
LDI temp, 0
Kolla:
inkl härda; Increment temp
CP die1, temp; Jämför die1 med 1
brne PC + 2. om inte lika inte ställa in die1
LPM die1, Z; Ladda die1 med nummer 1
CP die2, temp; Jämför die2 med 1
brne PC + 2. om inte lika inte ställa in die2
LPM die2, Z; Ladda die2 med nummer 1
CPI temp, 6. om temp klar 6 vi
breq PC + 3. om lika går till ret
adiw ZL, 1; öka till nästa nummer
rjmp kontroll. i uppslagstabellen
ser härda; Återställ temp
ret
cykel:
rol härda; Shift bitar kvar med sjal runt omkring
dröjsmål 50
SEK; SREG bär flaggan
ut PORTC, temp; PortC börjar som 0b11111110
sbrc temp, 6. hoppa över om bit 6 rensas
rjmp cykel. annars loop tillbaka upp
ret
display:
SBI PORTB, 0; SET-knappen off
SBI PORTB, 1. stänga av centrera ledde
SBI PORTB, 4. Aktivera die1
CBI PORTB, 5. stänga av die2
SBRs die1, 7. hoppa över om center ledde bort
CBI PORTB, 1. slå på center ledde om det behövs
ut PORTC, die1; slå på andra
dröjsmål 2. kort fördröjning
SBI PORTB, 1. stänga av centrera ledde
CBI PORTB, 4. stänga av die1
SBI PORTB, 5. Aktivera die2
SBRs die2, 7. hoppa över om center ledde bort
CBI PORTB, 1. slå på center ledde om det behövs
ut PORTC, die2; slå på andra
dröjsmål 2. kort fördröjning
sbic PINB, 0; utgång till main om knappen trycker
rjmp displayen. slinga till toppen
ret
overflow_handler:
Inc översvämningar; ökar värdet 1000 gånger / SEK
Lägg till utsäde, svämmar över
Reti