Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięjak wyswietlic na LCD zawartos rejestru
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
witam
Hmm jak wyswietlic zawartosc jakiegos rejestru na lcd chdzi mi o program w asm.
Wiem jak pojedyncze znaki ale np w r19 mam ff
jak wyrzuce to na lcd to nie mam ff tylko znak o tym kodzie.
Wiem ze w bascomie sie to da zrobic bo to robilem
ale nie moge sobie dac rady z tym w asm
Prosze o porade i wskazowki
Hmm jak wyswietlic zawartosc jakiegos rejestru na lcd chdzi mi o program w asm.
Wiem jak pojedyncze znaki ale np w r19 mam ff
jak wyrzuce to na lcd to nie mam ff tylko znak o tym kodzie.
Wiem ze w bascomie sie to da zrobic bo to robilem
ale nie moge sobie dac rady z tym w asm
Prosze o porade i wskazowki
Na przykład tak:
Zawartość rejestru jest 8-bitowa, więc operację trzeba wykonać na dwie raty: najpierw starszy nibel (bity 7...4), później młodszy (bity 3...0).
1. Starszy nibel rejestru (4 najstarsze bity) przesuwasz na pozycje 4 młodszych bitów (starsze muszą zostać wyzerowane).
2. Jeżeli otrzymana wartość jest mniejsza od 10 dec (dziesiętnie) (= 0A hex), to dodajesz do niej kod ASCII cyfry "0" - jest to liczba 48 dec i przechodzisz do punktu 4.
3. Jeżeli otrzymana wartość była większa lub równa 10 dec to dodajesz do niej kod ASCII litery "A" - jest to liczba 65 dec.
4. Wyświetlasz na wyświetlaczu otrzymany znak ASCII - jest to pierwsza cyfra liczby hex.
5. Z młodszym niblem robisz podobnie, tzn. najpierw zerujesz 4 najstarsze bity rejestru a następnie powtarzasz kroki 2 ... 4, ale tym razem wyświetlana jest druga cyfra hex.
Albo tak:
Zamiast sprawdzać czy liczby są mniejsze lub większe od 10 dec (punkty 2 i 3) możesz zrobić 16 pozycyjną tablicę zawierającą kody ASCII kolejnych cyfr kodu Hex (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F) i wartość nibla traktować jako indeks tej tablicy. Reszta bez zmian.
Życzę miłej zabawy!
Zawartość rejestru jest 8-bitowa, więc operację trzeba wykonać na dwie raty: najpierw starszy nibel (bity 7...4), później młodszy (bity 3...0).
1. Starszy nibel rejestru (4 najstarsze bity) przesuwasz na pozycje 4 młodszych bitów (starsze muszą zostać wyzerowane).
2. Jeżeli otrzymana wartość jest mniejsza od 10 dec (dziesiętnie) (= 0A hex), to dodajesz do niej kod ASCII cyfry "0" - jest to liczba 48 dec i przechodzisz do punktu 4.
3. Jeżeli otrzymana wartość była większa lub równa 10 dec to dodajesz do niej kod ASCII litery "A" - jest to liczba 65 dec.
4. Wyświetlasz na wyświetlaczu otrzymany znak ASCII - jest to pierwsza cyfra liczby hex.
5. Z młodszym niblem robisz podobnie, tzn. najpierw zerujesz 4 najstarsze bity rejestru a następnie powtarzasz kroki 2 ... 4, ale tym razem wyświetlana jest druga cyfra hex.
Albo tak:
Zamiast sprawdzać czy liczby są mniejsze lub większe od 10 dec (punkty 2 i 3) możesz zrobić 16 pozycyjną tablicę zawierającą kody ASCII kolejnych cyfr kodu Hex (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F) i wartość nibla traktować jako indeks tej tablicy. Reszta bez zmian.
Życzę miłej zabawy!
Dzieki za rade dziala
;pokaz 1 polbajt
push temp1
swap temp1 andi temp1, 0b00001111
rcall wyswietl
pop temp1
;pokaz 2 polbajt
andi temp1, 0b00001111
rcall wyswietl
wyswietl:
cpi temp1,$00
brne a1
ldi temp1,'0'
rcall lcd_data
ret
a1:
cpi temp1,$01
brne a2
ldi temp1,'1'
rcall lcd_data
ret
itd....
p.s.
mozesz podpowiedziec jak sie robi tablice ??
nigdy tego nie robilem i z checia bym sprobowal i sie nauczyl
;pokaz 1 polbajt
push temp1
swap temp1 andi temp1, 0b00001111
rcall wyswietl
pop temp1
;pokaz 2 polbajt
andi temp1, 0b00001111
rcall wyswietl
wyswietl:
cpi temp1,$00
brne a1
ldi temp1,'0'
rcall lcd_data
ret
a1:
cpi temp1,$01
brne a2
ldi temp1,'1'
rcall lcd_data
ret
itd....
p.s.
mozesz podpowiedziec jak sie robi tablice ??
nigdy tego nie robilem i z checia bym sprobowal i sie nauczyl
Niestety, nie znam Twojego asemblera i nie wiem nawet jaki to typ mikroprocesora, ale generalnie wygląda to tak:
MOV REJESTR_INDEKSOWY,NAZWA_TABLICY ;do rejestru indeksowego ładujemy adres początku tablicy w pamięci ROM (rejestr indeksowy musi być zapewne 16-bitowy).
ADD REJESTR_INDEKSOWY,KOD_CYFRY ;do zawartości rejestru indeksowego dodajemy kod cyfry którą chcemy wyświetlić (wartości z zakresu 0....F hex). Teraz zawartość rejestru indeksowego jest adresem komórki w pamięci ROM, w której to komórce jest kod ASCII znaku do wyświetlenia. W wielu mikroprocesorach zamiast dodawania można użyć odpowiedniego trybu adresowania.
MOV A,(REJESTR_INDEKSOWY) ;do rej. A wczytujemy zawartość komórki pamięci ROM wskazywanej przez rejestr indeksowy (czyli w rej.A mamy kod ASCII cyfry do wyświetlenia na wyświetlaczu LCD).
MOV REJESTR_INDEKSOWY,NAZWA_TABLICY ;do rejestru indeksowego ładujemy adres początku tablicy w pamięci ROM (rejestr indeksowy musi być zapewne 16-bitowy).
ADD REJESTR_INDEKSOWY,KOD_CYFRY ;do zawartości rejestru indeksowego dodajemy kod cyfry którą chcemy wyświetlić (wartości z zakresu 0....F hex). Teraz zawartość rejestru indeksowego jest adresem komórki w pamięci ROM, w której to komórce jest kod ASCII znaku do wyświetlenia. W wielu mikroprocesorach zamiast dodawania można użyć odpowiedniego trybu adresowania.
MOV A,(REJESTR_INDEKSOWY) ;do rej. A wczytujemy zawartość komórki pamięci ROM wskazywanej przez rejestr indeksowy (czyli w rej.A mamy kod ASCII cyfry do wyświetlenia na wyświetlaczu LCD).
.def acc = r16
.def param = r17
Conv : ;
push param ;
ldz HexConv<<1 ;
swap param ;
andi param,0x0F ;
clr acc ;
add zl,param ;
adc zh,acc ;
lpm xh,z ;
pop param ;
ldz HexConv<<1 ;
andi param,0x0F ;
clr acc ;
add zl,param ;
adc zh,acc ;
lpm xl,z ;
ret ;
HexConv : .db "0123456789ABCDEF"
Wejście: rejestr param (r17).
wyjście: rejestr xh:xl
.def param = r17
Conv : ;
push param ;
ldz HexConv<<1 ;
swap param ;
andi param,0x0F ;
clr acc ;
add zl,param ;
adc zh,acc ;
lpm xh,z ;
pop param ;
ldz HexConv<<1 ;
andi param,0x0F ;
clr acc ;
add zl,param ;
adc zh,acc ;
lpm xl,z ;
ret ;
HexConv : .db "0123456789ABCDEF"
Wejście: rejestr param (r17).
wyjście: rejestr xh:xl
Jeżeli możesz przymknąć oko że
A będzie wyświetlane jako ":"
B => ";"
C => "<"
D => "="
E => ">"
F => "?"
cyfry bez zmian to kod pod 8051 wygląda tak
mov a, R0
anl a, #0F0h
swap a
add a, #30h ;tutaj musisz dodać liczbę taką aby 0 w akumulatorze odpowiadało znakowi "0" na wyświetlaczu dla HD 44780
call wyslij_na_lcd
mov a, R0
anl a, #0Fh
add a, #30h
call wyslij_na_lcd
A będzie wyświetlane jako ":"
B => ";"
C => "<"
D => "="
E => ">"
F => "?"
cyfry bez zmian to kod pod 8051 wygląda tak
mov a, R0
anl a, #0F0h
swap a
add a, #30h ;tutaj musisz dodać liczbę taką aby 0 w akumulatorze odpowiadało znakowi "0" na wyświetlaczu dla HD 44780
call wyslij_na_lcd
mov a, R0
anl a, #0Fh
add a, #30h
call wyslij_na_lcd
Re: jak wyswietlic na LCD zawartos rejestru
Guru, z tego wynika, że to ma być na AVR.witam
....jak pojedyncze znaki ale np w r19 mam ff
jak wyrzuce .....
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość