ASEMBLER dzielenie na cyfry setek, dziesiątek, jedności - Transmisja szeregowa 8051

0

Mam za zadanie napisać dodawanie/odejmowanie/możenie liczb za pomocą transmisji szeregowej. Podajemy liczbę w takiej postaci np. 123+045=, mam na razie to na jedną cyfrę np. 003+004= po zsumowaniu wynosi 7. I moje pytanie brzmi w jaki sposób mógłbym uzyskać liczbę setek, dziesiątek, jedności? Można by było wziąć pierwsza cyfrę tj. 1 i pomnożyć ją przez 100(w jaki sposób?) i dodać do niej następną tj. 2 razy 10 a później 3 razy 1 zapisać ją, a potem kolejna cyfra? Następnie w jakiś sposób wykonać na niej działania i z powrotem wyświetlić wynik w prawidłowej postaci?

0

Hmmm to chyba bardziej tutaj chodzi o właściwy odbiór przesyłanych transmisją szeregową liczb, zgadza się?

0
MasterBLB napisał(a):

Hmmm to chyba bardziej tutaj chodzi o właściwy odbiór przesyłanych transmisją szeregową liczb, zgadza się?

Tak, dokładnie. Następnie muszę dokonać na nich określonych operacji arytmetycznych i z powrotem wysyłać.

0

Masz gdzieś dokumentację protokołu jakim będą słane dane, albo nazwę oraz parametry jeśli to jakiś ustandaryzowany, np RS-232?

0

Asynchroniczna szeregowa, prędkość 9600, 8 bitów danych, 1 bit stopu i brak kontroli parzystości.
Mam coś takiego, planowałem żeby docelowo działało to na dwóch liczbach trzycyfrowych z wynikiem do 256, na razie wpadłem na taki pomysł, mamy np (123?056?) ?-znak +*= i brać najpierw pierwszy bit od lewej tj(1) i mnożyć go razy 100 następnie dodać do tego drugi bit(2) pomnożyć przez 10 a następnie 3 razy 1, przechować gdzieś tą liczbę i powtórzyć to samo z drugą i wykonać operację arytmetyczną. Oczywiście gorzej z wykonaniem tego pomysłu.

_RECV_FLG BIT 00h	;Flaga otrzymania danych
_SEND_FLG BIT 01h	;Flaga wysłania danych

_RECV_BUF DATA 030h 	;bufor otrzymanych danych
_RECV_BUF_INDEKS DATA 030	;indeks danych(iterator)
ORG 0000h
_RESET:
	LJMP _INIT

ORG 0023h 
_INT_SERIAL:
	JB TI,_INT_SERIAL_TI
	
_INT_SERIAL_RI:
	MOV A,#_RECV_BUF
	INC _RECV_BUF_INDEKS
	ADD A,_RECV_BUF_INDEKS
	
	MOV R1, A
	MOV A, SBUF
	MOV SBUF, A
	MOV @R1, A
	
	CLR RI
	SETB _RECV_FLG
	RETI
	
_INT_SERIAL_TI: 
	CLR TI
	;SETB _SEND_FLG
	RETI
	
ORG 0100h
_INIT:
	MOV SCON,#01010000b
	
	ANL TMOD, #00101111b
	ORL TMOD, #00100000b
	
	MOV TL1,#0FDh
	MOV TH1,#0FDh
	ANL PCON,#01111111b
	CLR TF1
	SETB TR1
	
	SETB ES
	SETB EA
	
	CLR _RECV_FLG
	CLR _SEND_FLG
	MOV _RECV_BUF,#0d
	MOV _RECV_BUF_INDEKS,#0d
	
	MOV R0,#0FF81H
	MOV R4,#0FF82H
	
_LOOP:
	JNB _RECV_FLG,_LOOP10
	MOV A,_RECV_BUF_INDEKS
	CLR CY
	SUBB A,#8d
	JC _LOOP5
	LCALL _CALCULATE

_LOOP5:
	CLR _RECV_FLG

_LOOP10:
	JNB _SEND_FLG,_LOOP
	CLR _SEND_FLG
	
	MOV A,R7
	INC R7

	MOVC A,@A+DPTR 
	JZ _LOOP
	MOV SBUF,A 
	LJMP _LOOP
	
_CALCULATE: 
	CPL P1.7
	
	MOV A, #_RECV_BUF	;wkładamy dane do akumulatora np(004?001=)
	ADD A,#3d			;przechodzimy na wartosc 3 bitu od lewej strony(4)
	MOV R1,A
	MOV A,@R1
	SUBB A,#48d			;zamieniamy z ASCII
	MOV R6,A

	MOV A, #_RECV_BUF	;kolejna cyfra
	ADD A,#7d 			;7 bit(1)
	MOV R1,A
	MOV A,@R1
	SUBB A,#48d			;zmiana z ASCII
	
	ADD A,R6			;dodajemy obie cyfry

	ADD A,#48d			;zamiana na ASCI
	MOV SBUF, A			;zapisanie do rejestru wyjściowego
	
	MOV _RECV_BUF_INDEKS,#0d

	RET	
END
0

W transmisji o takich parametrach jak podajesz będzie szło:

  • bit startu
  • 8 bitów danych, czyli liczba 0-255
  • bit stopu, skoro parzystości nie masz
    więc po wykryciu ustawionego bitu 1 oznaczającego rozpoczętą transmisję czytasz 8 bitów do bufora, i masz dzięki temu całą liczbę nr 1. Potem to samo dla znaku, i drugiej liczby.

Co to w ogóle jest za asembler i procesor? Bo po nazwach rejestrów sądząc na x86 to nie wygląda.

0

Mikrokontroler 8051

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.