Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .CSEG
- .ORG 0x00
- rjmp prg
- .ORG 0x32
- sevenseg: .DB 0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71
- //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
- .DSEG
- .ORG 0x120
- high_counter: .BYTE 1
- low_counter: .BYTE 1
- .CSEG
- .ORG 0x100
- prg:
- //Inicjalizacja stosu
- ldi r16, high(ramend)
- out sph, r16
- ldi r16, low(ramend)
- out spl, r16
- ///////////
- ldi r16, 0xff
- out ddrd, r16 ;Ustawienie portu D na wyjście
- ldi r16, 0x00
- ldi r17, 0x00
- main:
- sts low_counter,r16 ;Zapisanie wartości licznika przed wysłaniem do display
- sts high_counter,r17
- ldi r18, 0x15 ;Wielokrotne wywołanie display, by licznik działał z częstotliwością ok. 1 --- 85 * 4 * 0.0029296875s = 1s ---- r19 = 0x55
- inner:
- call display
- dec r18
- brne inner
- ldi r18, 0x01 ;Inkrementowanie bitów mniej znaczących
- add r16, r18
- ldi r18, 0x00 ;Inkrementowanie bitów bardziej znaczących (dodawanie reszty)
- adc r17, r18
- rjmp main
- //Wyświetl wartość licznika
- display:
- push r16
- push r17
- push r18
- push r19
- lds r16,low_counter ;Załaduj wartość licznika
- lds r17,high_counter
- ///////////////
- ldi r18, 0x01 ;Uaktywnij pierwszą cyfrę
- out ddrb, r18
- ldi ZL,low(2*sevenseg)
- ldi ZH,high(2*sevenseg)
- mov r18,r16 ;Kopiuj wartość low licznika
- andi r18,0x0f ;Weź mniej znaczący bit
- ldi r19,0x01
- add r18,r19 ;Dodaj jeden, by pętla się nie zjebała (dla r19 = 0 będzie dec 1)
- choose_1:
- lpm r19, Z+ ;Pobieranie zawartości rejestru Z (kody kolejnych cyfr wyświetlacza) tak długo, aż dostanie wymaganą
- dec r18
- brne choose_1
- out portd, r19
- call wait
- ///////////////
- ldi r18, 0x02 ;Uaktywnij drugą cyfrę
- out ddrb, r18
- ldi ZL,low(2*sevenseg)
- ldi ZH,high(2*sevenseg)
- mov r18,r16 ;Kopiuj wartość low licznika
- swap r18
- andi r18,0x0f ;Weź bardziej znaczący bit
- ldi r19,0x01
- add r18,r19 ;Dodaj jeden, by pętla się nie zjebała (dla r19 = 0 będzie dec 1)
- choose_2:
- lpm r19, Z+ ;Pobieranie zawartości rejestru Z (kody kolejnych cyfr wyświetlacza) tak długo, aż dostanie wymaganą
- dec r18
- brne choose_2
- out portd, r19
- call wait
- //////////////
- ldi r18, 0x04 ;Uaktywnij trzecią cyfrę
- out ddrb, r18
- ldi ZL,low(2*sevenseg)
- ldi ZH,high(2*sevenseg)
- mov r18,r17 ;JW tylko z wartościa high licznika
- andi r18,0x0f
- ldi r19,0x01
- add r18,r19
- choose_3:
- lpm r19, Z+
- dec r18
- brne choose_3
- out portd, r19
- call wait
- //////////////
- ldi r18, 0x08 ;Uaktywnij czwartą cyfrę
- out ddrb, r18
- ldi ZL,low(2*sevenseg)
- ldi ZH,high(2*sevenseg)
- mov r18,r17
- swap r18
- andi r18,0x0f
- ldi r19,0x01
- add r18,r19
- choose_4:
- lpm r19, Z+
- dec r18
- brne choose_4
- out portd, r19
- call wait
- //////////////
- pop r19
- pop r18
- pop r17
- pop r16
- ret
- //256*256*80 --- ok. 1s
- //Czekaj 0.0029296875s
- wait:
- push r16
- push r17
- /******************/
- ldi r16,0xff
- loop_1:
- ldi r17,0x3C
- loop_2:
- dec r17
- brne loop_2
- dec r16
- brne loop_1
- /******************/
- pop r17
- pop r16
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement