Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

licznik na dptr 8051 asembler

wandeczka1234 30 Lis 2009 16:03 2960 2
  • #1 30 Lis 2009 16:03
    wandeczka1234
    Poziom 2  

    Witam, mam pewien problem. Mam napisać na zajęcia licznik,który bedzie używał dptru a nie rejestrów, ani timerów. Program na rejestrach mam zrobiony niestety brakuje mi pomysłu na ten na dptr. Mam prośbę żeby ktoś podsunął mi jakiś algorytm. Dodatkowo prowadzący zaznaczył,że program musi używać dzielienie 16 bitowego, co już też mam, ale złozyć to wszystko w całość to dla mnie problem. Nie jestem w tym dobra,ale na szczęście to już ostatnie zajęcia na których będą wymagać takie rzeczy;]
    załączam program na rejestrach:

    org 0000h

    mov r4,#0h ;wyzerowanie segmentu w3 licznika
    mov r5,#0h ;wyzerowanie segmentu w2 licznika
    mov r6,#0h ;wyzerowanie segmentu w1 licznika
    mov r7,#0h ;wyzerowanie segmentu w0 licznika

    mov r1,#0h ;wyzerowanie rejestru na ktorym odswiezane beda Led-y

    licznik: ;ogolna petla programu
    lcall pokaz
    lcall zwieksz

    zwieksz:
    inc r7 ;inkrementuj segment w0 licznika
    cjne r7, #0, skok ;skok jesli brak przepelnienia
    inc r6 ;przepelnienie segmentu w0 licznika,inkrementuj segment w1 licznika
    cjne r6, #0, skok
    inc r5
    cjne r5, #0, skok
    inc r4
    cjne r4, #0, skok
    skok:
    cjne r7,#10,zwieksz ;segment w0 licznika nie osiagnal wartosci granicznej
    cjne r6,#10,zwieksz
    cjne r5,#10,zwieksz
    cjne r4,#10,zwieksz
    ret

    pokaz:

    mov dptr,#1000000000011000b
    mov r1,#0

    pokaz1:

    clr p1.0 ; segment wyswietlacza w0
    clr p1.1

    mov a,r7 ;ustaw katode
    lcall zmiana ; zmien liczbe na kod segmentów
    movx @dptr,a ; ustaw anode
    lcall petla_opozniajaca ;czekaj


    setb p1.0 ; segment wyświetlacza =w1

    mov a,r6
    lcall zmiana
    movx @dptr,a
    lcall petla_opozniajaca


    setb p1.1 ; segment wyswietlacza= w2
    clr p1.0

    mov a,r5
    lcall zmiana
    movx @dptr,a
    lcall petla_opozniajaca

    setb p1.0 ; segment wyświetlacza= w3
    setb p1.1
    mov a,r4
    lcall zmiana
    movx @dptr,a
    lcall petla_opozniajaca


    inc r1
    cjne r1,#150,pokaz1 ; tyle razy bedzie odswiezany stan LED-ow

    ret

    zmiana: ; zamiana liczby na kod liczby binarnej segmentu wyswietlacza

    cjne a,#0,jeden
    mov a,#00111111b ;0
    sjmp koniec
    jeden:
    cjne a,#1,dwa
    mov a,#00000110b ;1
    sjmp koniec
    dwa:
    cjne a,#2,trzy
    mov a,#01011011b ;2
    sjmp koniec
    trzy:
    cjne a,#3,cztery
    mov a,#01001111b ;3
    sjmp koniec
    cztery:
    cjne a,#4,piec
    mov a,#01100110b ;4
    sjmp koniec
    piec:
    cjne a,#5,szesc
    mov a,#01101101b ;5
    sjmp koniec
    szesc:
    cjne a,#6,siedem
    mov a,#01111101b ;6
    sjmp koniec
    siedem:
    cjne a,#7,osiem
    mov a,#00000111b ;7
    sjmp koniec
    osiem:
    cjne a,#8,dziewiec
    mov a,#01111111b ;8
    sjmp koniec
    dziewiec:
    cjne a,#9,koniec
    mov a,#01101111b ;9
    sjmp koniec
    koniec:

    ret


    petla_opozniajaca:
    mov r2, #0FFh ;wpisz liczbe do akumulatra
    Loop1:
    mov r0, #01Fh ;wpisz liczbe do rejestru r0
    loop2:
    djnz r0, loop2 ;dekrementuj i skocz jesli nie rowne zero
    dec a ; zmiejsz wartosc argumentu o 1
    jnz loop1 ;skocz do loop1 jesli nie zero
    ret

    ljmp licznik
    end

    dzięki za jakiekolwiek sugestię

    0 2
  • #2 02 Gru 2009 17:23
    wandeczka1234
    Poziom 2  

    żadnych idei....:cry:

    0
  • #3 02 Gru 2009 18:58
    Krauser
    Poziom 26  

    Jak dla mnie Twoje pytanie jest mało szczegółowe. Do czego ma być użyty ten DPTR? Poza tym można go traktować jak 2 rejestry DPH i DPL, ale jest już używany więc użycie go do przechowywania wartości w0 - w4 mija się z celem bo jest używany do adresowania pośredniego czyli należało by go zapamiętać. Jedynie można go jeszcze użyć w pętli opóźniającej, ale wtedy przed każdą instrukcją movx musi on być ponownie załadowany.

    0