Alternatif program:
dugme var PORTB.0
led var PORTA.0
durum var BYTE
flipr var BYTE
SIFIRLA:
TRISB = 1
TRISA = 0
durum = 0
flipr = 0
low led
BASLA:
pause 200
flipr = flipr +1
if flipr > 10 then flipr = 0
if (dugme == 0) then durum = durum +1: if (durum == 1 )then flipr = 0
if (durum == 1) then if flipr < 5 then high led else low led
if (durum == 2) then high led
if (durum > 2) then durum = 0:low led
goto BASLA
Bu kod hem her 200ms de bir düğme denetimi yapar hem de durum 0 ise led'in yanması söz konusu değildir.
Kod sentaksı doğru olmayabilir , mantık açısından yazdım picbasic bilmiyorum normalde assembler ile kodlarım.
dugme active low ise yani basıldığında giriş TTL low oluyorsa dugme == 0 basılma anlamına gelir aksi halde kodda dugme == 0 yerine dugme == 1 konmalı.
while ...wend koymadım çünkü while wend orada muhtemelen gümler. Sebebi ise düğmelerin stabilizasyon sürecidir. settling time dedikleri bu facia anahtarları açıp kapattığında gerçekte bir çok defa anahtar sinyalinin sıçrama yapmasından kaynaklanır hem elektronik hem mekanik sebepleri var. While wend e gerek kalmadı çünkü her düğme denetimi standart çevrim süresi olan 200ms de bir yapılıyor ki bu da settling time için yeterli bir süre.
Kod durum 0 iken bir şey yapmıyor, durum 1 iken flaş yapıyor (flipr ı kullanıyor flipr 0,1,2,3,4 iken yanıyor 5,6,7,8,9 iken sönük) her flipr adımı 200ms olduğundan 1 saniye sürüyor. düğme basılır basılmaz yansın diye durum bir olursa flipr sıfırlanıyor
durum iki olduğunda led sabit yanıyor
durum üç olursa durum sıfırlanıyor ve led söndürülüyor.
Ayrıca Altın kural : her değişkeni başlangıçta sıfırlamalı. Reset veya BOR sonrası mcu toparlanırken yararlı olur.