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

Błąd w obsłudze klawiatury matrycowej w programie 8051 [DSM-51]

Mac Abra 02 Cze 2012 12:51 2317 2
REKLAMA
  • #1 10958781
    Mac Abra
    Poziom 11  
    Posty: 23
    Ocena: 5
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ktoś potrafi mi pomóc? Fragment programu wysypuje się mniejwięcej za połową. Wygląda to tak że user wprowadza cyfry z klawiatury matrycowej i na koniec naciska klawisz A. Wtedy program ma do rejestrow R0 i R2 zapisać ostatnią wprowadzoną cyfrę. Czyli po kolei wrzucam sobie na stos i jak jest wcisniete A to sciagam A ze stosu, czyszcze akumulator i znowu sciagam to co było przed A.
  • REKLAMA
  • Pomocny post
    #2 11006882
    tamam
    Poziom 17  
    Posty: 115
    Pomógł: 25
    Ocena: 2
    Po wywołaniu WAIT_KEY kod klawisza masz w akumulatorze i zpisujesz wszystkie "próby" na stosie do czasu aż zakończysz 0x0A. Potem zdejmujesz tylko te dwa ostatnie znaki (0x0A) i ten kod. A wszystkie pozostałe nie są ze stosu zdejmowane.
    Masz wtedy niezrównoważony stos. Musisz mieć tyle samo rozkazów POP ile PUSH, bo inaczej Ci się stos przepełni dość szybko i zaczniesz nadpisywać dane ( albo rejestry) - zależy gdzie umieścisz wskaźnik początku stosu SP przy inicjalizacji.
    Można zliczać ilość zapisów na stosie, albo przywrócić oryginalny startowy SP, albo też przebudować i zrobić to inaczej - bez stosu (z jednobajtową zmienną "podstawa")

    
                  MOV A,#01h  ;domyslna "podstawa=01h" gdy pierwszy klawisz to "0Ah"
    WPROWADZ_PODSTAWE:
                  MOV podstawa,A     ;zapamietaj wprowadzony klawisz (<>0Ah) albo wartosc domyslna
                  LCALL WAIT_KEY
                  CJNE A,#0Ah,WPROWADZ_PODSTAWE  ;sprawdz czy koniec kodem 0Ah
                  MOV A,podstawa     ;odtworz wprowadzony znak przed kodem 0Ah
                  MOV R0,A
                  MOV R2,A
    
  • #3 11063862
    Mac Abra
    Poziom 11  
    Posty: 23
    Ocena: 5
    Chodziło o to, że stos był nieustawiony, tak że masz racje :)

    Problem rozwiązany
REKLAMA