dsm-51 prezentacja liczb binarnie

0

ok postaram sie krotko i zwęźle
musze napisac program (w jagodzie) ktory bedzie konwertował liczbę dziesiętną na liczbe binarną. zakres wprowadzanych loiczb do 40 bitow

oczywiscie nie chce programu podanago na tacy. chce sie czegos nauczyc. ale przerylem ksiazke i neta i nie moge znaleŹĆ jak na wyswietlaczu lcd zaprezentowac liczbe binarnie.

czy idzie tak zrobic? ze podam mu liczbe a on ja wyswietli binarnie? i czy ktos zna na to odpowiedz? </b>

0

No w dsm51 nie ma gotowca na zapis binarnych na lcd (jak np przy hexach - WRITE_HEX) nie ma chyba innej rady jak samemu napisac dekodowanie liczb do binnarnych :) czyli milej zabawy z asemblerkiem :P

0

sama konwersja jest bardzo prosta
dzielisz liczbę dziesiętną przez 2 i zapisujesz resztę (czyli np rrc, reszta w C)
te reszty wrzucasz do jakiejś tablicy i gdy już podzielisz tyle razy, że liczba zmaleje do zera to odczytujesz tablicę od tyłu i masz wynik w NKB

0

na razie zrobilem tak ze wypisuje liczby na ekran. mozna przesuwac ekranem. na 'esc' zrobilem ze cofa kursor i mozna poprawic blad :P (ale checa hehehe).
no wiem co i jak z tym dzieleniem. ale nie za bardzo kumam jak to wprowadzic w zycie. dziekuje za odpowiedzi . ale bardzo prosze (jesli mozna :) ) troche jasniej

hehe

pozdrawiam

to jest to :

LJMP	START
ORG	100H

START:

MOV	R0,#LCDWC	;adres wpisu instrukcji
MOV	R1,#LCDRC	;adres odczytu stanu

MOV	A,#1		;kasuj dane wywietlacza
ACALL	WRITE

MOV	A,#0FH		;wĄcz wywietlacz,kursor
ACALL	WRITE		;i mruganie kursora

MOV	A,#06H		;ustaw kierunek
ACALL	WRITE		;przesuwania si? kursora

INC	R0		;adres wpisu danych
MOV	DPTR,#TEXT	;adres tekstu

WRITE_TXT:
CLR A ;pobranie kolejnego
MOVC A,@A+DPTR ;znaku tekstu
JZ TEXT_END ;bajt=0 - koniec tekstu

ACALL	WRITE		;wpisanie na wywietlacz
INC	DPTR		;modyfikacja adresu
			;pobrania kolejnego znaku
SJMP	WRITE_TXT	;pobierz kolejny znak

TEXT_END:
DEC R0 ;adres wpisu instrukcji
MOV DPTR,#KEY_COD ;adres tabeli kodowania
;klawiszy

LOOP: ;p?tla reakcji na klawisze

LCALL	WAIT_KEY	;pobierz klawisz

CJNE	A,#0FH,NEXT		;czy klawisz 'ENTER'

ENTER: ;klawisz 'ENTER'
MOVX A,@R1
JB ACC.7,ENTER ;oczekiwanie na BUSY=0

; tu ma byc wlasnie opcja dzielenia

SJMP	LOOP

NEXT:
MOV R2,A ;zapami?taj klawisz
MOVC A,@A+DPTR ;przekoduj klawisze
;na instrukcje
JZ WRITE_DAT ;0-klawisz jako dane

ACALL	WRITE		;wysanie instrukcji
SJMP	LOOP

WRITE_DAT: ;wpisz znak na LCD
MOV A,R2 ;odtw˘rz klawisz
ADD A,#30H ;modyfikuj jako znak
INC R0 ;adres wpisu danych
ACALL WRITE ;wpisanie znaku na LCD
DEC R0 ;adres wpisu instrukcji
SJMP LOOP

;**************************************
;Podprogram wpisu danych lub instrukcji
;na wywietlacz LCD
;Zakada prawidowe adresy w R0 i R1

WRITE:
MOV R2,A ;przechowanie danych
BUSY:
MOVX A,@R1 ;odczyt stanu
JB ACC.7,BUSY ;oczekiwanie na BUSY=0
MOV A,R2 ;odtworzenie danych
MOVX @R0,A ;wysanie danych
RET

;**************************************
;Tabela przekodowania numeru klawisza
;na instrukcj?, 0->klawisz jako znak
KEY_COD:
DB 0,0,0 ;0,1,2
DB 0,0,0 ;3,4,5
DB 0,0,0 ;6,7,8
DB 0,1CH,18H ;9,<,>
DB 06H,07H,10H ;^,v,Esc
DB 0 ;Enter

;**************************************
TEXT:

DB	' ',0

ps. taka mala rzecz a cieszy (mozliwosciami)

0

z tego co pamiętam to się robiło mniejwięcej tak:
A:liczba dziesiętna, R0-początek adresu w pamięci, gdzie umieszczać wynik
petla:
rrc A //rotacja, wpisanie reszty do C
mov @R0,C //wpisanie wartości C pod adres
inc R0 //zwiększenie adresu
clr C //wyczyszczenie C
jnz petla //powtarzaj do czasu wyzerowania A

po wyjściu z pętli wrzucasz na LCD to co w komórkach od aktualnego adresu R0, aż do jego adresu początkowego (oczywiście odpowiednio je formatując na znaki)

0

zamiane na dwójkowy zrobilem tak:

LJMP	START1
ORG	100H

START1:

MOV	R0,#LCDWC	;adres wpisu instrukcji
MOV	R1,#LCDRC	;adres odczytu stanu
LCALL	LCD_CLR

START2:

MOV	R7,#10

LJMP	DZIEL

DZIEL:
MOV A,R7 ;wpisz dzielnĄ do A

MOV	B,#2		;wpisz dzielnik do B
DIV	AB		;dzielenie A/B
			;wynik dzielenia w A
			;- cyfra dziesiĄtek z 63
			;reszta z dzielenia w B
			;czyli cyfra jednostek
MOV	R7,A
MOV	R4,B
CJNE	A,#01,DALEJ

POPRAWA:
CJNE R4,#00,DO11
MOV A,#'0'
LCALL WRITE_DATA
MOV A,#'1'
LCALL WRITE_DATA
CJNE A,#00,KONIEC
DO11:
MOV A,#'1'
LCALL WRITE_DATA
MOV A,#'1'
LCALL WRITE_DATA
CJNE A,#00,KONIEC

KONIEC:
MOV A,#'.'
LCALL WRITE_DATA
LJMP $

DALEJ:
MOV A,B
CJNE A,#01,ZERO

LOOP4:

MOV	A,#'1'
LCALL	WRITE_DATA
LJMP	DZIEL

ZERO:
MOV A,#'0'
LCALL WRITE_DATA
LJMP DZIEL

nie wiem tylko jak zrobic zeby nie wyswietlalo od konca. bo teraz wyswietla tak jak dzieli przez 2 . pokolei. no i trzeba to odczytywac od prawej do lewej.

i jeszcze nie wiem jak pobrac stan wyswietlacza. bo pobierajac to to trzeba to jeszcze jakos przekonwertowac. i nie wiem jak to zrobic.

ale zaliczenie juz mam wiec pobawie sie w to kiedy indziej. jak znajde czas.

dzieki za pomoc

pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1