Wrocław 13.04.2015r.
Laboratorium z mikrokontrolerów
Kalkulator
Prowadzący:
dr hab. inż. Janusz Janiczek
Poniedziałek godz.11.15-12.45
Wykonał:
1. Bury Marcin 207560
1.Założenia projektowe:
Celem projektu było napisanie programu "kalkulator", który wykonywał następujące operacje arytmetyczne : dodawanie, odejmowanie, mnożenie. Kalkulator miał pracować w zakresie od -10 000 do 10 000. Wynik operacji miał być wyświetlany na wyświetlaczu.
2.Schemat blokowy
3.Kod programu:
#include "msp430.h" ; #define controlled include
NAME main ; module name
PUBLIC main ; make the main label vissible
; outside this module
ORG 0FFFEh
DC16 init ; set reset vector to 'init' label
RSEG CSTACK ; pre-declaration of segment
RSEG CODE ; place program in 'CODE' segment
init: MOV #SFE(CSTACK), SP ; set up stack
main: NOP ; main program
MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
OPER1 EQU 1143
ZNAK EQU '*'
OPER2 EQU 10
MOV #0,R4 ; ZEROWANIE REJESTROW
MOV #0,R5
MOV #0,R7 ;REJESTR DO POROWNYWANIA LICZB
;SPRAWDZAM CZY JEST UJEMNA
MOV #-1,R8 ;REJESTRY KTORE SLUZA DO WYSWIETLENIA
MOV #-1,R9 ;WYNIKU
MOV #-1,R10
MOV #-1,R11
MOV #-1,R12
MOV #OPER1,R4 ;DO REJESTROW PRZYPISUJE
MOV #OPER2,R5 ;WARTOSCI OPERANDOW
#if (ZNAK=='+')
ADD R4,R5 ;DODAWANIE
#elif (ZNAK=='-')
SUB R4,R5 ;ODEJMOWANIE
MOV.B #08H,LCDM6
#elif (ZNAK=='*') ;MNOZENIE ZE ZNAKIEM
MOV R4,MPYS ;ZAPISUJE DO 1 REJESTRU
MOV R5,OP2 ;ZAPISUJE DO 2 REJESTRU
NOP
MOV RESLO,R5 ;ZAPISUJE MLODSZE BITY DO R5
MOV RESHI,R6 ;ZAPISUJE STARSZE BITY DO R6
#endif
CMP R7,R5 ;POROWNUJE WYNIK DO 0
JN ujemne ; JESLI MNIEJSZY PRZECHODZI DO UJEMNE
CMP #10001,R5 ;SPRAWDZA CZY WYNIK MIESCI SIE W ZAKRESIE
JGE blad
know: ;ZAMIANA Z HEX NA DEC
dzies_tys: ;DZIESIATKI TYSIECY
INC R8 ;LICZNIK PRZEBIEGOW PETLI
CMP #10000,R5 ;POROWNUJE WYNIK Z 10 000
JGE dzies_t_sub ;JESLI JEST CONAJMNIEJ ROWNE SKOK
JMP tys ;JESLI NIE TO PRZEJSCIE DO TYSIECY
dzies_t_sub:
SUB #10000,R5 ;ODJECIE 10 000
JGE dzies_tys ;PONOWNE PRZEJSCIE DO dzies_tys
tys: ;TYSIACE
INC R9 ;LICZNIK PRZEBIEGOW PETLI
CMP #1000,R5 ;POROWNUJE WYNIK Z 1 000
JGE tys_sub ;JESLI JEST CONAJMNIEJ ROWNE SKOK
JMP seti ;JESLI NIE TO PRZEJSCIE DO setki
tys_sub:
SUB #1000,R5 ;ODJECIE 1 000
JGE tys ;PONOWNE PRZEJSCIE DO tys
setki: ;SETKI
INC R10 ;LICZNIK PRZEBIEGOW PETLI
CMP #100,R5 ;POROWNUJE WYNIK ZE 100
JGE setki_sub ;JESLI JEST CO NAJMNIEJ ROWNY SKOK
JMP dzies ;JESLI NIE PRZEJSCIE DO dzies
setki_sub:
SUB #100,R5 ;ODJECIE 100
JMP setki ;PONOWNE PRZEJSCIE DO setki
dzies: ;DZIESIETNE
INC R11 ;LICZNIK PRZEBICZNIK PRZEGOW PETLI
CMP #10,R5
JGE dzies_sub
JMP jed ;SKOK DO jed
dzies_sub:
SUB #10,R5 ;ODJECIE 10
JMP dzies ;PONOWNE PRZEJSCIE DO dzies
jed: ;JEDNOSCI
INC R12 ;LICZNIK PRZEBIEGOW PETLI
CMP #1,R5
JGE jed_sub
JMP wyswietl ;PRZEJSCIE DO wyswietl
jed_sub:
SUB #1,R5 ;ODJECIE 1
JMP jed ;PONOWNY SKOK DO jed
ujemne:
MOV.B #08H,LCDM6 ;WYSWIETLENIE MINUSA
MOV R5,MPYS ;MNOZENIE PRZEZ -1
MOV #-1,OP2 ;WYNIK JEST DODATNI
NOP
MOV RESLO,R5 ;ZAPISANIE WARTOSCI DO R5
JMP know ;PRZEJSCIE DO MIEJSCA ZAMIANY Z HEX NA DEC
wyswietl:
MOV.B #0FFH,LCDACTL ;WLACZANIE WYSWIETLACZA
MOV.B tab(R8),LCDM5
MOV.B tab(R9),LCDM4
MOV.B tab(R10),LCDM3
MOV.B tab(R11),LCDM2
MOV.B tab(R12),LCDM1
JMP koniec
blad: ;DEKLARACJA NAPISU ERROR
MOV.B #0FFH,LCDACTL ;WLACZANIE WYSWIETLACZA
MOV.B #0ADH,LCDM5 ;WYSWIETLENIE E
MOV.B #0BBH,LCDM4 ;WYSWIETLENIE R
MOV.B #0BBH,LCDM3 ;WYSWIETLENIE R
MOV.B tab,LCDM2 ;WYSWIETLENIE O
MOV.B #0BBH,LCDM1 ;WYSWIETLENIE R
JMP koniec
tab: ;DEKLARACJA TABLICY ZNAKOW
DB 0B7H ;0
DB 12H ;1
DB 8FH ;2
DB 1FH ;3
DB 3AH ;4
DB 3DH ;5
DB 0BCH ;6
DB 13H ;7
DB 0B7H ;8
DB 3FH ;9
koniec:
JMP $ ; jump to currentlocation '$'
;(endlessloop)
END
4.Wnioski:
Program spełnia założenia projektowe. W przypadku przekroczenia zakresu, na wyświetlaczu pojawi się napis ERROR. Projekt jest oddany na 1 zajęciach po terminie.