przedstawienie liczby 2-cyfrowej na 2 wyświetlaczach

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
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

przedstawienie liczby 2-cyfrowej na 2 wyświetlaczach

Post autor: M@ciej » 28 maja 2008, 16:54

Witam serdecznie :)

Mam taki problem z Bascomem:

Mam 2-cyfrową liczbę typu Byte i nie wiem,jak ją rozdzielić, żeby dziesiątki wyświetlane były na pierwszym wyświetlaczu a jednostki na drugim? Podstawy multipleksowego sterowania wyświetlaczy są mi znane.

ZbeeGin

Post autor: ZbeeGin » 28 maja 2008, 17:03

Podziel z resztą przez 10 i już masz liczbę dziesiątek oraz jednostek. Zatem dwie operacje: \ i MOD.
Chyba, że liczbę masz zapisaną w systemie Pack BCD. Zatem trzeba skorzystać z polecenia SHIFT i operatora AND.

http://zbeegin.republika.pl/bashelp/bascom_basic.html
http://zbeegin.republika.pl/bashelp/s_shift.html

Potem już na podstawie danych o jednostkach i dziesiątkach należy zamienić te cztery bity na bajt sterujący wyświetlaczem. A tu są dwie możliwości w zależności jak sterowany jest pojedynczy wyświetlacz: anodami, czy katodami. Najprościej jest to zrobić budując sobie jedną linię DATA z 10 bajtami i odczytywać z niej dane przez LOOKUP().
Ostatnio zmieniony 28 maja 2008, 17:26 przez ZbeeGin, łącznie zmieniany 2 razy.

Awatar użytkownika
Krystian1989
-
Posty: 47
Rejestracja: 06 kwie 2007, 8:56
Lokalizacja: TBG
Kontakt:

Post autor: Krystian1989 » 28 maja 2008, 17:09

Musisz najpierw zamienić zmienną typu BYTE na zmienną typu string , do tego celu służy polecenie "STR" np:

Kod: Zaznacz cały

Dim a As Byte, S As XRAM String * 10, S1 As XRAM string * 1, S2 As XRAM string * 1
dim b as byte, c as byte

a = 156
s = Str(a)
Następnie trzeba użyć polecenia "MID" np:

Kod: Zaznacz cały

s = Mid(s1, 2, 1)
Print s1  'wydrukuje  4
s = Mid(s2, 1, 1) 
Print s2  'wydrukuje  1
I na koniec zmienne dla obsługi wyświetlacza wyświetlacza:

Kod: Zaznacz cały

b = Val(s1)  'wynik-zmienna typu BYTE np 1 cyfra
c = Val(s1)  'wynik-zmienna typu BYTE np 2 cyfra

I oto cała filozofia. Może, że są też prostsze sposoby ale ten na początek jest w sam raz, przynajmniej wiadomo skąd co się wzięło.
Ostatnio zmieniony 29 maja 2008, 17:53 przez Krystian1989, łącznie zmieniany 1 raz.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 28 maja 2008, 18:00

Jeśli chodzi o zamianę zmiennej na string i wyłuskanie każdej cyfry instrukcją MID to też nad tym myślałem. Kolega ZbeeGin podał sposób matematyczny. Zastanawiam się który będzie szybciej działał?

Myślałem także nad stworzeniem dwóch tablic, gdzie zamieniana liczba będzie pointerem do tych tablic. Dla 2-cyfrowej liczby musiałbym zużyć 200 bajtów pamięci,co jest ryzykowne.

Wyświetlacze maja wspólną anodę i steruję je katodami.

Awatar użytkownika
olo16
Użytkownik
Posty: 396
Rejestracja: 12 paź 2007, 16:37
Lokalizacja: w-wa

Post autor: olo16 » 28 maja 2008, 20:32

M@ciej pisze:Jeśli chodzi o zamianę zmiennej na string i wyłuskanie każdej cyfry instrukcją MID to też nad tym myślałem. Kolega ZbeeGin podał sposób matematyczny. Zastanawiam się który będzie szybciej działał?
Raczej matematyczny, bo z zamiamą na string to dużo dodatkwych operacjii (taktów zegara).

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 28 maja 2008, 21:14

Tak,w dodatku zamiana na string słabo działa i wyświetla głupoty, gdy chciałem zrobić przykładowo prosty sekundnik.

ZbeeGin

Post autor: ZbeeGin » 29 maja 2008, 5:31

Wyświetlacze maja wspólną anodę i steruję je katodami.

Kod: Zaznacz cały

table_7seg:
'ułożenie bitów w bajcie "hgfedcba"
DATA &b11000000, &b11111001, &b10100100, &b10110000, &b10011001
DATA &b10010010, &b10000010, &b11111000, &b10000000, &b10010000 

ODPOWIEDZ