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

DSM-51 Jagoda: Jak wybrać największą liczbę i wyświetlić na LCD?

No name 05 Sty 2006 00:18 1114 3
REKLAMA
  • #1 2147622
    No name
    Poziom 21  
    Posty: 560
    Pomógł: 5
    Ocena: 22
    Witam!
    nie moge sobie poradzić z zadaniem, prosilbym o pomoc (poczatek zadania mam zrobiony)
    zadanie wykonuje w prgramie DSM-51 jagoda
    tresc zadania: Z pewnego obszaru pamięci wybierz największą liczbę i wyświetl ja na wyświtlaczu LCD.
    tych liczb ma byc 10
    zamieszczam zdjecie z komendami jakich mamy do tego uzyc, oraz schemat blokowy i kawalek zadania
    Załączniki:
    • DSM-51 Jagoda: Jak wybrać największą liczbę i wyświetlić na LCD? program ( tylko poczatek).JPG (14.64 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • DSM-51 Jagoda: Jak wybrać największą liczbę i wyświetlić na LCD? schemat blokowy.JPG (39.76 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • DSM-51 Jagoda: Jak wybrać największą liczbę i wyświetlić na LCD? SA500044.JPG (80.42 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2152235
    Paweł Es.
    VIP Zasłużony dla elektroda
    Posty: 6981
    Pomógł: 1236
    Ocena: 693
    Ogólnie algorytm szukania maxa

    ---------------------------------------------
    MAX:=0;

    for i:=ADR_POCZ TO ADR_KONC do
    begin
    A:=RAM[i];
    if A>MAX then MAX=A;
    end;

    LCD=MAX
    -------------------------------------

    ADR_POCZ - wskazuje na pierwszą liczbę
    ADR_KONC - wskazuje na ostatnią liczbę

    A - akumulator
    MAX wartość maksymalna

    w assemblerze:

    1. ustawiasz sobie komórkę MAX na 0;
    2. do rejestru indeksowego R0 ustawiasz ADR_POCZ=11H
    3. pobierasz do akumulatora liczbę wskazywaną przez R0
    4. porównujesz ją z MAX
    5. jeżeli jest większa to podstawiasz A do MAX
    6. zwiększasz R0 o 1
    7. porównujesz z ADR_KONC+1 (21H) {By nie pominąć komórki 20H}
    8. jeżeli R0<>21H to skaczesz do punktu 3
    9. Wyświetlasz zawartość MAX na LCD
    10. KONIEC
  • REKLAMA
  • Pomocny post
    #3 2153026
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Rozkaz MOV R0,#11H zmieniam na
    MOV R0,#10H ;to jest adres gdzie zaczynają sie dane z których należy wybrać największą
    W R1 jest wartość 10 mówiąca o ilości bajtów do sprawdzenia
    W R2 jest początkowa najmniejsza wstepnie ustawiona wartość do porównywania
    I teraz od XYZ:
    MOV A,@R0 ;pobieram do akumulatora kolejną wartość z RAM-u do porównania na wielkość
    CJNE A,R2,$+3 ;porównuje ja z wartością w R2 i tak napisany warunek powoduje że program idzie (zawsze) do wykonania następnego rozkazu po cjne. Co to daje?, ano właśnie, ten rozkaz cjne ustawia mi C w taki sposób: C=1 tylko wtedy gdy wartość w A jest mniejsza od wartości w drugim operandzie czyli w tym przypadku w R2.
    JC DALEJ ;jesli C=1 to skocz do etykiety DALEJ jesli C=0 wykonuj następny rozkaz
    MOV R2,A ;poniewaz C=0 to znaczy że A > R2 czyli znalazłem większa wartośc i nalezy ja zapamiętać w R2 co robię
    DALEJ: INC R0 ; zwiekszam adres w R0 żeby następnym razem pobrac następną wartość do porównania
    DJNZ R1,XYZ ;odejmuje 1 od licznika petli i jesli nie zerowy ide dalej edo sprawdzania
    Tutaj w R2 mam wartość największą, wystarczy teraz tą wartość (R2) wyswietlić.
  • #4 2169886
    No name
    Poziom 21  
    Posty: 560
    Pomógł: 5
    Ocena: 22
    Dzieki olekewaagata, skozystalem z Twojej podpowiedzi i troszke dodalem
    XYZ:
    MOV A,@R0
    MOV 32,R2
    CJNE A,20H,$+3
    JC DALEJ
    MOV R2,A
    DALEJ:
    INC R0
    DJNZ R1,XYZ
    MOV A,R2
    LCALL WRITE_HEX
    LJMP $
REKLAMA