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

Bascom obsługa przycisku klawiatury i LCD 4x20

fliper_katrill 11 Mar 2009 12:29 3769 23
REKLAMA
  • #1 6266495
    fliper_katrill
    Poziom 20  
    Witam serdecznie!
    Mam problem z uruchomieniem menu jak na obrazku , proszę chociaż o podpowiedź :)

    
    $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]
  • REKLAMA
  • #2 6266947
    Konto nie istnieje
    Poziom 1  
  • #3 6268545
    fliper_katrill
    Poziom 20  
    
    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?
  • #4 6268587
    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:
    
    locate 1,1
    lcd " "
    locate 1,2
    lcd " "
    locate 1,3
    lcd " "
    locate 1,4
    lcd " "
    

    w sumie pozadnie bym to tak zrobil

    
    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
  • #5 6268626
    Konto nie istnieje
    Poziom 1  
  • #6 6268637
    wader_669
    Poziom 28  
    chyba lepiej uzyc bitwait down, set
  • REKLAMA
  • #7 6268649
    Konto nie istnieje
    Poziom 1  
  • #8 6268766
    fliper_katrill
    Poziom 20  
    
    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
  • #9 6268860
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #10 6268922
    fliper_katrill
    Poziom 20  
    no i jest :)
    
    $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
    
  • #11 6268985
    Konto nie istnieje
    Poziom 1  
  • #12 6269040
    fliper_katrill
    Poziom 20  
    powiedz mi kolego bo widzę że jesteś w temacie dlaczego ten kod nie działa na dol=0?
    
    
    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
  • #13 6269120
    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:

    
    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:
    
    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
  • #14 6269426
    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..)
    
    $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
    
  • #15 6269555
    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.
    
     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:
    
      $regfile = "M8def.dat" ' to tak dla przykładu
    

    Pozdrawiam
  • #16 6269829
    Konto nie istnieje
    Poziom 1  
  • #17 6270648
    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")??
  • #18 6271113
    Konto nie istnieje
    Poziom 1  
  • #19 6271382
    fliper_katrill
    Poziom 20  
    
    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ół
  • REKLAMA
  • #20 6271411
    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.
  • #21 6271968
    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:
    
          If I > 4 Then
         [b] I = 4[/b]
          End If 
    


    tu masz jak to powinno poprawnie wygladac:
    
    If menu=0 and i<5 then
    waitms 45
    if menu=0 then
    
  • #22 6272130
    Konto nie istnieje
    Poziom 1  
  • #23 6272639
    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.
  • #24 6272735
    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
REKLAMA