[asm] wyswietlanie zmiennej na LCD

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. 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
Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

[asm] wyswietlanie zmiennej na LCD

Post autor: grysek67 » 14 wrz 2009, 18:54

Witam

Napisałem program sterujący wyświetlaczem LCD. O ile nie problemem jest wyświetlać znaki w kodzie ascii o tyle trudniej jest wyświetlić zawartość zmiennej/rejestru procesora na wyświetlaczu.
Dlatego postanowiłem zająć sie tym zagadnieniem i napisałem coś takiego (wrzucam same procedury ponieważ cały program jest zbyt długi). Procedura wyslij_zmienna jest wywoływana z pętli w której zawartość rejestru data jest zwiększana o 1. I wszystko działa ok ale liczby 19,39,49,59 wyswietlane są jako jakieś śmieci. Czy ktoś może mi pomóc w moim problemie?

Kod: Zaznacz cały

wyslij_znak:
 sbi 		PORTC, RS 
 rcall		strobe
 cbi		PORTC, RS
ret

wyslij_cyfre:
 add		data, const
 rcall		wyslij_znak
 sub		data, const
ret

dzielenie_10:
 mov		r21, data
 mov		r22, r21
 lsr		r22
 lsr		r22
 mov		r23, r21
 lsr		r23
 lsr		r23
 lsr		r23
 lsr		r23
 mov		r24, r21
 lsr		r24
 lsr		r24
 lsr		r24
 lsr		r24
 lsr		r24
 lsr		r24
 mov		r25, r21
 lsr		r25
 lsr		r25
 lsr		r25
 lsr		r25
 lsr		r25
 lsr		r25
 lsr		r25
 lsr		r25
 sub		r21, r22
 add		r21, r23
 sub		r21, r24
 add		r21, r25
 lsr		r21
 lsr		r21
 lsr		r21
ret

wyslij_zmienna:
 rcall		dzielenie_10
 mov 		r23, data
 mov		data, r21
 rcall		wyslij_cyfre
 ldi		r22, 10
 mul		data, r22
 sub		r23, r0
 mov 		data, r23
 rcall		wyslij_cyfre
ret

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 14 wrz 2009, 20:12

Daj sobie spokój z dzieleniem. Jest lepszy, szybszy i skuteczniejszy sposób na zamianę. Wykorzystaj porównania i odejmuj:

Kod: Zaznacz cały

rx - jakiś rejestr zawierający liczbę od 0 - 99
ldi ry, 0
start:
cpi rx, 10
brne koniec (nie pamiętam czy ten skok, w każdym razie ma byc: jeśli rx<10 to skocz)
subi rx, 10
inc ry
rjmp start
koniec:

po zakończeniu rejestry zawierają:
ry - cyfra dziesiątek
rx - cyfra jedności
Mam nadzieję ze się nie pomyliłem, pisałem z głowy:) tak samo postępujesz przy większych liczbach, np dla setek sprawdzasz czy Rx<100 jeśli nie to odejmujesz od niego 100, a do rejestru wyjściowego setek powiedzmy Rz dodajesz 1 itd. Szybkie proste i niezawodne:)

Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

Post autor: grysek67 » 15 wrz 2009, 14:29

Dzięki serdeczne jesteś wielki :grin:
Rzeczywiście teraz to działa a nie to co przedtem. Sam bym tego nie wymyślił

P.S ten skok to 'brlo' ;p

ODPOWIEDZ