Przełączanie jedmym microswitch'em kilku podprogramów


Jestem początkujący, uczę się głównie z tej strony, znam już te najłatwiejsze zasady i polecenia w języku bascom AVR.Próbuję rozwijać swoją wiedzę na ten temat i napisałem już kilka małych programików które działają.Z kolejnym mam dosyć spory problem.Nie potrafię zaprogramować mój układ (attiny2313) aby jednym przyciskiem zmieniać podprogramy.Na przykład coś takiego:

jeśli wcisnę przycisk raz to miga dioda na pinie 0 portu b
jeśli wcisnę przycisk drugi raz to miga dioda na pinie 0,1,2 portu b
....
jeśli wcisnę siódmy raz to wraca do początku (miga portb.0)

Chciałbym również aby przełączanie było niezależne od czasu w którym przełączę.To znaczy np. dziś przełączę na jeden podprogram a na przykład dopiero jutro na drugi itd.

Z góry dziękuję za pomoc i pozdrawiam.




Portret użytkownika matrix

Re: Przełączanie jedmym microswitch'em kilku podprogramów

Po pierwsze musisz wprowadzić jakąś zmienną powiedzmy typu byte i za każdym naciśnięciem switch'a zwiększasz stan tej zmiennej.
Później w pętli piszesz albo kilka

if...then

albo
select case

i odsyłasz do podprogramów.

Co do przełączania dziś czy jutro czy kiedy tam chcesz to są dwie opcje. Jeśli w przeciągu tych dni zasilanie nie będzie wyłączane to nie masz problemu a jeśli będziesz wyłączał owe zasilanie to wartość aktualną tejże zmiennej trzeba wpisać do pamięci eeprom.

Portret użytkownika zan

Przełączanie jedmym microswitch'em kilku podprogramów

Dzięki za radę.W ostateczności wyszło coś takiego:

$regfile = "attiny2313.dat"
$crystal = 800000
 
Config PortB = 11111111
       PortB = 11111111
Config PortD = 11111110
       PortD = 11111111
 
D Alias PortD.0
B Alias PortB
 
Dim D As Byte
Dim B As Word
 
Do
 
Do
If D = 1 Then Goto Prog1
Loop Until D = 2
 
Do
If D = 2 Then Goto Prog2
Loop Until D = 3
 
Do
If D = 3 Then Goto Prog3
Loop Until D = 1
 
 
Loop
 
End
 
Prog1:
Do
Reset Portb.0
Waitms 25
Set Portb.0
Waitms 25
Loop
 
Prog2:
Reset Portb.1
Waitms 500
Set Portb.1
Waitms 500
 
Prog3:
Do
B = &B11111111
loop
 

Czy będzie działać jak w założeniach?

Portret użytkownika zan

Udało mi się zaprogramować

Udało mi się zaprogramować atmega16 powyższym programem i wszystko by grało, tylko że wykonuje się cały czas tylko jeden podprogram - Prog1.Układ po prostu nie reaguje na przycisk.Spróbowałem jeszcze tak:

Config Portb = 11111111
       Portb = 11111111
Config Portd = 11111110
       Portd = 11111111
 
D Alias Pind.0
B Alias Portb
 
Dim D As Byte
Dim B As Word
 
Do
 
Select Case D
 
Case 1:
 
Gosub Prog1
 
 
Case 2:
 
Goto Prog2
 
 
Case 3:
 
Goto Prog3
 
 
End Select
 
Loop
 
End
 
Prog1:
Do
Reset Portb.0
Waitms 25
Set Portb.0
Waitms 25
Loop
 
Prog2:
Reset Portb.1
Waitms 500
Set Portb.1
Waitms 500
 
Prog3:
Do
B = &B11111111
Loop

Ale dalej to samo.Proszę o radę w którym miejscu może być błąd i jak to poprawić.

Portret użytkownika matrix

Re: Przełączanie jedmym microswitch'em kilku podprogramów

A że zapytam, gdzie masz kilka linijek które mówią:

If jakis_przycisk = 0 then incr D
If D >=4 then D = 0 'akurat wybrałem zliczanie do 4

Pomijam fakt że to jest źle zbudowane, ale jak na początek może być (jeśli Ci zadziała)

Portret użytkownika jakimov

Zmiany

Zan, dla mnie dwa miejsca są zastanawiające. Jedno to "Gosub" w Case 1 - dlaczego Gosub, jak w drugim i trzecim Case masz Goto ?.

