Bascom pytanie


Witam
Jestem początkowym programistą, chciałbym napisać program taki:
Gdy nacisnę przycisk S1 to na wyświetlaczu pojawi mi się, 1 gdy drugi raz nacisnę to 2 itp. Tak do liczby X, a gdy nacisnę S2 odejmuje o 1 jak to mam zrobić jakieś wskazówki
Początek mam, ale co potem? Proszę o pomoc
$regfile = "m8def.dat"
$crystal = 8000000

Config Portb = &B11111100 : Portb = &B11111111
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

S1 Alias Pinb.0
S2 Alias Pinb.1




Portret użytkownika belialek

Nie wiem jak rozwiązałeś

Nie wiem jak rozwiązałeś sprzętowo sprawę buttonów - jeżeli masz podciągnięte napięcie do masy przez rezystor:

Dim licznik As Integer    'deklaracja zmiennej Integer - masz zakres -32768 do 32767
Licznik = 0               'ustawienie wartości początkowej na 0
Cls                       'inicjalizacja ekranu
 
Do                        'początek pętli
If S1 = 0 Then            'jeżeli przycisk jest wciśnięty
Incr Licznik              'wtedy zwiększ Licznik o 1
End If
 
If S2 = 0 Then            'jeżeli przycisk jest wciśnięty
Decr Licznik              'wtedy zmniejsz Licznik o 1
End If
 
Locate 1 , 1              'ustaw kursor w 1 rzędzie i 1 kolumnie
LCD "     "               'wypisz spacje (czyszczenie zawartości)
Locate 1 , 1              'ponownie ustaw kursor w 1 rzędzie i 1 kolumnie
LCD Licznik               'wyświetl na ekranie zawartość zmiennej Licznik
Loop                      'powrót na początek pętli

- jeżeli masz przyciski podłączone bezpośrednio do masy, to wtedy w warunku zamiast 0 musisz wpisać 1.

- jeżeli chcesz zmienną zwiększać/zmniejszać o inną wartość niż 1, to wtedy stosujesz składnię:

If S1 = 0 Then
Licznik = Licznik + 4
End If

Powyższy kod zwiększy wartość zmiennej o 4.

Powodzenia!

Portret użytkownika juby505

Dzieki

Dziękuje za bardzo dobre wytłumaczenie :)))

Portret użytkownika mirley

Re: Przyciski

TO rozwiązanie bez żadnych opóźnień w pętli głównej nie będzie działać zbyt dobrze jeśli wogóle za działa. Przede wszystkim wyświetlacz LCD dostanie szału jeśli się do niego tak szybko dane wysyła, dodatkowo kasowanie napisów nie jest konieczne

Do                        'początek pętli
waitms 100
If S1 = 0 Then            'jeżeli przycisk jest wciśnięty
Incr Licznik              'wtedy zwiększ Licznik o 1
End If
 
If S2 = 0 Then            'jeżeli przycisk jest wciśnięty
Decr Licznik              'wtedy zmniejsz Licznik o 1
End If
 
Locate 1 , 1              'ponownie ustaw kursor w 1 rzędzie i 1 kolumnie
LCD Licznik               'wyświetl na ekranie zawartość zmiennej Licznik
Loop                      'powrót na początek pętli

dodanie krótkiego opóźnienia troszkę pomoże (bez opóźnienia jak będziesz miał pecha to przycisk zadziała pewnie z 1000 razy zanim go puścisz) ale to i tak nie jest eleganckie rozwiązanie. Powinieneś uruchomić timer i LCD wyświetlać wtedy jak wartość się zmieni a nie zawsze bo to jest bez sensu.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika belialek

kolego Mirley, trochę głupio

kolego Mirley, trochę głupio mi jest poprawiać tak doświadczonego elektronika jak Ty, ale uważam iż kasowanie zawartości jest (w tym przypadku) konieczne. W przypadku zwiększania o 1 - jeżeli osiągniemy wartość dwucyfrową, a potem zjedziemy do wartości jednocyfrowej cyfra "0" będzie wisiała na LCD na pozycji 1 , 2. Ta sama sytuacja będzie miała miejsce, gdy dojdziesz do liczb 3,4,5 cyfrowych :)

Co do opóźnień - oczywiście zapomniałem żeby dać chwilkę wytchnienia LCD :) Co do samych przycisków warto również zadbać o eliminacje drgań styków (tak jak pisał Mirley, bez tego kliknięcie przycisku może spowodować wielokrotne wykonanie zawartości warunku i np zwiększyć wartość nie o 1 a o 10), poprzez dodanie opóźnienia np:

If S1 = 0 Then
Waitms 20        'eliminacja drgań styków
Incr Licznik
End If 

Jeżeli chodzi o taki prosty program, to linijki do ustawiania kursora oraz samo wyświetlanie można dać w jako ostatnie polecenie warunku - wtedy wyświetlacz zostanie zaktualizowany tylko po przyciśnięciu któregokolwiek z przycisków.

Pisałeś, aby zastosować przerwania - mógłbyś podać w jaki sposób to zrobić? Siedziałem wczoraj i kombinowałem jak koń pod górę i nie miałem pojęcia jak się za to zabrać... :)

Pozdrawiam!

Portret użytkownika juby505

;)

Bardzo mnie cieszy że zainteresowaliście się tematem i opisujecie jaka funkcja co robi, dzięki wam dużo się nauczyłem, z waitms sie domyśliłem samemu:PP, mam mała prośbę do Mirleya, czy byś mógł nie zamykać tego tematu, jak będę czegoś nie wiedział bym pisał tutaj uniknęli byśmy śmieci na forum nowych tematów nie potrzebnych:> Powiedzmy że ten temat by był dla początkujących programistów takich jak ja. co wy na to?

Portret użytkownika mirley

Re: Bascom

No to jest fakt nie pomyslałem o wielu cyfrach ale i tak można to zrobić trochę prościej:

  Locate 1 , 1              'ponownie ustaw kursor w 1 rzędzie i 1 kolumnie
  LCD Licznik; "      "               'wyświetl na ekranie zawartość zmiennej Licznik
  Loop                      'powrót na początek pętli

Oszczędzamy jedną instrujcję locate. Tylko że takie oszczędzanie nie zawsze ma sens, zależy co się pisze i jak to ma wszystko szybko działać. W tym przypadku najprościej jest chyba dac drugi raz polecenie Cls przed wyświetlaniem bo program w sumie nic innego program nie robi poza wyświetlaniem i oczekiwaniem na klawisz.

U mnie na stronie nie ma czegoś takiego jak "temat zamknięty". Zawsze możesz pytać o co chcesz, byle by był jakiś związek z tematem. Zastanawiałem się czy nie podzielić forum na więcej działów i wtedy byłby dział "Pytania o Bascom" w których sensowniej by było dawać nowe tematy a nie kontynuować w jednym. Zobaczymy jak będzie lepiej.....

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.