Pomoc w zadaniu DSM-51

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
pomidor666
-
Posty: 4
Rejestracja: 16 cze 2011, 15:37
Lokalizacja: łdz

Pomoc w zadaniu DSM-51

Post autor: pomidor666 » 16 cze 2011, 15:40

Witam mam dosc powazny problem , nasz Profesor od mikrokontrolerów dał nam po zadaniu w celu zaliczenia semestru.

Otoz nie mam bladego pojecia jak to napisac zeby mialo to rece i nogi a najwazniejsze aby działało. Jesli ktos ma na tyle czasu aby wytlumaczyc to w sposob "łopatologiczny" bede bardzo wdzieczny. POniżej treść zdania

Kod: Zaznacz cały

Napisz program dokonujacy zmiany pobranej z klawiatury matrycowej liczby dziesiętnej ( 0 - 99d) na liczbę binarną. Na wyswietlaczu należy wyswietlić obydwie liczyby ( np. 99d = 01100011b)

Program nie powinien umozliwiac pobraniie liczb wiekszych od 9.

keruseykaryu

Post autor: keruseykaryu » 16 cze 2011, 17:38

pomidor666 pisze:Witam mam dosc powazny problem , nasz Profesor od mikrokontrolerów dał nam po zadaniu w celu zaliczenia semestru.

Otoz nie mam bladego pojecia jak to napisac zeby mialo to rece i nogi a najwazniejsze aby działało.
To coście na lekcjach robili. Grali w statki albo w piłkarzyki... Na szybko przerabiasz lekcje z książki: 4, 6, 8 i 9. Doro.

pomidor666
-
Posty: 4
Rejestracja: 16 cze 2011, 15:37
Lokalizacja: łdz

Post autor: pomidor666 » 16 cze 2011, 19:00

wlasnie o to chodzi ze nie za wiele i na tym polega najwiekszy problem ;/

[ Dodano: 2011-06-17, 09:43 ]
z gory sorry ze post pod postem .
Coś takiego wymyslilem , ale nie mam bladego pojecia zeby zrobic to tak jak jest w tresci zadanka :(

Kod: Zaznacz cały

LJMP START 
ORG 100H 

START: 


POB_ARG_1: ; pobiera pierwsza cyfre z liczby dwucyfrowej 

 LCALL WAIT_KEY ; pobranie pierwszej czesci liczby dwucyfrowej z klawiatury

 MOV R1, A ; zapamietaj w R1 
 SUBB A, #10 ; odejmij od pobranej liczby 10. Jesli liczba jest <=9 to C=1 
 JNC POB_ARG_1 ; jesli jednak C=0, znaczy liczba >9 to wracaj i pobieraj do skutku 




POB_ARG_2: ; pobiera pierwsza cyfre z liczby dwucyfrowej 

 LCALL WAIT_KEY ; pobranie drugiej czesci liczby dwucyfrowej z klawiatury

 MOV R2, A ;zapamietaj w R2 
 SUBB A, #10 ; odejmij od pobranej liczby 10. Jesli liczba jest <=9 to C=1 
 JNC POB_ARG_2 ; jesli jednak C=0, znaczy liczba >9 to wracaj i pobieraj do skutku 

 MOV A, R1 ; skopiuj zawartosc R1 do akumulatora 
 SWAP A ; zamiana połówek akumulatora
 ADD A, R2 ; dodaj zawarosc R2 do akumulatora

 LCALL WRITE_HEX ; wyswietl na LCD zawartosc akumulatora

 MOV A, # '=' ; wpisanie znaku "=" do akumulatora 
 LCALL WRITE_DATA ; wyswietl znak "=" jako daną na LCD




LJMP $

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 17 cze 2011, 13:49

Kolejny użytkownik, który rejestruje się tylko po to by mu załatwić zaliczenie przedmiotu.

Jeżeli kolega nie zada konkretnego pytania i nie poda z czym dokładnie ma problem (nie w stylu, zróbcie za mnie). To temat wyląduje w koszu.

pomidor666
-
Posty: 4
Rejestracja: 16 cze 2011, 15:37
Lokalizacja: łdz

Post autor: pomidor666 » 17 cze 2011, 15:43

wiec zadaje pytanie ...


Co dalej ? bo moja wiedza z dziedziny asemblera juz sie wyczerpała.

Jesli takowe pytanie nie odpowiada to poproszę o kosz :]

keruseykaryu

Post autor: keruseykaryu » 17 cze 2011, 17:01

pomidor666 pisze:wiec zadaje pytanie ... Co dalej ?
Symulacja z pomocą Jagody.

pomidor666
-
Posty: 4
Rejestracja: 16 cze 2011, 15:37
Lokalizacja: łdz

Post autor: pomidor666 » 17 cze 2011, 20:43