Drugie miejsce to: w Prog1, komenda "Loop". Wyraźnie sam chcesz by była pętla nieskończona. Nie dajesz żadnego warunku w pętli, by została przerwana.

Nie wiem jednak czy się nie mylę, niech ktoś to fachowym okiem zweryfikuje. Ja od dawna nie widziałem Bascoma na oczy, nie pamiętam z niego wiele. Chciałbym jednak jakoś pomóc, bo sam wiem jakie przejścia z nim miałem.

Portret użytkownika matrix

Re: Przełączanie jedmym microswitch'em kilku podprogramów

Jak już wytykamy te błędy to:
1. Jak wspomniał kolega wyżej, wszędzie powinno być:

gosub

a nie
goto

2. Brak zakończeń podprogramów w postaci RETURN'ów
3. Jak wspomniano również wyżej, nie dajesz szansy na wujście z nieskończonych pętli do...loop w podprogramach. Trzeba tam wstawić jakieś warunki pozwalające programowi opuścić pętlę.

A pomijając to wszystko można to zrobić bez podprogramów i nie na wait'ach tylko na timerze.

Portret użytkownika zan

Przełączanie jedmym microswitch'em kilku podprogramów

Kolego matrix0606 proszę o napisanie co znaczy polecenie

incr

które zamieściłeś w swojej odpowiedzi, oraz jeśli by się dało jakiś przykładowy program z timerem , który by zawierał komentarze wyjaśniające do czego służą polecenia w nim zawarte.Bardzo bym chciał zrozumieć co jest w programie napisane.Z góry dziękuję.
A może by się dało napisać licznik przycisków na timerze?

Portret użytkownika matrix

Re: Przełączanie jedmym microswitch'em kilku podprogramów

incr w Bascom oznacza z angielskiego skrót od increase czyli zwiększ wartość o 1.

Nigdy nikomu nie podaję gotowych programów, bo w ten sposób nikt niczego się nie nauczy. Daję tylko wskazówki.
Trzeba sobie obrać zmienną dla danego timera na przykład zmienna_timer_1 i podstawiać wartości do tej zmiennej a samą zmienną ładować do timera. W ten sposób można diametralnie ułatwić sobie życie, oczywiście jeśli się wie co się robi.

Nie sprawdzałem tego co podam niżej i nie myślałem nawet nad tym wiele, ale soft mógłby wyglądać tak:

on timer1 zmiana_wartosci  'definicja gdzie ma skoczyc program podczas przerwania
 
enable interrupts
enable timer1
start timer1               'zezwolenia przerwan i timera1
zmienna = 0                'poczatkowa wartosc zmiennej
zmienna_timer_1 = 250      'poczatkowa wartosc zmiennej wpisywanej do timer1
 
do
 if przycisk = 0 then incr zmienna 'jesli zostanie nacisniety przycisk to program zwieksza wartosc zmiennej pomocniczej
 if zmienna >= 5 then zmienna = 0 'jesli zmienna pomocnicza zostanie zwiekszona do 5 lub wiecej to zerujemy jej wartosc
 
  select case zmienna 'w ponizszych select case wpisujemy na sztywno wartosci do zmiennej dla timer1
  case 1:
   zmienna_timer_1 = 50
  case 2:
   zmienna_timer_1 = 100
  case 3:
   zmienna_timer_1 = 150
  case 4:
   zmienna_timer_1 = 200
  end select
loop
end
 
zmiana_wartosci:
 load timer1, zmienna_timer_1 'ladowanie do timer1 wartosci ze zmiennej
  toggle portb 'zmiana portu b na przeciwny stan co powodowac bedzie migania diod podpietych do tegoz portu
return

To tylko przykładowy program i trzeba do niego wprowadzić szereg zmian i/lub poprawek. Brak między innymi jakiejś eliminacji drgań styków przycisku itp. Całość napisałem może w dwie minuty dlatego na pewno ma wiele błędów, jeśli w ogóle będzie pracował.

Portret użytkownika zan

Chyba się udało!

Dzięki wielkie za pomoc!
W końcu udało mi się przełączać jednym przyciskiem , a zrobiłem to tak:

$regfile = "m16def.dat"
 
Config Portd = &B11111110
        Portd = &B11111111
 
 
Dim D As Byte
 
D = 0
 
Do
 
 
If Pind.0 = 0 Then
Waitms 25
Incr D
End If
 
 
If D = 2 Then Toggle Portd.1
 
If D = 4 Then Toggle Portd.1
 
If D = 6 Then Toggle Portd.2
 
If D = 8 Then Toggle Portd.2
 
 
 
