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.

Bascom obsługa przycisku klawiatury i LCD 4x20

fliper_katrill 11 Mar 2009 12:29 3469 23
  • #1 11 Mar 2009 12:29
    fliper_katrill
    Poziom 20  

    Witam serdecznie!
    Mam problem z uruchomieniem menu jak na obrazku , proszę chociaż o podpowiedź :)

    Code:

    $regfile = "m16def.dat"
    $crystal = 12000000

    Config Lcd = 20 * 4

    Deflcdchar 0 , 16 , 24 , 28 , 30 , 30 , 28 , 24 , 16

    Dim X as byte

    Up Alias Porta.0
    Menu Alias Porta.1
    Left1 Alias Porta.2
    Down Alias Porta.3
    Right1 Alias Porta.4

    set Porta.0
    set Porta.1
    set Porta.2
    set Porta.3
    set Porta.4

    Cls

    Do

    Locate 1 , 2
    Lcd "xxxxxxxxxxxx"
    Locate 2 , 2
    Lcd "xxxxxxxxxxxx"
    Locate 3 , 2
    Lcd "xxxxxxxxxxxx"
    Locate 4 , 2
    Lcd "xxxxxxxxxxxx"

    If Down=0 then
        X=1
    ...........
    ...........
    ...........
    end if

    Locate X, 1
    Lcd Chr(0);

    Loop

    End


    Bascom obsługa przycisku klawiatury i LCD 4x20

    Poza tym klawiatura wydaje się być głucha na "Menu=0"
    Dzięki :)

    Tematy związane z programowaniem mikrokontrolerów proszę zakładać w dziale Mikrokontrolery.
    Przeniosłem z Programowanie początkujący.
    [Dr.Vee]

    0 23
  • #2 11 Mar 2009 14:24
    atom1477
    Poziom 43  

    Może

    Code:

    $regfile = "m16def.dat"
    $crystal = 12000000

    Config Lcd = 20 * 4

    Deflcdchar 0 , 16 , 24 , 28 , 30 , 30 , 28 , 24 , 16

    Dim X as Byte
    Dim S1 As Byte

    Up Alias Pina.0
    Menu Alias Pina.1
    Left1 Alias Pina.2
    Down Alias Pina.3            '<-- Ile razy już o tym było!!!
    Right1 Alias Pina.4

    set Porta.0
    set Porta.1
    set Porta.2
    set Porta.3
    set Porta.4

    X = 1

    Cls

    Do

      Locate 1 , 2
      Lcd "xxxxxxxxxxxx"
      Locate 2 , 2
      Lcd "xxxxxxxxxxxx"
      Locate 3 , 2
      Lcd "xxxxxxxxxxxx"
      Locate 4 , 2
      Lcd "xxxxxxxxxxxx"

      If Down = 0 then
          If S1 = 0 Then
              S1 = 1
     
              Incr X

              If X > 4 Then
                  X = 1
              End If
          End If
      Else
        S1 = 0
      End if




      For I=1 to 4
          If X = I Then
              locate X,1
              Lcd Chr(0);
          Else
              locate X,1
              lcd " "
          End If
      Next I
    Loop

    End

    0
  • #3 11 Mar 2009 19:54
    fliper_katrill
    Poziom 20  

    Code:

    If Down = 0 then
        If S1 = 0 Then
            S1 = 1

            Incr X1

           If X1 > 4 Then
               X1 = 1
           End If
        End If
    Else
        S1 = 0
    End if


    proszę wytłumacz mi linijka po linijce co było Twoim założeniem?
    nie definiowałeś S1 jako port?

    0
  • #4 11 Mar 2009 20:00
    wader_669
    Poziom 28  

    atom1477 masz chyba buga w programie. W tym programie co napisales bedzie dzialac stawianie tego znaku ale chyba nie bedzie kasowac tego wczesniejszego.

    Ja bym dodal:

    Code:

    locate 1,1
    lcd " "
    locate 1,2
    lcd " "
    locate 1,3
    lcd " "
    locate 1,4
    lcd " "

    w sumie pozadnie bym to tak zrobil

    Code:

    sub wyczysc_kursor
    local i as byte
    for i=1 to 4
    locate 1, i
    lcd " "
    next
    end sub


    Jak sa jakies bledy to sorry.

    Poza tym bym wywalil wyswietlanie na lcd napisow z petli

    0
  • #5 11 Mar 2009 20:06
    atom1477
    Poziom 43  

    Nie będę tłumaczył linijka po linijce to bo to bez sensu.
    Po co miałem definiować S1 jak o Port?

    Jak wciśniesz Down to sprawdza czy S1 = 0. S1 będzie równe 0 gdy przycisk wcześniej nie był wciśnięty. Jak nie był wciśnięty to zaznacza że już jest wciśnięty (S1 = 1) i zwiększa zmienną X.

    Przy kolejnym sprawdzaniu stanu przycisku dojdzie do wniosku że jest wciśnięty, ale S1 nie będzie już równe 0, więc ponownie nie zwiększy zmiennej X.

    Dopiero jak puścisz przycisk to zmienna S1 zostanie ustawiona na 0 i ponowne wciśnięcie przycisku spowoduje kolejne zwiększenie X.

    Bez tego trzymanie przycisku powodowało by ciągłe zwiększanie X kilkadziesiąt razy na sekundę.

    To chyba rozumiesz:

    Code:

           If X > 4 Then
               X = 1
           End If

    ?

    0
  • #6 11 Mar 2009 20:08
    wader_669
    Poziom 28  

    chyba lepiej uzyc bitwait down, set

    0
  • #7 11 Mar 2009 20:09
    atom1477
    Poziom 43  

    Faktycznie (dotyczy postu wader_669-a dwa posty wyżej).

    Albo nawet tak:

    Code:

      For I=1 to 4
          If X = I Then
              locate 1,I
              lcd Char(0)
          Else
              locate 1,I
              lcd " "
          End If
      Next I

    0
  • #8 11 Mar 2009 20:28
    fliper_katrill
    Poziom 20  

    Code:

    If Dol = 0 Then
      For I=1 to 4
          If X = I Then
              Locate I , 1
              Lcd Chr(0);
          Else
              Locate I , 1
              Lcd " "
          End If
      Next I
    End If

    w tej formie wskaźnik wiersza się nie przesuwa

    0
  • #9 11 Mar 2009 20:42
    atom1477
    Poziom 43  

    A dlaczego dałeś to w:

    Code:

    If Dol = 0 Then
      ..
      ..
    End If

    ?


    To ma być w pętli głównej.

    0
  • #10 11 Mar 2009 20:52
    fliper_katrill
    Poziom 20  

    no i jest :)

    Code:

    $crystal = 12000000

    Dim X As Byte , I As Byte
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7

    Deflcdchar 0 , 16 , 24 , 28 , 30 , 30 , 28 , 24 , 16


    Costam Alias Pina.0
    Zapis Alias Pina.1
    Lewo Alias Pina.2
    Dol Alias Pina.3
    Prawo Alias Pina.4
    Menu Alias Pina.5
    Gora Alias Pina.6
    Buzzer Alias Portc.7

    Set Porta.0
    Set Porta.1
    Set Porta.2
    Set Porta.3
    Set Porta.4
    Set Porta.5
    Set Porta.6

    Cursor Off
    Cls

    X = 1

    Reset Buzzer
    Set Buzzer
    Waitms 50
    Reset Buzzer

    Do

    Locate 1 , 2
    Lcd "aaaaaaaaaaaaa"
    Locate 2 , 2
    Lcd "bbbbbbbbbbbbb"
    Locate 3 , 2
    Lcd "ccccccccccccc"
    Locate 4 , 2
    Lcd "ddddddddddddd"


    If Dol = 0 Then
      For I=1 to 4
          If X = I Then
              Locate I , 1
              Lcd Chr(0);
          Else
              Locate I , 1
              Lcd " "
          End If
      Next I
    End If



    Loop
    End

    0
  • #11 11 Mar 2009 21:01
    atom1477
    Poziom 43  

    ;p

    Tak jak w moim pierwszym poście.

    0
  • #12 11 Mar 2009 21:10
    fliper_katrill
    Poziom 20  

    powiedz mi kolego bo widzę że jesteś w temacie dlaczego ten kod nie działa na dol=0?

    Code:


    If Dol = 0 Then
       Locate I , 1
       Lcd Chr(0);
       X = I - 1
       Locate X , 1
       Lcd " "
       Incr I
          If I > 4 Then
          I = 1
          End If
    End If



    ogólnie robi co chcę ale nie jest pod wpływem przycisku "dol"
    ps. deklaracja portów jak w kodzie wyżej

    0
  • #13 11 Mar 2009 21:24
    wader_669
    Poziom 28  

    poczytaj troche o funkcji debounce, po co ona jest.
    Gdy nacisniesz przycisk zdarza sie ze palec lekko drzy.
    Dlatego tez poleca sie robic cos takiego:

    Code:

    if przycisk=0 then
    waitms 45 ' czeka az uspokoi sie palec
    if przycisk=0 then ' teraz sprawdza czy nadal jest wcisniety

    ' wtedy wykonuje cos

    end if
    end if


    po 2 masz to w zlej kolejnosci. Tak powinno to dobrze wygladac:
    Code:

    If Dol = 0 Then
    waitms 45
    if dol = 0 then
    Incr I
          If I > 4 Then
          I = 1
          End If

       Locate I , 1
       Lcd Chr(0);
       X = I - 1
       Locate X , 1
       Lcd " "
       

    end if
    End If


    Radze przeczytac helpa i jakies kursy. Pozatym naucz sie myslec podobnie jak procesor.
    Czas chyba zamknac temat, bo jest to lekka przesada na taki banalny temat tyle pisac

    0
  • #14 11 Mar 2009 22:11
    fliper_katrill
    Poziom 20  

    może i błahy temat ale wiele tłumaczy i z tej wiedzy korzystam :)
    ostateczna wersja kodu który działa tylko w symulatorze (klawiatura i układ sprawdzone to nie ich wina) nadal nie działa przycisk klawiatury!!! (tym razem "menu" zamiast "dol", zamieniłem je celowo myśląc że to wina połaczenia), tak więc ostatni raz proszę o pomoc :) (debounce działą zamiennie jak ten sposób z if..then..)

    Code:

    $crystal = 8000000

    Dim X As Byte , I As Byte
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7

    Deflcdchar 0 , 16 , 24 , 28 , 30 , 30 , 28 , 24 , 16

    Config Pina.0 = Input
    Config Pina.1 = Input
    Config Pina.2 = Input
    Config Pina.3 = Input
    Config Pina.4 = Input
    Config Pina.5 = Input
    Config Pina.6 = Input
    Config Pinc.7 = Output

    Costam Alias Porta.0
    Zapis Alias Porta.1
    Lewo Alias Porta.2
    Dol Alias Porta.3
    Prawo Alias Porta.4
    Menu Alias Porta.5
    Gora Alias Porta.6
    Buzzer Alias Portc.7

    Set Porta.0
    Set Porta.1
    Set Porta.2
    Set Porta.3
    Set Porta.4
    Set Porta.5
    Set Porta.6

    Cursor Off
    Cls

    I = 1

    Reset Buzzer
    Set Buzzer
    Waitms 50
    Reset Buzzer

    Do

    Locate 1 , 2
    Lcd "aaaaaaaaaaaaa"
    Locate 2 , 2
    Lcd "bbbbbbbbbbbbb"
    Locate 3 , 2
    Lcd "ccccccccccccc"
    Locate 4 , 2
    Lcd "ddddddddddddd"


    If Menu = 0 Then
    Waitms 45
    If Menu = 0 Then
       Locate I , 1
       Lcd Chr(0);
       X = I - 1
       Locate X , 1
       Lcd " "
       Incr I
          If I > 4 Then
          I = 1
          End If
    End If
    End If


    Loop
    End

    0
  • #15 11 Mar 2009 22:31
    karlos79
    Poziom 33  

    Witam
    Zmień wreszcie w aliasach z portx.x , na pinx.x.
    Piszesz pinx.x kiedy chcesz sprawdzić jego stan (wejście),
    Kiedy chcesz coś wystawić na nogę, to napisz portx.x.

    Code:

     Config Pina.0 = Input
    Config Pina.1 = Input
    Config Pina.2 = Input
    Config Pina.3 = Input
    Config Pina.4 = Input
    Config Pina.5 = Input
    Config Pina.6 = Input
    Config Portc.7 = Output

    Costam Alias Pina.0
    Zapis Alias Pina.1
    Lewo Alias Pina.2
    Dol Alias Pina.3
    Prawo Alias Pina.4
    Menu Alias Pina.5
    Gora Alias Pina.6
    Buzzer Alias Portc.7


    Przydało by się napisać jeszcze na jaki kontroler piszesz kod.
    I umieścić taki zapis na początku programu:
    Code:

      $regfile = "M8def.dat" ' to tak dla przykładu

    Pozdrawiam

    0
  • #16 11 Mar 2009 23:26
    atom1477
    Poziom 43  

    karlos79 napisał:
    Zmień wreszcie w aliasach z portx.x , na pinx.x.


    Włacha.

    To nie może nie działać.

    0
  • #17 12 Mar 2009 10:20
    fliper_katrill
    Poziom 20  

    Działa śmiga, dzięki Panowie :)
    Jeszcze jedna mała kwestia, jeśli macie chwilkę....
    Strzałka staje na 4 wierszu , zrobiłem tak aby tam była przy naciskaniu "Dol" po raz 4 (takie ograniczenie celowe) da się to szybko przerobić aby potem wracała na górę max 1 wiersz (po naciskaniu "Gora")??

    0
  • #18 12 Mar 2009 12:54
    atom1477
    Poziom 43  

    Czyli naciskasz 3 razy i dochodzi do 4 wiersza. Naciskasz 4-ty raz a ona dalej stoi na 4 wierszu?

    Pokaz kod który to robi.

    Co to znaczy "max 1 wiersz"?

    W moim kodzie po wierszu 4 wraca do wiersza 1.
    Ale jeżeli chcesz szybki powrót przy naciśnięciu "Góra" to oczywiście się da, tylko nie wiem po co.

    0
  • #19 12 Mar 2009 14:12
    fliper_katrill
    Poziom 20  

    Code:

    If Menu = 0 Then
    Waitms 45
    If Menu = 0 Then
       Locate I , 1
       Lcd Chr(0);
       X = I - 1
       Locate X , 1
       Lcd " "
       Incr I
          If I > 4 Then
         [b] I = 4[/b]
          End If
    End If
    End If


    Chodzi o to że zrobiłem klawiaturę z przeznaczeniem zmiany parametrów góra-dół i +/- (góra dół to zmiana pozycji wiersza w menu, bo oczywiście jest ono dużo bardziej rozbudowane a +/- zmiana nastawy zmiennych np. czasowych)
    Bascom obsługa przycisku klawiatury i LCD 4x20

    Dodano po 2 [minuty]:

    max 1 wiersz znaczy żeby się przesunął w górę nie dalej niż na pierwszy wiersz a jak dalej ktoś naciśnie "gora" to i tak zostanie na pierwszym wierszu, można będzie tylko zjechać na dół

    0
  • #20 12 Mar 2009 14:18
    Maciek4141
    Poziom 22  

    Nie ma to jak menu w bascomie, poczytaj o sub`ach. Najpierw sobie rozplanuj porządnie to menu-określ liczbę tych ustawień. Następnie niech każde twoje ustawienie odpowiada innemu sub`owi, czyli deklarujesz zmienną np. miejsce_menu i po każdym naciśnięciu góra/dół sprawdzasz aktualną wartość miejsce_menu i skaczesz do odpowiedniego sub`a, w którym masz możliwość ustawień. Tak będzie o wiele łatwiej.

    0
  • #21 12 Mar 2009 16:15
    wader_669
    Poziom 28  

    bez przesady poczytaj kursy i zagladaj do helpa.
    Troche przeginasz, nawet jak ktos ci napisze gotowca to bedziesz dalej zadawal pytanie, bo nie rozumiesz o co chodzi.

    Jak chcesz to ci napisze caly kod za siano ale to na pw

    Dodano po 10 [minuty]:

    ok zal mi sie ciebie zrobilo jak zobaczylem to:

    Code:

          If I > 4 Then
         [b] I = 4[/b]
          End If


    tu masz jak to powinno poprawnie wygladac:
    Code:

    If menu=0 and i<5 then
    waitms 45
    if menu=0 then

    0
  • #22 12 Mar 2009 16:47
    atom1477
    Poziom 43  

    A co jest w tym poprawnego?

    Dodano po 3 [minuty]:

    Może to że warunek nie będzie wykonywany przy każdym naciśnięciu przycisku?

    Wersja z

    Code:

    Inc I

    If I > 4 Then
         I = 4
    End If


    Faktycznie będzie robiła bezsensowne obliczenia, ale zauważ że każda przypadkowa zmiana zmiennej I (na przykład pod wpływem silnego impulsu elektromagnetycznego) zostanie od razu zauważona i zmienna I zostanie przywrócona do poprawnego zakresu 1...4.

    W Twoim kodzie tak nie będzie. Jak zmienna I wyskoczy powyżej 4 to już tak zostanie na wieki wieków (niech ktoś napisze "Amen").

    0
  • #23 12 Mar 2009 18:26
    Maciek4141
    Poziom 22  

    Menu to nie jest taka trudna rzecz, tylko wymaga przede wszystkim znajomości podstaw i logiki. My na pewno na forum tego nie zrobimy, bo tu ciężko o free gotowca. Coraz częściej widać osoby które porywają się na coś z czym mają problem. Musisz sobie wszystko przemyśleć, najlepiej najpierw zajmij się główną częścią programu, a nie menu. Uwierz mi że jak zabierzesz się za menu, to potem ciężko początkującemu (tobie) będzie wcisnąć resztę, o wiele ważniejszych funkcji.

    0
  • #24 12 Mar 2009 18:44
    fliper_katrill
    Poziom 20  

    bo to jest tak.....rzucam pomysł i zaczynam wertować, szukam rozwiązań, Wy szanowni koledzy mi je podpowiadacie za co z góry dziękuję :), czy to takie złe?? jak dotąd zawsze tak działałem no i nie bez bólu osiągnąłem swoje a wiedza nabyta przez takie wydawać by się mogło głupawe posty jest przeogromna i nie do przecenienia, a sposób w jaki szukam rozwiązania spowoduje że jej nie zapomnę a zapamiętam , ot cała filozofia :) jeszcze raz dziękuję :)
    PS nie ma problemów z obsługą wyświetlaczy, RTC, transmisji danych, temperatury i to jest w tym najśmieszniejsze :D

    0
  Szukaj w 5mln produktów