logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak napisać program w assemblerze dla 8051 do obsługi wyświetlacza i przycisków?

adamusx 12 Sty 2006 19:25 2126 6
REKLAMA
  • #1 2173981
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Witam.

    Musze napisac prosty program na 8051 w assemblerze z tym, ze nie bardzo wiem jak sie do tego zabrac,gdyz z tymi mikrokontrolkerami raczej nie mialem doczynienia.

    Zalozenie jest takie, ze do portu P0 podlaczony jest bezposrednio jeden wyswietlacz siedmiosegmentowy (np ze wspolna katodą), natomiast do portu P2 podlaczonych jest 7 przyciskow z masa. Proram ma pokazywac na wyswietlaczu numer wcisnietego przycisku (tj cyfry od 0-7)

    Wiem ,ze na forum sa wymiatacze z 8051 :), wiec prosba jest taka, jak bedzie wygladal taki program zrealizowany w najprostrzy sposób??
  • REKLAMA
  • Pomocny post
    #2 2174150
    Michał Walczak
    Poziom 18  
    Posty: 252
    Pomógł: 12
    Ocena: 45
    Wiec tak - wyswietlacz wez ze wspolna anodą (tzn +) bo bedzie o wiele latwiej. Wtedy wspólna anode dasz do + a porty poniewaz ich aktywnym stanem jest masa podepniesz przez rezystory do minusów segmentów wyswietlcza. Mozna by dac jeszcze wzmacniacz uln 2003 lub 2803 zeby nie obciazac procka ale bez niego przy niezbyt duzym pradzie wyswietlacza tez powinno dzialac. Programu na forym nie bede pisal bo to zajmie troszke miejsca ale moze ogólne zalozenia. Sprawdzanie który przycisk zostal wcisniety mozesz zrobic tak:
    jnb acc.0,wys0
    jnb acc.1,wys1
    jnb acc.2,wys2

    itd
    a jak zaden nie zapalony to
    mov p1,#255

    a pozniej:
    wys0
    mov p1, -zapalasz odpowiednie segmenty dla cyfry 0
    wys1
    mov p1, -zapalasz odpowiednie segmenty dla cyfry 1
    wys2
    mov p1, -zapalasz odpowiedznie segmenty dla cyfry 2

    itd

    jak chcesz gotowy soft to pisz na priva

    Dodano po 1 [minuty]:

    o sorry pomylilem sie - wyswietlacz masz podpiety do p0 a nie jak napisalem w przykladzie p1 - trzeba zamienic p1 na p0

    Dodano po 1 [minuty]:

    a i jeszcze przed jnb acc.0 wstaw mov a,p2
  • REKLAMA
  • #3 2176162
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Ok ,a czy nie da sie odrazu zapisac sprawdzania przycisku pomijajac zaladowanie stanu portu do akumulatora ?? np :




    sprawdz: // petla sprawdania przyciskow P0-P7
    jnb P2.0,wys0 // jesli P2.0 jest 0 skok do wysw0
    jnb P2.1,wys1
    jnb P2.2,wys2

    .
    .
    .
    itd


    sjmp sprawdz



    wys0 // zapalenie cyfry 0
    mov acc, #124
    mov p0,acc
    ret

    wys1 // zapalenie cyfry 1
    mov acc, #32
    mov p0,acc
    ret

    .
    .
    .
    itd

    czy to bedzie dzialac ? :)
  • Pomocny post
    #4 2176459
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    adamusx napisał:
    Ok ,a czy nie da sie odrazu zapisac sprawdzania przycisku pomijajac zaladowanie stanu portu do akumulatora ?? np :

    sprawdz: // petla sprawdania przyciskow P0-P7
    jnb P2.0,wys0 // jesli P2.0 jest 0 skok do wysw0
    jnb P2.1,wys1
    jnb P2.2,wys2

    .
    .
    .
    itd
    (...)

    Można sprawdzać stan linii portu 2 w ten sposób, nie trzeba wykorzystywać akumulatora.

    adamusx napisał:
    mov acc, #124
    mov p0,acc
    Te dwa rozkazy zostaną wykonane w czterech cyklach maszynowych i zajmą 6 bajtów w pamięci programu.
    Lepiej zrobić to tak:
    mov a,#124
    mov p0,a
    2 cykle, 4 bajty.
    A jeśli wartość wpisywana do portu 0 nie jest potrzebna w akumulatorze, to można to zrobić tak:
    2 cykle, 3 bajty

    Moim skromnym zdaniem warto uczyć się oszczędności pamięci/czasu mikrokontrolera nawet w przypadku prostych programów (szczególnie pisząc w asemblerze, gdzie te zasoby mamy pod ścisłą kontrolą).

    pozdrawiam
    Jacek
  • REKLAMA
  • Pomocny post
    #5 2176468
    Michał Walczak
    Poziom 18  
    Posty: 252
    Pomógł: 12
    Ocena: 45
    Napisalem na wszelki wypadek z akumulatorem bo nie pamietam czy port 2 da sie bezposrednio sprawdzac bitowo. Musialbym zajrzec do ksiazki.

    Dodano po 4 [minuty]:

    Ja kompresuje program gdy zalezy mi na upchnieciu sporego programu do malej pamieci lub gdy zalezy mi na czasie procesora - przy tak prostym programie to mija sie z celem bo:
    1 pamieci jak na taki programik jest ogromnie duzo
    2 taki program nie ma ograniczen czasowych, przerwan itd
  • REKLAMA
  • #6 2177049
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Dzieki za pomoc.

    Mam jeszczed jedno pytanie co do takiego programiku :
    do portu P2 podlaczonych jest 8 przyciskow. Kazdorazowe nacisniejce poszczegolnego przycisku na przemian wlacza lub wylacza odpowiadajacom mu diode LED ( podpiete do portu P0)

    START:
    JB P2.0,SS1 // skok jeśli bit jest jedynka
    CPL LED1 // zmiana stanu bitu na przeciwny

    SS1:
    JB P2.1, SS2
    CPL LED2

    SS2:
    JB P2.2, SS3
    CPL LED3

    SS3:
    JB P2.3, SS4
    CPL LED4

    SS4:
    JB P2.4, SS5
    CPL LED5

    SS5:
    JB P2.5, SS6
    CPL LED6

    SS6:
    JB P2.6, SS7
    CPL LED7

    SS7:
    JB P2.7, SS8
    CPL LED8

    SS8:
    ACALL CZEKAJ // wywołanie funkcji opóźniającej „CZEKAJ”
    SJMP START

    czy takie rozwiazanie bedzie dzialac? Czy da sie to jakos uproscic ? Tzn nie stosowac tylu etykiet .

    Wiem , że w AVR jest plecenie ktore sprawdza bit i jesli jest np ustawiony to opuszcza instrukcję znajdujacą sie bezposrednio pod spodem. Jesli nie to ja wykonuje. Czy jest podobna komenda w 8051 ??
  • Pomocny post
    #7 2185318
    Dyrek
    Poziom 16  
    Posty: 129
    Pomógł: 21
    Ocena: 1
    Na 51 nie ma takiej instrukcji o której mówisz. Trzeba się posiłkować rozkazami jb lub jnb. A program da się zmniejszyć.
    Zakładając że załączenie przycisku sygnalizowane jest jedynką i jedynka także włącza diodę to może to wyglądać następująco:


    zmiana stanu diody musi być przy wykryciu zbocza narastającego a nie przy poziomie bo inaczej diody migałyby podczas naciśnięcia przycisków -zapomniałeś o tym więc potrzebny jest jeszcze ten mały kawałek:
    ;----------------
    mov b,#0
    badaj:
    mov a,p2
    jz badaj
    xrl a,b
    jz badaj
    mov b,p2
    ;----------------
    mov a,p2
    xrl p0,a
    sjmp badaj

    end


    xrl to funkcja xor
    jeśli stanem załączenia przycisku byłoby zero i świecenie diody podobnie to należałoby zanegować całe bajty z tych portów w odpowiednich miejscach

Podsumowanie tematu

✨ Dyskusja dotyczy napisania prostego programu w asemblerze dla mikrokontrolera 8051 do obsługi wyświetlacza siedmiosegmentowego podłączonego do portu P0 oraz przycisków podłączonych do portu P2. Wskazano, że łatwiej jest użyć wyświetlacza ze wspólną anodą, gdzie segmenty sterowane są przez masę poprzez porty mikrokontrolera. Proponowano sprawdzanie stanu przycisków bit po bicie za pomocą instrukcji JNB lub JB bez konieczności ładowania stanu portu do akumulatora, co jest możliwe i efektywne. Podkreślono znaczenie optymalizacji kodu asemblerowego pod kątem liczby cykli maszynowych i zajmowanej pamięci, nawet w prostych programach. W przypadku sterowania diodami LED podłączonymi do portu P0, reagującymi na przyciski z portu P2, zwrócono uwagę na konieczność wykrywania zbocza narastającego sygnału, aby uniknąć migotania diod podczas przytrzymania przycisku. Zaproponowano implementację z wykorzystaniem rejestru pomocniczego i operacji XOR do wykrywania zmian stanu przycisków i odpowiedniego przełączania diod. Omówiono również ograniczenia instrukcji asemblera 8051, które nie posiadają rozkazów warunkowych pomijających pojedyncze instrukcje, co wymusza stosowanie wielu etykiet i skoków.
Wygenerowane przez model językowy.
REKLAMA