| Author |
Message
|
jareks91 Poziom 18

Joined: 30 Dec 2004 Posts: 570 Location: Milówka
|
#1
13 Mar 2008 22:27 Wyświetlanie liczb na LCD w asamblerze |
|
|
|
Witam,
Czy ktoś mogby podzielić się procedurą ktora optymalnie wyświetla liczbe ktorą posiadam w zmiennej np licz=223 na wyswietlaczu LCD oczywiscie napisaną w asamblerze.
Pojedyncze znaki i stringi zapisane w programie potrafie wyswietlać natomiast nie wiem jak ze zeminnymi.
z góry dziękuje.
|
|
| Back to top |
|
 |
tplewa Poziom 22

Joined: 01 Jul 2003 Posts: 1721 Location: Kamienna Góra/Wawa
|
|
| Back to top |
|
 |
Google

|
#
13 Mar 2008 22:42 |
|
|
|
|
|
| Back to top |
|
 |
jareks91 Poziom 18

Joined: 30 Dec 2004 Posts: 570 Location: Milówka
|
#3
13 Mar 2008 22:45 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
Potrzebowałbym to do procesora at89s2051 czyli 51' i dla wysiwtlacza LCD ze sterownikiem hd44780 czyli standardowym.
I to bylaby raczej liczba 4 bajtowa umieszczana gdzieś w pamięci czy ktoś ma jakiś pomysł jak wyłuskać poszczególne cyfry tej liczby i wysłąć na LCD?
z góry dziękuje
|
|
| Back to top |
|
 |
Pokey Poziom 15

Joined: 28 Jun 2003 Posts: 205 Location: Rzeszów
|
#4
13 Mar 2008 23:53 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
Sposób który pierwszy narzuca się aby liczbę przedstawić w postaci tekstu to znaleźć ilość jednostek, dziesiątek, setek, tysięcy, itd... w danej liczbie (dzieląc przez 1000,100,10). Następnie te znaki pozostaje już tylko "przesunąć" do znaków ASCII, a wiec dodać 0x30.
Dla przykładu mamy liczbę 123, liczba setek: 1, liczba dziesiątek 2, liczba jednostek 3. Znaki ASCII odpowiadające tym cyfrom to: 0x31,0x32,0x33.
Wiąże się to z napisaniem w asemblerze procedur dzielenia liczb kilkubajtowych, co nie jest przyjemne, zwłaszcza w asemblerze '51. W internecie na pewno znajdziesz gotowe procedury takich działań.
Przychodzi mi do głowy też inny sposób. Jeśli na liczbie o której mówisz przeprowadzasz bardzo proste działania - tylko dodawanie, to możesz ją przechowywać w formie BCD. Nie zapomnij po każdej operacji dodawania liczb BCD wykonać operacji DA A. Liczbę BDC już jest bardzo łatwo przedstawić w formie znaków ASCII. Wystarczy odseparować poszczególne nibble od siebie i dodać do uzyskanej cyfry 0x30.
Przykład: Liczba 23 w formacie BCD to 0x23. Zwiększenie wartości o 1 jeśli znajduje się w akumulatorze:
ADD A,#1
DA A
(nie używaj INC A bo zburzy ona format BCD :) )
Pozdrawiam.
|
|
| Back to top |
|
 |
Google

|
#
13 Mar 2008 23:53 |
|
|
|
|
|
| Back to top |
|
 |
zumek Poziom 23

Joined: 08 Oct 2003 Posts: 3122 Location: Włocławek
|
#5
14 Mar 2008 00:33 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
A ja rzucę gotowcem :D
| Code: |
; -------------------------------------------------------------------------
;konwersja liczby binarnej X-bitowej do postaci dziesietnej X-cyfrowej ;) |
;-------------------------------------------------------------------------
bajty equ 4 ;z ilu bajtow sklada sie liczba
bity equ bajty*8
cyfry equ 10 ;maksymalna ilosc cyfr po konwersji
licznik equ r3
dseg at 8
dane: ds bajty ;liczba w pamieci zapisana od MSB do LSB
;dseg at 10H
wynik: ds cyfry ;kolejnosc od najbardziej znaczacej cyfry
nul_term: ds 1
stack:
;program
cseg at 00H
sjmp main
org 40H
main:
mov sp,#stack
mov dane,#0FFH ;MSB
mov dane+1,#0FFH ;
mov dane+2,#0FFH ;
mov dane+3,#0FFH ;LSB
acall bin2str
stop: sjmp $
bin2str:
acall clear_tab ;wyzerowanie tablicy z wynikiem konwersji
mov licznik,#bity ;z ilu bitów sklada sie liczba
lop0:
acall rotate_left
mov r0,#(wynik+cyfry)
mov r2,#cyfry
lop1:
dec r0
mov a,@r0
rlc a
push acc
addc a,#-10
pop acc
jnc lop2
add a,#-10
lop2: mov @r0,a
dec r2
mov a,r2
jnz lop1
lop2a:
dec licznik
mov a,licznik
jnz lop0
acall tab_to_string
ret
rotate_left:
push acc
mov r1,#(dane+bajty)
clr c
push psw
lop2b:
pop psw
dec r1
xch a,@r1
rlc a
xch a,@r1
push psw
cjne r1,#dane,lop2b
pop psw
pop acc
ret
clear_tab:
mov r0,#(wynik+cyfry)
lop3:
dec r0
mov @r0,#0
cjne r0,#wynik,lop3
ret
tab_to_string:
mov r0,#(wynik+cyfry)
lop4:
dec r0
mov a,@r0
orl a,#30H
mov @r0,a
cjne r0,#wynik,lop4
mov nul_term,#0
ret
end
|
Można konwertować do stringa , dowolną liczbę X-bajtową , byle RAM-u i czasu starczyło :D
Ta jest dla 4-bajtowej , ale może być 1 lub 100-bajtowa , czyli taka ... uniwersalka ;)
|
|
| Back to top |
|
 |
Pokey Poziom 15

Joined: 28 Jun 2003 Posts: 205 Location: Rzeszów
|
#6
14 Mar 2008 14:16 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
Bardzo sprytna funkcyjka zumek :) Wygląda na czasochłonną dla dużych liczb, ale jeśli chodzi o kod programu, to krócej chyba by się tego nie dało zrobić. I nie ma żadnego "dzielenia wielobajtowego" :)
|
|
| Back to top |
|
 |
jareks91 Poziom 18

Joined: 30 Dec 2004 Posts: 570 Location: Milówka
|
#7
14 Mar 2008 14:21 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
tak dziękuje bardzo problem rozwiązany, funkcja zumka działa :-)
|
|
| Back to top |
|
 |
Michal19881 Poziom 21

Joined: 03 Sep 2007 Posts: 1122 Location: Konin
|
#8
15 Mar 2008 13:33 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
DLA DSM-51:
| Code: |
LJMP START
ORG 100H
START:
LCALL LCD_CLR
MOV A,#'A'
LCALL WRITE_DATA
LJMP $
|
Program ten spowoduje wypisanie na wyświetlaczu LCD literki A.
|
|
| Back to top |
|
 |
Google

|
#
15 Mar 2008 13:33 |
|
|
|
|
|
| Back to top |
|
 |
Pokey Poziom 15

Joined: 28 Jun 2003 Posts: 205 Location: Rzeszów
|
#9
15 Mar 2008 15:38 Re: Wyświetlanie liczb na LCD w asamblerze |
|
|
|
Michal19881 ale koledze jareks91 chodziło o wyświetlenie liczby przechowywanej jako binarna, czyli zupełnie inna bajka :) Procedura zumeka nadaje się do tego idealnie.
|
|
| Back to top |
|
 |