Loop
End

Aby zlikwidować drgania na przycisku zastosowałem

waitms 25

Tylko nie wiem czy układ prawidłowo działa.Tzn:
-jeśli wcisnę przycisk pd0 raz to świeci dioda pd1
-jeśli wcisnę pd0 drugi raz to pd1 gaśnie
-jeśli wcisnę pdo trzeci raz to pd2 świeci
-jeśli wcisnę pd0 czwarty raz to pd2 gaśnie

i tak w kółko.

Portret użytkownika matrix

Re: Przełączanie jedmym microswitch'em kilku podprogramów

Waitms to najgorszy sposób, ale w końcu debounce też korzysta z wait więc do prostych zastosowań może być.
Coś musi być nie tak bo masz napisane if..then co dwa a zapalają i gasną Ci diody co jedne więc coś chemia nie teges. Poza tym nie możesz mieć w kółko bo masz zmienną D zadeklarowana jako byte więc incr będzie Ci liczyć do 255.

Portret użytkownika zan

Przełączanie jedmym microswitch'em kilku podprogramów

If...then specjalnie jest napisane co dwa bo jak było co jeden to układ źle zaświecał diody np. pd2 świeci cały czas i nigdy nie gaśnie albo pd2 świeci cały czas itp.Myślę że to może być wina właśnie drgań przełącznika.Może ktoś by mi przedstawił ten program z debounce bo jak ja próbuje:

If Debounce Pind.0 = 0 Then Incr D 

to mi wywala błąd że niema trzech parametrów.
A co do powracania w kółko to sam się dziwię ale to prawda.
Aha, jeszcze jeden problem, jeśli przytrzymam dłużej przycisk to albo jedna albo obie diody świecą w nieskończoność i nie do wyłączenia.Może to też przez drgania?

Portret użytkownika matrix

Re: Przełączanie jedmym microswitch'em kilku podprogramów

Jak Ty w ogóle chcesz używać polecenia debounce? Ściągnij sobie polskiego helpa i będziesz miał pomoc jak diabli. Debounce używa się tak:

Przeznaczenie:
 
Eliminuje drgania styków przełącznika dołączonego bezpośrednio do linii portu.
 
Składnia:
 
DEBOUNCE  pin_portu , stan , etykieta [, SUB]
 
gdzie:
 
pin_portu	sprawdzana linia portu (np.: PINB.0),
stan	0 gdy sygnałem aktywnym ma być stan niski, 1 gdy stan wysoki,
etykieta	etykieta określająca miejsce skoku,
SUB	skacze jak do podprogramu (GOSUB).
 
