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.

[asembler] kalkulator

grad3d 09 Cze 2009 03:30 5127 14
  • #1 09 Cze 2009 03:30
    grad3d
    Poziom 9  

    Witam
    Pisze sobie a raczej próbuje napisać sobie kalkulator w asemblerze przy użyciu klawiatury matrycowej i wyświetlacza LCD. i tak mój problem polega na tym że chciałbym żeby klawisze "góra, dół, prawo, lewo" miały przypisaną operacje dodawania odejmowania mnożenia i dzielenia. np wciśniecie "prawo" to dodawanie np 8 "prawo = +" 2 =10. Proszę o jaką kol wiek pomoc w rozwiązaniu tego zadania bo ja już nie mam siły do tego:(
    Z góry dziękuje.

    0 14
  • #2 09 Cze 2009 10:59
    chudybyk
    Poziom 27  

    Nie napisałeś z czym właściwie masz problem. Czy wiesz jak zrealizować klawiaturę? Czy wiesz jak reprezentowane są liczby w procesorze? Napisz, co sprawia Ci trudność, to pomożemy.
    Pozdrawiam!
    Leszek

    0
  • #3 09 Cze 2009 11:28
    grad3d
    Poziom 9  

    A wiec tak programuje w jagodzie chce napisać kalkulator i z dodawaniem odejmowaniem mnożeniem i dzieleniem nie mam problemu gdy w programie mam tylko jedną operacje z góry określoną prze zemnie np dodawanie dwóch liczb i je wyświetlenie na LCD. ale problem jest w tym że nie wiem jak samemu wybierać co chce zrobić dodawanie czy odejmowanie itp.
    1.wczytuje liczbe
    2.wyświetlam na LCD
    3. wybieram co chce zrobić z liczbami ( +,-,*,/ )
    4.Wyświetla mi znak który wybrałem
    5.wczytuje drugą liczbę
    6.Wyświetlam znak =
    7Wyświetlam wynik zależny od opcji

    punkt 3 jest moim problemem:(

    a i korzystam klawiatury matrycowej i LCD 2x16.

    0
  • #4 09 Cze 2009 11:59
    skynet_2
    Poziom 26  

    pkt. 3 jeżeli naciśnięto przycisk +,-,*,/ to zapisujesz w rejestrze/pamięci jakie działanie ma zostać wykonane.
    pkt. 7 wywołujesz funkcję która w zależności od wcześniej zapisanego typu działania oblicza wynik[dla każdego działania w inny sposób].

    pozdrawiam

    0
  • #5 09 Cze 2009 12:02
    chudybyk
    Poziom 27  

    Wydaje mi się, że masz problem ze sformułowaniem problemu i ułożeniem algorytmu.
    Może spróbuj zrobić tak:
    1. Jako wynik ustaw 0 - zmienna, np. "wynik". A jako ostatnią operację dodawanie (też jakaś zmienna, np. 'operacja'"
    2. Pobierz liczbę - znacznikiem końca liczby będzie jakikolwiek znak, który nie jest cyfrą (na razie olejemy liczby zmiennoprzecinkowe, żeby nie robić ci wody z mózgu) Każdą cyfrę wyświetl na ekran.
    3. Kiedy z klawiatury trafi się znak działania, wypisz ten znak na LCD, potem wykonaj na zmiennej wynik operację zapamiętaną w zmiennej "operacja". Drugim argumentem jest wczytana liczba. Zapamiętaj operację w zmiennej "operacja".
    4. Jeśli "operacja" to znak "=", to należy wypisać wynik na ekranie. Koniec. W przeciwnym wypadku należy spodziewać się kolejnych liczb - skocz do punktu 2.

    0
  • #6 09 Cze 2009 12:12
    grad3d
    Poziom 9  

    tylko jak rozpoznać czy naciśnięty klawisz to było +-*/ i co zapisać w rejestrze żeby wiedziało ze to będzie +-*/ no i jak odczytać z rejestru ze jeśli jest to to robi to a jeśli to to. i w klawiaturze matrycowej nie mam znaków +-*/ tylko chciałem to przeprogramować na te znaki np wciskam "prawo" to dodawanie. Tego nie rozumiem.
    Zapomniałem dodać że programuje mikro kontroler 8051

    0
  • #7 09 Cze 2009 12:16
    chudybyk
    Poziom 27  

    Chłopie! To jakie znaki masz na klawiaturze? Nie możesz sobie zamiast strzałki narysować znak "+"? Dalej nie rozumiem problemu!

    0
  • #8 09 Cze 2009 12:37
    grad3d
    Poziom 9  

    Przepraszam za wielkie zamieszanie ale jestem początkujący w te klocki. W jagodzie mam gotowa klawiaturę są na niej cyfry od 0 do 9 ESC ENTER I strzałki PRAWO,LEWO, GÓRA,DÓŁ. no nie wiem jak mam to wytłumaczyć bardziej:(

    0
  • #9 09 Cze 2009 12:57
    chudybyk
    Poziom 27  

    Ok. To pomalutku:
    1. Co to jest jagoda?
    2. Ile kabelków jest wyprowadzonych z klawiatury i czy potrafisz je odczytywać przy naciskaniu?
    3. Czy masz już jakiś początek programu, który działa? Możesz go tu umieścić? Może zrobi się nieco jaśniej.

    0
  • #10 09 Cze 2009 13:25
    grad3d
    Poziom 9  

    Jagoda to taki program który mogę pisać programy w asemblerze oraz patrzeć wyniki programu [asembler] kalkulator wszystko co mam jest widoczne na zdjęciu żadnych kabelków czy rysowania czegoś. Jak na razie zrobiłem sobie program który wyświetla napis i po czasie czyści LCD i chciałem go rozbudować o kalkulator.

    0
  • #11 09 Cze 2009 14:28
    chudybyk
    Poziom 27  

    Nareszcie zaczynam rozumieć. ;-)
    Ta Jagoda jest programem, który w zasadzie udaje symulator. Dostęp do urządzeń zewnętrznych - w tym klawiatury i wyświetlacza jest umożliwiony tylko przez predefiniowane procedury.
    Musisz sprawdzić jakie wartości dostaniesz po naciśnięciu określonych klawiszy. Wartośc ta znajduje się w akumulatorze po wyjściu z procedury WAIT_KEY.

    0
  • #12 09 Cze 2009 15:07
    grad3d
    Poziom 9  

    to fajnie:D

    a wiec naciśniecie klawisza "prawo" w akumulatorze 0B w "lewo" 0A w "dół" 0D w "górę" 0C. Teraz kombinuje żeby w rejestrach np R5 zapisać 0B w R6 0A itp a później chciałbym to porównać do akumulatora i jeśli by było równe to wykonało by dane działanie a jeśli nie to przeskoczyło by do następnego działa i by sprawdzało znów co jest w akumulatorze w następnym rejestrze. tylko coś mi nie wychodzi z tym porównaniem jak na razie próbuje komendom CJNE ale znalazłem teraz CMP do porównania poczytam więcej i zacznę kombinować :) chyba dobrze kombinuje??

    0
  • #13 09 Cze 2009 15:13
    SciroWroc
    Poziom 13  

    nie wiem jaki tam jest assembler. na Atmege16 mam coś takiego.

    procedura jest wywoływana z tajmera co 20 ms

    Code:

    ;########################################################################################
    skan_klawiszy:


       
       ldi acc,0x0F            ;ustawienie wierszy jako WEJ, a kolumn jako WYJ
       out DDRB,acc
       
       ldi acc,0xF0            ; wlaczenie pull-up na WEJ
       out PORTB,acc
       out PINB,acc
       nop   nop   nop   nop   nop

       ldi klawisz,0x00

       sbis PINB,0x04
       ldi klawisz,0x10

       sbis PINB,0x05
       ldi klawisz,0x20

       sbis PINB,0x06
       ldi klawisz,0x30

       sbis PINB,0x07
       ldi klawisz,0x40
       

       ldi acc,0xF0            ;ustawienie wierszy jako WEJ, a kolumn jako WYJ
       out DDRB,acc
       
       ldi acc,0x0F            ; wlaczenie pull-up na WEJ
       out PORTB,acc
       out PINB,acc
       nop   nop   nop   nop   nop


       ldi acc,0x01   
       sbis PINB,0x01
       add klawisz,acc

       ldi acc,0x02
       sbis PINB,0x02
       add klawisz,acc

       ldi acc,0x03
       sbis PINB,0x03
       add klawisz,acc   

       
       reti
    ;########################################################################################


    Jeżeli wciśnięty jest jakiś klawisz w zmiennej klawisz masz zapisany kod przycisku w formacie (wiersz;kolumna)
    numer wiersza i kolumny liczony:
    pierwszy wiersz od dołu ma wartość 1, wiersz na samej górze ma wartość 4
    kolumny liczone od prawej do lewej. kolumna pierwsza z prawej ma wartość 1, kolumna z lewej ma wartość 3

    Jest to klawiatura 3 kolumny, 4 wiersze
    taka jak tu

    W pętli głównej programu sprawdzam wartość zmiennej "klawisz" i wywołuje odpowiednią procedurę.
    Przykładowe wywołanie dla klawiszy 4 i 6

    Klawiatura podpięta do portu B, piny PB1 do PB7


    Code:
                         ;*********************
    




                            
       ldi acc,0x31                                          ;klawisz 6                                                
       cpse acc,klawisz      ;sprawdzenie znacznika wcisniecia przycisku
       rjmp k31a            ;jezeli nie jest to wyskocz z procedury
       ldi klawisz,0x00      ;zdejmij znacznik wcisniecia

       ldi acc,0x01
       sts okno,acc
       rcall szukaj_maksimum_lcd   
    k31a:

                         ;*********************
                            
       ldi acc,0x33                                          ;klawisz 4
       cpse acc,klawisz      ;sprawdzenie znacznika wcisniecia przycisku
       rjmp k33a            ;jezeli nie jest to wyskocz z procedury
       ldi klawisz,0x00      ;zdejmij znacznik wcisniecia

       ldi acc,0x00
       sts okno,acc
       rcall stopnie
       rcall aktualizacja_danych_na_lcd   
    k33a:   

    0
  • #14 09 Cze 2009 17:54
    chudybyk
    Poziom 27  

    Dobrze kombinujesz. Porównanie można zrobić przez CMP, ale chyba jednak wygodniej będzie przez CJNE, bo po CMP trzeba dołożyć odpowiednią instrukcję skoku.
    CJNE może jako argument przyjmować wartości bezpośrednie, czyli porównywać rejestr z wartością
    np.:
    CJNE A,#0Bh,skok_jesli_rozne
    jesli_rowne_OBh: cośtam dalej
    .
    .
    .
    skok_jesli_rozne:

    Tym co napisał kolega SciroWroc się nie przejmuj, dotyczy to zupełnie innej architektury. Jest po prostu z innej bajki.
    Powodzenia w programowaniu!

    0
  • #15 09 Cze 2009 18:46
    grad3d
    Poziom 9  

    Powyższym przykładem się nie przemyje bo nie wiem o co tam chodzi ale dziękuje za chęć pomocy :D poradziłem sobie z moim problemem metodą prób i błędów z CMP mi nic nie wyszło to czytałem dalej i wpadłem na takie rozwiązanie gdy nacisnę odpowiedni klawisz to zeruje się odpowiedni bit w rejestrze B od 0 do 7 np. gdy się wciśnie klawisz "prawo" zeruje się B.3 a później sprawdzam czy mam zero jeśli tak to skacze do odpowiedniej etykiety i dzięki temu mam już 140 linijek kodu i dalej pisze :)
    Dziękuje za pomoc i cierpliwość :D

    może się komuś przyda :

    Code:

            LCALL   LCD_CLR     
       LCALL   WAIT_KEY     
       MOV   R3,A                     
       LCALL   WRITE_HEX   
       MOV   R0,#CSKB1           
       CLR   B
       LCALL   WAIT_KEY
       MOVX   A,@R0
       MOV   B,A
       JNB   B.3, DODAWANIE
       JNB   B.2, ODEJMOWANIE
       JNB   B.4, DZIELENIE
       JNB   B.5, MONOZENIE



    Ps. a tak na koniec może ktoś wie jak wyświetlić pojedynczy piksel na LCD który będę chciał albo więcej takich pikseli bo chciałbym zrobić mały rysunek ? :D

    1
  Szukaj w 5mln produktów