/* * 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