coś takiego , jeszcze tylko BIN dopracowac... i chyba bedzie ok . Moze ktos na to zerknac i dać jakies swoje sugestie/uwagi ??

Kod: Zaznacz cały

BCD      EQU 20H                           ; komórka zawierająca daną w kodzie BCD
BIN      EQU 21H                            ; komórka zawierająca daną w kodzie NB (wynik wykonaniaprogramu)      

        
LJMP START 
ORG 100H 

START: 
    

POB_ARG_1:     ; pobiera pierwsza cyfre z liczby dwucyfrowej 
    
    LCALL WAIT_KEY 	; pobranie pierwszej czesci liczby dwucyfrowej z klawiatury
    
    MOV R3, A ; zapamietaj w R1 
    SUBB A, #10 ; odejmij od pobranej liczby 10. Jesli liczba jest <=9 to C=1 
    JNC POB_ARG_1 ; jesli jednak C=0, znaczy liczba >9 to wracaj i pobieraj do skutku 


  

POB_ARG_2:     ; pobiera pierwsza cyfre z liczby dwucyfrowej 
    
    LCALL WAIT_KEY ; pobranie drugiej czesci liczby dwucyfrowej z klawiatury
    
    MOV R4, A ;zapamietaj w R2 
    SUBB A, #10 ; odejmij od pobranej liczby 10. Jesli liczba jest <=9 to C=1 
    JNC POB_ARG_2 ; jesli jednak C=0, znaczy liczba >9 to wracaj i pobieraj do skutku 

    MOV A, R3 	; skopiuj zawartosc R1 do akumulatora	
    SWAP A 	; zamiana połówek akumulatora
    ADD A, R4 	; dodaj zawarosc R2 do akumulatora
    MOV R6, A
   LCALL WRITE_HEX	; wyswietl na LCD zawartosc akumulatora
  MOV A, # 'D'
    LCALL WRITE_DATA
    MOV A, # '='	; wpisanie znaku "=" do akumulatora 
    LCALL WRITE_DATA	; wyswietl znak "=" jako daną na LCD


		MOV BCD, R6  ; przeniesienie zapamietanej liczby bcd do rejestru r6
                MOV A,BCD		
               MOV R0,#BCD                 ; do R0 adres komórki z daną wejściową
               MOV R1,#BIN                  ; do R1 adres komórki z daną wyjściową
               ACALL BCD DO BIN            ; zamień na postać binarną

               MOV A,BIN
               LCALL WRITE_HEX
	MOV A, #'H'
	LCALL WRITE_DATA
	MOV A, #'E'
	LCALL WRITE_DATA
	MOV A, #'X'
	LCALL WRITE_DATA
               LJMP $
 
BCD DO BIN:
                MOV @R1,#0                ; wyczyść komórkę BIN
                MOV A,@R0                 ; BCD do ACC
                SWAP A                        ; zamień połówki
                ANL A,#0FH                 ; wyzeruj mniej znaczącą cyfrę
                JZ BCD DO BIN1               ; jeśli starsza cyfra jest zerem to skocz dalej
                MOV R2,A                    ;  w R2 ilość powtórzeń                           
                CLR C
BCD DO BIN2:
                MOV A,@R1                ; BIN do ACC
                ADDC A,#10                  
                MOV @R1,A                ; wynik do BIN
                DJNZ R2,BCD DO BIN2    ; dodawaj 10 tyle razy ,ile wynosi starsza cyfra
BCD DO BIN1:
                MOV A,@R0                ;BCD do ACC
                ANL A,#0FH                 ; wyzeruj starszą cyfrę
                ADD A,@R1                  ; dodaj do BIN
                MOV @R1,A                 ; wynik do BIN
                RET

keruseykaryu

Post autor: keruseykaryu » 17 cze 2011, 21:18

Program, może i działający, nie będzie spełniał jednego z wymogów zadania:
pomidor666 pisze:Napisz program dokonujacy zmiany pobranej z klawiatury matrycowej liczby dziesiętnej ( 0 - 99d) na liczbę binarną.
Założyłeś, że liczba BCD to liczba dziesiętna, ok, będzie łatwiej, ale wynikiem ma nie być liczba HEX tylko po kolei bity jako BIN. Całe WRITE_HEX możesz sobie wywalić, bo to nie to.
Nie ma w biosie DSM odpowiedniej funkcji, ale łatwo ją napisać: rotować ACC, i drukować na ekranie po kolei co jest w CY. Myślę, że tyle wystarczy i ruszysz głową by to napisać.

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1375
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 17 cze 2011, 21:36

Może to pomoże:
http://www.programuj.com/artykuly/rozne/sysliczb.php

W skrócie: dzielisz przez 2, spisujesz resztę, zapamiętujesz resztę, dzielisz, spisujesz, zapamiętujesz. Na końcu (jak już iloraz będzie równy 0) to wypisujesz reszty od końca.

ODPOWIEDZ