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, program dodający liczby. Wyświetlanie wyniku po naciśnięciu klawisza.

predus 17 Sty 2005 20:14 1986 10
REKLAMA
  • #1 1147249
    predus
    Poziom 11  
    Posty: 6
    Witam
    Od razu zaznaczę, że jestem poczatkujacym w tej dziedzinie, uzywam Jagody. Mam taki program ktory dodaje 2 cyfry, moja wiedza pozwala mi to by go przerobic tak, ze bedzie dodawal np 3, 4 czy wiecej cyfr, ale chcialbym go zmodyfikowac tak, by sume wyswietlal na wyswietlaczu LCD dopiero po wcisnieciu Enter na klawiaturze matrycowej.... i tu pojawia sie problem poniewaz mimo usilnych staran nie wiem jak zrobic by dzialo sie "cos" (w tym wypadku sumowanie wprowadzonych wartosci) przy nacisnieci odpowiedniego klawisza. Bede bardzo wdzieczny za pomoc. A tu kod jaki mam:

    LJMP START
    ORG 100H
    START:

    LCALL LCD_CLR

    LCALL WAIT_KEY
    MOV R0,A
    LCALL WRITE_HEX

    MOV A,#'+'
    LCALL WRITE_DATA

    LCALL WAIT_KEY
    MOV R1,A
    LCALL WRITE_HEX

    MOV A,#'='
    LCALL WRITE_DATA

    MOV A,R0
    ADD A,R1

    LCALL WRITE_HEX

    LJMP $
  • REKLAMA
  • #2 1147782
    hEx
    Poziom 13  
    Posty: 74
    Pomógł: 1
    Czesc
    1. Jesli enter jest dolaczony do np p3.2 to mozna to zrobic uzywajac zewnetrznego przerwania (odblokowujesz w rejestrze IE INT0, i potem w podprogramie robisz skok do tej procedury liczaco-wyswietlajacej)
    2. Mozna tez sprawdzac np JB nr_portu(np. p1.4),$ - program przejdzie do tego co jest po tym jesli p1.4 = 0 czyli nacisnieto klawisz p1.4

    Polecam ta stronke - http://www.mikrokontrolery.of.pl/
  • #3 1148325
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Kolego musisz to przerobić w taki sposób żeby procesorek wiedział co chcesz w danym momencie robić, czy wpisujesz kolejną cyfrę czy sumujesz. Nie mam przed sobą kodów do klawiszy więc może to jasno nie wyglądać
    
    ROWNA EQU 'tutaj kod klawisza pod którym znak równa'
    
    LJMP START
    ORG 100H
    START:
    
    MOV R0,#0    'wynik
    MOV R1,#0
    
    LCALL LCD_CLR
    
    LCALL WAIT_KEY
    MOV R0,A
    LCALL SUMA
    LCALL WRITE_HEX
    
    LCALL WAIT_KEY
    CJNE A,ROWNA,WYNIK     ;czy plus czy wynik
    
    DANA:
    LCALL WRITE_DATA      ; jeżeli nie równa się to następna dana
    MOV R1,A
    LCALL WRITE_HEX
    LCALL SUMA
    LCALL KLAWISZ
    LCALL WAIT_KEY
    CJNE A,ROWNA,DANA
    
    WYNIK:
    MOV A,#'='
    LCALL WRITE_DATA
    
    MOV A,R1
    
    LCALL WRITE_HEX
    
    LJMP $
    
    SUMA:
    MOV A,R0
    ADD A,R1
    MOV R1,A
    RET
    
    

    Oczywiście to jest jedno z możliwych rozwiązań pisane zresztą na kolanie. Nie jest tu oczywiście uwzględnione przeniesienie.
    Pozdrawiam
  • REKLAMA
  • #4 1149487
    predus
    Poziom 11  
    Posty: 6
    Witam
    Dzieki za pomoc. Z samym konczeniem sumowania przez wcisniecie Entera juz sobie jako tako poradzilem. Mam jeszcze taki problem, ze chcialbym sumowac tylko cyfry mniejsze od 7, ale nie blokowac wprowadzania z klawiatury wiekszych. Nie wiem jakim rozkazem sie posluzyc i czy jest mozliwosc zrobienia np. czegos takiego, ze "jak cyfra mniejsza od 7 zapisz dajmy na to do R0, a jak wieksza to nic nie rob".
  • REKLAMA
  • #5 1149595
    hEx
    Poziom 13  
    Posty: 74
    Pomógł: 1
    Moze np. tak:

    CJNE A,#8,nie_rowne ;cy=1 jesli A<8 ,cy=0 jesli a>=8
    nie_rowne:
    jnc wieksze_od_8; jesli cy=0 to skok
    ;tutaj zapisz do r0
    wieksze_od_8
    ;tutaj nie rob nic
  • REKLAMA
  • #6 1149841
    predus
    Poziom 11  
    Posty: 6
    Dzieki ! Wlasnie o to mi chodzilo. Dziala swietnie :)
  • #7 1151710
    predus
    Poziom 11  
    Posty: 6
    Witam ponownie
    Idac dalej za ciosem chcialem zrobic, zeby wcisniety klawisz ukazywal sie na wyswietlaczu 7 segmentowym. Np wcisne 1 to na wyswietlaczu zapali sie odpowiednik jedynki a jak wcisne np 3 to trojki itd. Z tego co wiem to numer wcisnietego klawisza jest w akumulatorze po uzyciu WAIT_KEY ale jak mam zmusic program by skoczyl w konkretne miejscie (w tym wypadku zapalil odpowiednio wyswietlacz) dla konkretnego klawisza? Cyferki powinny sie pokazywac jedna po drugiej
  • #8 1153442
    hEx
    Poziom 13  
    Posty: 74
    Pomógł: 1
    Czesc
    Wydaje mi sie ze trzeba zrobic tablice po ktorej program bedzie przesowany o wcisniety klawisz. Tablica powina zawierac kody poszczegolnych liczb (np. zeby bylo 8 z kropka trzeba zapalic wszystkie 7 segmentow i kropke = FFH). Zaznaczam ze te moje rozwazania sa tylko teoretyczne bo takim wys. z asm jeszcze nie mialem okazji sie bawic. Czyli cos takiego:
    MOV DPTR,#TABLICA ; wsadz do dptr adres tablicy
    MOVC A,@A+DPTR ;kopiuj do A dana z komorki ,ktorej adres jest suma A i Dptr, ;A jest jakby suwakiem po tablicy
    SJMP KONIEC
    TABLICA: db cosH,cosH,cosH....,FFH,cosH ;tutaj sa kody hex konkretnych cyfr
    KONIEC:
    Potem trzeba wlaczyc tranzystor kluczujacy i wyslac bajt z A na jakis port, do ktorego podpiety jest wys
  • #9 1154698
    predus
    Poziom 11  
    Posty: 6
    Witam
    hmm moze cos pokombinuje :)
    Ale jak zmusic program by skakal w konkretne miejsce tylko dla konkretnej wartosci w akumulatorze lub w okreslonym rejestrze. Uzywajac CJNE jakos sie da ? Chodzi mi o to ze jak wprowadze z klawiatury matrycowej 1 to skoczy tu a jak dwa do w inne miejsce itd.
  • #10 1155081
    hEx
    Poziom 13  
    Posty: 74
    Pomógł: 1
    Oczywiscie ze cjne sie da. Dam tutaj jedna z mozliwosci , z tym ze jest ona dosyc toporna i pewnie da sie to zrobic w jakis inny,elegantszy sposob ale nic mi innego teraz nie przychodzi do glowy:

    cjne a,#1,nie1 ;jesli a!=1 to idziemy sprawdzic czy = 2
    sjmp jesli_1 ;jesli a=1 to skok
    nie1:
    cjne a,#2,nie2
    sjmp jesli_2
    nie2:
    ;itd.


    jesli_1:
    ;tu cos jesli A=1
    ret
    jesli_2:
    ;tu cos jesli A=2
    ret
  • #11 1155339
    predus
    Poziom 11  
    Posty: 6
    No wlasnie jakis czas temu do tego doszedlem i mialem napisac, ze juz wiem jak to zrobic :) Mimo wszystko dzieki za pomoc !!

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy modyfikacji programu w asemblerze dla mikrokontrolera DSM-51, który dodaje cyfry i wyświetla wynik na LCD po naciśnięciu klawisza Enter na klawiaturze matrycowej. Zaproponowano wykorzystanie zewnętrznego przerwania (np. INT0) lub sprawdzanie stanu pinu portu (np. JB p1.4,$) do wykrycia naciśnięcia klawisza Enter. Przedstawiono przykładową strukturę programu, która rozróżnia wprowadzanie cyfr od sumowania po naciśnięciu klawisza równości, z uwzględnieniem prostego mechanizmu sumowania bez przeniesienia. Omówiono także sposób filtrowania cyfr mniejszych od 7 za pomocą instrukcji CJNE i JNC, aby zapisywać tylko wybrane wartości do rejestru. W kolejnych postach poruszono temat wyświetlania wciśniętych cyfr na wyświetlaczu 7-segmentowym, sugerując użycie tablicy kodów segmentów i instrukcji MOVC do odczytu odpowiedniego kodu na podstawie wartości w akumulatorze. Zaproponowano również metodę rozgałęziania programu na podstawie wartości w akumulatorze za pomocą łańcucha instrukcji CJNE i skoków warunkowych, umożliwiając wykonanie różnych procedur dla poszczególnych klawiszy. Całość dotyczy programowania w asemblerze mikrokontrolera DSM-51 z wykorzystaniem klawiatury matrycowej, wyświetlacza LCD oraz 7-segmentowego.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA