- /*
- * cw5.4.asm
- *
- * Created: 2014-05-28 18:04:56
- * Author: Maciek
- */
- ;MOŻE NIE DZIAŁAć !!! Jak tak to prawdopodobnie trzeba zamienić 'rcall' na 'call' i 'rjmp' na 'jmp'
- .include "m32def.inc"
- .equ oczekiwanie=5 ;czas - mnożnik x10[ms]
- .equ odjemna=-6
- .equ odjemnik=3
- .cseg
- .org 0
- rjmp PROGRAM
- ;Deklaracja tablicy w pamięci FLASH
- .org 0x32
- digit: .DB 0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B, 0x77, 0x1F, 0x4E, 0x3D, 0x4F, 0x47
- ;Deklaracja komórki pamięci do programu czekania
- .dseg
- .org 0x60
- CZAS_10MS: .byte 1
- .cseg
- PROGRAM:
- ;Przygotowanie stosu
- ldi r16, high(RAMEND)
- out sph, r16
- ldi r16, low(RAMEND)
- out spl, r16
- ;Ustawienie wyjść
- ser r16
- out ddra,r16 ;port segmentów (potrzebne piny 6-0 -> 6-a...0-g)
- out ddrd,r16 ;port wyświetlaczy (potrzebne piny 3-0 -> 3-wyświetlacz lewy...0-wyświetlacz prawy)
- ;+ PD7 i PD6 na znak i flage 'overflow'
- ;Ustawienie wartości czasu oczekiwania (przepisanie przez pamięć RAM)
- ldi r16,oczekiwanie
- sts CZAS_10MS,r16
- ;Inicjalizacja rejestrów przechowujących wynik
- clr r23 ;high
- clr r22 ;low
- ;Zasadnicza część
- ldi r23,high(odjemna)
- ldi r22,low(odjemna)
- subi r22,low(odjemnik)
- sbci r23,high(odjemnik)
- brvs OVER ;Jeśli jest flaga overflow to zapal diode na D6
- P_DODATK:
- sbrc r23,7 ;sprawdź jaki jest znak liczby 16-bitowej, jeśli 0 przeskocz,...
- sbi portd,7 ;ale jeśli 1 (czyli '-') to zapal diode na D7
- ;Zamiana z U2 na binarny (liczenie modułu) TYLKO W PRZYPADKU LICZBY UJEMNEJ!!!
- sbrc r23,7 ;sprawdź jaki jest znak liczby 16-bitowej, jeśli 0 przeskocz,...
- rcall MODUL
- WYSWIETLANIE:
- rcall DISPLAY ;Wyświetlanie 16-bitowej liczby z R23:R22
- rcall WAIT
- rjmp WYSWIETLANIE
- OVER:
- sbi portd,6
- rjmp P_DODATK
- ;===========================================
- ; =====PODPROGRAMY=====
- ;===========================================
- ;Program wyświetlający w formacie HEX
- DISPLAY:
- push r16 ;Roboczy rejestr
- ;1111111111111111111111
- ;Pobranie, zdekodowanie znaku i wysłanie do segmentów pierwszego wyświetlacza
- mov r16,r23 ;Utworzenie kopii wartości
- andi r16,0xf0 ;Wyizolowanie wartości 4-bitowej
- swap r16
- rcall SHIFT_POINT ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
- lpm r16,z ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
- com r16 ;Negacja bitów (bo sterowanie zerem)
- out porta,r16 ;Wysłanie na port "segmentów"
- ;Włączenie pierwszego wyświetlacza
- ldi r16,0x08
- com r16
- out portd,r16
- ;2222222222222222222222
- ;Pobranie, zdekodowanie znaku i wysłanie do segmentów drugiego wyświetlacza
- mov r16,r23 ;Utworzenie kopii wartości
- andi r16,0x0f ;Wyizolowanie wartości 4-bitowej
- rcall SHIFT_POINT ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
- lpm r16,z ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
- com r16 ;Negacja bitów (bo sterowanie zerem)
- rcall LED_OFF
- out porta,r16 ;Wysłanie na port "segmentów"
- ;Włączenie drugiego wyświetlacza
- ldi r16,0x04
- com r16
- out portd,r16
- ;33333333333333333333333333
- ;Pobranie, zdekodowanie znaku i wysłanie do segmentów trzeciego wyświetlacza
- mov r16,r22 ;Utworzenie kopii wartości
- andi r16,0xf0 ;Wyizolowanie wartości 4-bitowej
- swap r16
- rcall SHIFT_POINT ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
- lpm r16,z ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
- com r16 ;Negacja bitów (bo sterowanie zerem)
- rcall LED_OFF
- out porta,r16 ;Wysłanie na port "segmentów"
- ;Włączenie trzeciego wyświetlacza
- ldi r16,0x02
- com r16
- out portd,r16
- ;44444444444444444444444
- ;Pobranie, zdekodowanie znaku i wysłanie do segmentów czwartego wyświetlacza
- mov r16,r22 ;Utworzenie kopii wartości
- andi r16,0x0f ;Wyizolowanie wartości 4-bitowej
- rcall SHIFT_POINT ;Ustawienie wskaźnika na wartość liczby w tablicy dekodującej
- lpm r16,z ;Pobranie wartości z komórki o adresie zawartym we wskaźniku
- com r16 ;Negacja bitów (bo sterowanie zerem)
- rcall LED_OFF
- out porta,r16 ;Wysłanie na port "segmentów"
- ;Włączenie czwartego wyświetlacza
- ldi r16,0x01
- com r16
- out portd,r16
- ;Sztuczne oczekiwanie, żeby wyrównać jasność świecenia
- ldi r16,25
- DODATK_OCZEK:
- dec r16
- brne DODATK_OCZEK
- rcall LED_OFF
- pop r16
- ret
- ;Wyłączenie wszystkich wyświetlaczy
- LED_OFF:
- push r16
- ldi r16,0x00
- com r16
- out portd,r16
- pop r16
- ret
- ;Przesunięcie wskaźnika
- SHIFT_POINT:
- ldi zh,high(2*digit)
- ldi zl,low(2*digit)
- push r16
- add zl,r16
- ldi r16,0
- adc zh,r16
- pop r16
- ret
- ;Podprogram czekający (odczytuje wartość do czekania z pamięci RAM - CZAS_MS)
- WAIT:
- push r16
- push r17
- push r18
- lds r16,CZAS_10MS
- LOOP1:
- ldi r17,60
- LOOP2:
- ldi r18,50
- LOOP3:
- dec r18
- brne LOOP3
- dec r17
- brne LOOP2
- dec r16
- brne LOOP1
- pop r18
- pop r17
- pop r16
- ret
- ;Zamiana liczby ujemnej w formacie U2 na binarny moduł
- MODUL:
- com r22
- com r23
- ldi r16,1
- ldi r17,0
- add r22,r16
- adc r23,r17
- ret