(c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005

Portret użytkownika zan

Mały problem

Po dwóch tygodniach myślenia udało mi się zrobić dosyć obszerny program z którym mam mały problem.W założeniach program miał po wciśnięciu przycisku raz- włączyć podprogram "wlacnik". Drugi raz- "pilot" (program pochodzi z tej strony http://mirley.firlej.org/odbiornik_rc5).Trzeci raz- żaden program nie jest włączony.Oto mój projekt:

...
Dim C As Byte
...
C = 1
 
Do
Debounce Pinc.1 , 0 , X , Sub
 
If C = 2 Then Gosub Wlacnik
If C = 4 Then Gosub Pilot
If C = 6 Then C = 1
Loop

Niestety wyszło tak że jeśli po pierwszym wciśnięciu włączy się podpr."pilot"(zależy to od zaprogramowania kolejności) to będzie działać w nieskończoność, a jeśli podpr. "wlacnik" to on będzie działać bez możliwości przełączenia.
Chcę zaznaczyć że oba podprogramy działąją w 100%.
Proszę o pomoc bo pewnie nie dużo mnie dzieli od poprawnego zapisu.

A to już cały program:

$regfile = "m16def.dat"
 
Config Porta = &B11111111
        Porta = &B11111111
 
Config Portb = &B11111000
        Portb = &B11111111
 
Config Portc = &B11111100
        Portc = &B11111111
 
Config Portd = &B00000000
        Portd = &B11111111
 
Config Rc5 = Pinc.0
Enable Interrupts                                           'włączony system przerwań
 
Dim Komenda As Byte , Adres As Byte
A Alias Porta
Config Portb.4 = Output
Speaker Alias Portb.4
Dim C As Byte
Dim A As Word
Dim D As Byte
Dim E As Word
Dim F As Byte
Dim G As Byte
G = 0
F = 1
E = 0
D = 33
C = 1
 
Do
Debounce Pinc.1 , 0 , X , Sub
 
If C = 2 Then Gosub Wlacnik
If C = 3 Then Gosub Pilot
If C = 4 Then C = 1
Loop
End
 
 
X:
Incr C
Return
 
Pilot:
Do
Debounce Pinc.1 , 0 , X , Sub
If C = 4 Then Exit Do                                       'początek pętli
  Getrc5(adres , Komenda)                                   'odbiór i rozkodowanie sygnału rc5
  Komenda = Komenda And &B01111111
 
                                            'dioda(portd.6)zaświeca się
 
    Select Case Komenda                                     'na podstawie wartości zmiennej(komenda) wykonuje się odpowiedni ciąg instrukcji
      Case 1:                                               '''''''''''''''''''''''''''''''''''''''''''''''''''''''
          Toggle Porta.0                                    '                                                     '
      Case 2:                                               '                                                     '
          Toggle Porta.1                                    '                                                     '
      Case 3:                                               '                                                     '
          Toggle Porta.2                                    '                                                     '
                                       '                                                     '
    End Select                                              '''''''''''''''''''''''''''''''''''''''''''''''''''''''
If C = 4 Then Exit Do
        Loop
Return
 
 
 
 
 
 
 
 
Wlacnik:
 
Do
Debounce Pinc.1 , 0 , X , Sub
If C = 3 Then Exit Do
Debounce Pind.0 , 0 , Q , Sub
Debounce Pind.1 , 0 , W , Sub
Debounce Pind.2 , 0 , E , Sub
Debounce Pind.3 , 0 , R , Sub
Debounce Pind.4 , 0 , Klucz , Sub
Debounce Pind.5 , 0 , 1 , Sub
Debounce Pind.6 , 0 , 2 , Sub
Debounce Pind.7 , 0 , 3 , Sub
Debounce Pinb.0 , 0 , 4 , Sub
Debounce Pinb.1 , 0 , 5 , Sub
Debounce Pinb.2 , 0 , 6 , Sub
 
If D < 34 And G = 5 Then Gosub Zle
If E = 350 Then E = 0
If G = 150 Then G = 0
 
If C = 3 Then Exit Do
Loop
Return
 
 
1:
 
Portb.7 = 0
Portb.6 = 1
A = &B10100010
Sound Speaker , 1000000 , 100
Incr F
Incr G
Return
 
2:
 
Portb.7 = 0
Portb.6 = 1
A = &B10010010
Sound Speaker , 1000000 , 100
Incr F
Incr G
Return
 
3:
 
 Portb.7 = 0
Portb.6 = 1
A = &B10010100
Sound Speaker , 100000 , 100
Incr F
Incr G
Return
 
4:
 
Portb.7 = 0
Portb.6 = 1
A = &B10000000
Sound Speaker , 1000000 , 100
Incr F
Incr G
 
5:
 
 Portb.7 = 0
Portb.6 = 1
 A = &B10010000
Sound Speaker , 1000000 , 100
Incr F
Incr G
Return
 
6:
 
 Portb.7 = 0
Portb.6 = 1
 A = &B10001000
Sound Speaker , 1000000 , 100
Incr F
Incr G
Return
 
 
 Q:
 
 Portb.7 = 0
Portb.6 = 1
 A = &B10000100
Sound Speaker , 1000000000 , 100
D = D * 3
F = F + 2
Incr G
Return
 
 W:
 
  Portb.7 = 0
Portb.6 = 1
  A = &B11011011
Sound Speaker , 1000000 , 100
D = D + 1
F = F + 2
Incr G
Return
 
 
 E:
 
 Portb.7 = 0
Portb.6 = 1
 A = &B11011010
Sound Speaker , 1000000 , 100
D = D \ 50
F = F + 2
Incr G
Return
 
 
 R:
 
  Portb.7 = 0
Portb.6 = 1
  A = &B11010001
Sound Speaker , 1000000 , 100
D = D * 20
F = F + 2
Incr G
Return
 
 
Klucz:
Sound Speaker , 10 , 5
F = F + 2
Incr G
If D = 40 And G = 5 Then
 
Gosub Powit
End If
Return
 
 
 
Powit:
Do
 
 
 
If E < 25 Then
Do
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10101100                                              'c
Waitms 1
Incr E
 
If E = 25 Then Exit Do
 
Loop
End If
 
 
If E = 25 Then
Do
 
 
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10101100                                              'c
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10100010                                              'z
Waitms 1
Incr E
If E = 50 Then Exit Do
 
Loop
End If
 
 
If E = 50 Then
Do
 
 
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10101100                                              'c
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10100010                                              'z
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10100100                                              'e
Waitms 1
Incr E
If E = 75 Then Exit Do
 
Loop
End If
 
If E = 75 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10101100                                              'c
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10100010                                              'z
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10100100                                              'e
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10010100                                              's
Waitms 1
Incr E
If E = 100 Then Exit Do
 
Loop
End If
 
If E = 100 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10100010                                              'z
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10100100                                              'e
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10010100                                              's
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10101100                                              'c
Waitms 1
Incr E
If E = 125 Then Exit Do
 
Loop
End If
 
If E = 125 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10100100                                              'e
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10010100                                              's
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10101100                                              'c
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B11111111                                              '
Waitms 1
Incr E
If E = 150 Then Exit Do
 
Loop
End If
 
If E = 150 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10010100                                              's
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10101100                                              'c
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B11000000                                              'a
Waitms 1
Incr E
If E = 175 Then Exit Do
 
Loop
End If
 
If E = 175 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10101100                                              'c
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B11000000                                              'a
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10001000                                              'd
Waitms 1
Incr E
If E = 200 Then Exit Do
 
Loop
End If
 
If E = 200 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 1
A = &B11000000                                              'a
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10001000                                              'd
Waitms 1
Incr E
If E = 225 Then Exit Do                                     'a
 
Loop
End If
 
If E = 225 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B11000000                                              'a
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10001000                                              'd
Waitms 1
Portb.3 = 0
Portb.5 = 0                                                 'a
Portb.6 = 0
Portb.7 = 1
A = &B10010100                                              's
Waitms 1
Incr E
If E = 250 Then Exit Do
 
Loop
End If
 
If E = 250 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10001000                                              'd
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B11000000                                              'a
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10010100                                              's
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B11111111                                              '
Waitms 1
Incr E
If E = 275 Then Exit Do
 
Loop
End If
 
 
If E = 275 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B11000000                                              'a
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10010100                                              's
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B11111111                                              '
Waitms 1
Incr E
If E = 300 Then Exit Do
 
Loop
End If
 
 
If E = 300 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B10010100                                              's
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B11111111                                              '
Waitms 1
Incr E
If E = 325 Then Exit Do
 
Loop
End If
 
 
If E = 325 Then
Do
 
 
Portb.3 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B11111111                                              '
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B11111111                                              '
Waitms 1
Incr E
If E = 350 Then Exit Do
 
Loop
End If
 
Loop
Return
 
 
Zle:
Sound Speaker , 124 , 675
If G >= 5 Then
Do
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10100010                                              'z
Waitms 1
 
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10101101                                              'l
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10100100                                              'e
Waitms 1
Incr G
If G = 100 Then Exit Do
End If
Loop
 
Waitms 50
Sound Speaker , 1000000000 , 100
 
If G = 100 Then
Do
Portb.3 = 0
Portb.5 = 1
Portb.6 = 0
Portb.7 = 0
A = &B10100010                                              'z
Waitms 1
 
Portb.3 = 0
Portb.5 = 0
Portb.6 = 1
Portb.7 = 0
A = &B10101101                                              'l
Waitms 1
Portb.3 = 0
Portb.5 = 0
Portb.6 = 0
Portb.7 = 1
A = &B10100100                                              'e
Waitms 1
Incr E
If G = 150 Then Exit Do
 
Loop
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
Sound Speaker , 1000000000 , 100
 
End If
Return

A przy okazji może jakieś propozycje ulepszenia mojej części programu:

-włącznik szyfrowy:

należy wpisać cztery cyfry wyświetlane na czterech wyświetlaczach segmentowych w odpowiedniej kolejności i wcisnąć przycisk "klucz" wtedy wyskakuje odpowiedni "pływający" komunikat.Do każdorazowego przyciśnięcia na klawiaturce pojawia się krótki dźwięk a w przypadku złego wpisania piszczy niesamowicie że więcej niż 30sek. nieda się wytrzymać(odstraszacz). Z racji że jestem początkujący i niewiem jak się ustawia częstotliwość multipleksownia ustawiłem wegług waitms 1 i nawet jest bez drgań.O samym multipleksowaniu wiem tylko tyle: http://elektro.w.interia.pl/faq/02.html .

Portret użytkownika mirley

Re: Program

Napisz w procedurze X

If C >=4 Then C = 1

osobiście nigdy nie czytałem przycisków za pomocą Debounce więc liczę na to że masz dobrą składnie i polecenie działa na pewno

-

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.