Buton basma adeti sayımı nasıl yapılır?

Başlatan . Kağan, 18 Ağustos 2015, 17:15:52

. Kağan

Merhaba arkadaşlar. Aşağıda verdiğim kodda butona kaç kere basıldığını saymaya çalışıyorum. Fakat Butona basma hızını nasıl vereceğim. Yani 0,5-1 sn aralıklarla ard ardına basıldığında saymalı. Ve örneğin 2 sn basma işi yapılmadığında ilgili etikete gitmeli.

Örneğin 5 kez bastığımı sayabilmeli ve 5 numaralı etikete gitmeli. Benim yazdığım kodda hemen ilk işi yapıp başa dönüyor.
SAY var BYTE

UC_LED       VAR PORTA.5       
BES_LED      VAR PORTA.4
ON_LED       VAR PORTC.5
ONBES_LED    VAR PORTC.4
YIRMI_LED    VAR PORTC.3
YIRMIBES_LED VAR PORTA.2
OTUZ_LED     VAR PORTC.0
BUZZER       VAR PORTC.1
BUTON        VAR PORTC.2   

PAUSE 200

MAIN:

  If BUTON=1 Then  'tuşa basılmış ise
     SAY=SAY+1
     IF SAY=1 then
        SAY=0:GOTO UC_DK
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100
     IF SAY=2 then
        SAY=0:GOTO BES_DK
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100
     IF SAY=3 then
        SAY=0:GOTO ON_DK 
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100
     IF SAY=4 then
        SAY=0:GOTO ONBES_DK
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100     
     IF SAY=5 then
        SAY=0:GOTO YIRMI_DK
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100
     IF SAY=6 then
        SAY=0:GOTO YIRMIBES_DK
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100
     IF SAY=7 then
        SAY=0:GOTO OTUZ_DK
        WHILE BUTON = 0 :WEND 'tuşu bırakıncaya kadar bekle
        pauseus 100
      ENDIF
      ENDIF
      ENDIF 
      ENDIF
      ENDIF
      ENDIF 
      ENDIF
      ENDIF
       
  GOTO MAIN
 
   UC_DK:
   high UC_LED
   PAUSE 2000
   LOW UC_LED
   SLEEP 180
   GOTO ALARM
   
   
   BES_DK:
   high BES_LED
   PAUSE 2000
   LOW BES_LED
   SLEEP 300
   GOTO ALARM
   
   
   ON_DK:
   high ON_LED
   PAUSE 2000
   LOW ON_LED
   SLEEP 600
   GOTO ALARM
   
   
   ONBES_DK:
   high ONBES_LED
   PAUSE 2000
   LOW ONBES_LED
   SLEEP 900
   GOTO ALARM
   
   
   YIRMI_DK:
   high YIRMI_LED
   PAUSE 2000
   LOW YIRMI_LED
   SLEEP 1200
   GOTO ALARM
   
   
   YIRMIBES_DK:
   high YIRMIBES_LED
   PAUSE 2000
   LOW YIRMIBES_LED
   SLEEP 1500
   GOTO ALARM
 
   
   OTUZ_DK:
   high OTUZ_LED
   PAUSE 2000
   LOW OTUZ_LED
   SLEEP 1800
   GOTO ALARM
   
   
   ALARM:
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   '@SLEEP
   GOTO MAIN


BUTTON Pin,Bas,Gecikme,OtoTekrar,Degisken,Islev,Etiket    komutu bu iş için kullanılabilirmi?

İlyas KAYA

#1
If BUTON=1 Then  'tuşa basılmış ise    EVET BASILDI

     SAY=SAY+1        'SAY 0 Dı ve 1 oldu diyelim.


     IF SAY=1 then    ' SAY 1 mi ? EVET

        SAY=0:GOTO UC_DK        SAY'ı SIFIR yap ve UC_DK etiketine git. Yani hiçbir zaman SAY =2 olmayacak

---------
....
..

program buraya kadar işler. bundan sonrası bir işe yaramaz.


Aslında GOTO komutunu kullanmak çok yanlış. C dilinde de goto komutu vardır ancak kullanılması tavsiye edilmez.
ASM 'ye çevrildiğinde de goto komutu aynen adresten adrese atlamaya çeviriliyor.

Bunun yerine çeşitli görevleri icraa edecek fonksiyonlar için alt programlar oluşturun. Alt programlar işi yapıp biran önce ana döngüye dönsün.

Şimdi sizin yapmanız gereken butonun basıldığını değil bırakıldığını okumak.
Butona basıldı ama işlem yapılmaz. Yapılırsa hemen yapılması icab eder.
Siz kaç kere butona basılır ise işlem yapmak dediğiniz için buton basılıp bırakıldıktan 1 sn sonra işlemi icra etmeliyiz. Yani 2 basma arasında 1 sn lik bir süre tanımış oluruz.


Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

. Kağan

Olmuyor.  :(

Komut sırasındamı sorun var?


UC_LED       VAR PORTA.5       
BES_LED      VAR PORTA.4
ON_LED       VAR PORTC.5
ONBES_LED    VAR PORTC.4
YIRMI_LED    VAR PORTC.3
YIRMIBES_LED VAR PORTA.2
OTUZ_LED     VAR PORTC.0
BUZZER       VAR PORTC.1
BUTON        VAR PORTC.2   
SURE         var BYTE
SAY          VAR BYTE
BASILDI      VAR BIT
PAUSE 200

MAIN:
     IF BUTON=0 AND BASILDI=1 THEN     ' BUTON BIRAKILDI  VE DAHA ÖNCE BASILDI İSE
        SURE=SURE+1                    ' BİR SAYAC SAYALIM
        BASILDI=0                      ' BASILI DEĞİL İSARETCİSİNİ SIFIRLA
     IF SURE=100 THEN                  ' SAYAÇ 100 OLDUĞUNDA YANİ BIRAKILDIKTAN 1 SN SONRA
        SURE=0                         ' SUREYİ SIFIRLA
        ENDIF
           ENDIF
     
     If buton=1 then
        SAY=SAY+1        ' HER BUTONA BASILDIĞINDA SAY'I ARTIR
        BASILDI=1         ' BUTONA BASILDIĞINI ANLAMAK İÇİN İŞARETCİ
        SURE=0             ' BIRAKILDIĞINDA SAYAN SÜREYİ SIFIRLAYALIM Kİ HEMEN İŞLEM YAPMASIN
        ENDIF           
        PAUSE 100
     
               
     IF SAY=1 THEN GOTO UC_DK          ' SAY=1 İSE UC_DK YA GİT         
     IF SAY=2 THEN GOTO BES_DK         ' SAY=2 İSE BES_DK YA GİT
     IF SAY=3 THEN GOTO ON_DK
     IF SAY=4 THEN GOTO ONBES_DK
     IF SAY=5 THEN GOTO YIRMI_DK
     IF SAY=6 THEN GOTO YIRMIBES_DK
     IF SAY=7 THEN GOTO OTUZ_DK
       
  GOTO MAIN
 
   UC_DK:
   high UC_LED
   PAUSE 2000
   LOW UC_LED
   'SLEEP 180
   GOTO ALARM
   
   
   BES_DK:
   high BES_LED
   PAUSE 2000
   LOW BES_LED
   'SLEEP 300
   GOTO ALARM
   
   
   ON_DK:
   high ON_LED
   PAUSE 2000
   LOW ON_LED
   'SLEEP 600
   GOTO ALARM
   
   
   ONBES_DK:
   high ONBES_LED
   PAUSE 2000
   LOW ONBES_LED
   SLEEP 900
   GOTO ALARM
   
   
   YIRMI_DK:
   high YIRMI_LED
   PAUSE 2000
   LOW YIRMI_LED
   SLEEP 1200
   GOTO ALARM
   
   
   YIRMIBES_DK:
   high YIRMIBES_LED
   PAUSE 2000
   LOW YIRMIBES_LED
   SLEEP 1500
   GOTO ALARM
 
   
   OTUZ_DK:
   high OTUZ_LED
   PAUSE 2000
   LOW OTUZ_LED
   SLEEP 1800
   GOTO ALARM
   
   
   ALARM:
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   '@SLEEP
   RETURN

İlyas KAYA

#3
IF SURE=100 THEN                  ' SAYAÇ 100 OLDUĞUNDA YANİ BIRAKILDIKTAN 1 SN SONRA
        SURE=0                         ' SUREYİ SIFIRLA
        ENDIF

buradaki endif hatalı yapmışsınız.

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

. Kağan

İlyas Bey merhaba,

Yinede çalışmıyor. Proteus ve pbp,hex dosyaları ekin içinde.

İlyas KAYA

Haklısın buton için yaptığım kesmeler birbirine karışmış. Kodu forumda yazınca oluyor böyle :)


;----[16LF1503 Hardware Configuration]------------------------------------------
#IF __PROCESSOR__ = "16LF1503"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _FOSC_INTOSC           ; INTOSC oscillator: I/O function on CLKIN pin
cfg1&= _WDTE_ON               ; WDT enabled
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_OFF             ; MCLR/VPP pin function is digital input
cfg1&= _CP_ON                 ; Program memory code protection is enabled
cfg1&= _BOREN_OFF             ; Brown-out Reset disabled
cfg1&= _CLKOUTEN_OFF          ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
  __CONFIG _CONFIG1, cfg1

cfg2 = _WRT_OFF               ; Write protection off
cfg2&= _STVREN_ON             ; Stack Overflow or Underflow will cause a Reset
cfg2&= _BORV_LO               ; Brown-out Reset Voltage (Vbor), low trip point selected.
cfg2&= _LPBOR_OFF             ; Low-Power BOR is disabled
cfg2&= _LVP_OFF               ; High-voltage on MCLR/VPP must be used for programming
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

#ENDIF


OSCCON = %01101011
'ANSELA = %00000000  ' PORTA ANALOG-DIGITAL AYARI  (TÜMÜ DIGITAL I/O)  1:ANALOG, 0:DIGITAL
'ANSELC = %00000000  ' PORTC ANALOG-DIGITAL AYARI

'ADCON0 = %00011010  ' Analog Channel Select bits
'ADCON1 = %11000000  ' Analog Channel Select bits. HIZ VS.

TRISA = %00000000   ' PORTA GİRİŞ ÇIKIŞ AYARI
TRISC = %00000100   ' PORTA GİRİŞ ÇIKIŞ AYARI
PORTA = %00000000
PORTC = %00000000
'WPUA  = %00000011   'PULL UP DİRENÇ AYARI
'WPUC =   'PULL UP DİRENÇ AYARI

UC_LED       VAR PORTA.5       
BES_LED      VAR PORTA.4
ON_LED       VAR PORTC.5
ONBES_LED    VAR PORTC.4
YIRMI_LED    VAR PORTC.3
YIRMIBES_LED VAR PORTA.2
OTUZ_LED     VAR PORTC.0
BUZZER       VAR PORTC.1
BUTON        VAR PORTC.2   
SURE         var BYTE
SAY          VAR BYTE
BASILDI      VAR BIT
butkes var bit

PAUSE 200
clear


MAIN:

     IF BUTON=0 AND BASILDI=1 THEN     ' BUTON BIRAKILDI  VE DAHA ÖNCE BASILDI İSE
        SURE=SURE+1                    ' BİR SAYAC SAYALIM
'        BASILDI=0                      ' BASILI DEĞİL İSARETCİSİNİ SIFIRLA
         
           
     IF SURE=100 THEN                  ' SAYAÇ 100 OLDUĞUNDA YANİ BIRAKILDIKTAN 1 SN SONRA
           BASILDI=0                  ' SUREYİ SIFIRLA
      SURE=0
     IF SAY=1 THEN GOTO UC_DK          ' SAY=1 İSE UC_DK YA GİT   
     IF SAY=2 THEN GOTO BES_DK         ' SAY=2 İSE BES_DK YA GİT
     IF SAY=3 THEN GOTO ON_DK
     IF SAY=4 THEN GOTO ONBES_DK
     IF SAY=5 THEN GOTO YIRMI_DK
     IF SAY=6 THEN GOTO YIRMIBES_DK
     IF SAY=7 THEN GOTO OTUZ_DK
     
         
        ENDIF
           ENDIF
     
      if buton =0 then  butkes=0
     
     If buton=1 and BUTKES=0 then
BUTKES=1
        SAY=SAY+1        ' HER BUTONA BASILDIĞINDA SAY'I ARTIR
        BASILDI=1         ' BUTONA BASILDIĞINI ANLAMAK İÇİN İŞARETCİ
        SURE=0             ' BIRAKILDIĞINDA SAYAN SÜREYİ SIFIRLAYALIM Kİ HEMEN İŞLEM YAPMASIN
        ENDIF         


        PAUSE 100
     
               
     
       
  GOTO MAIN
 
   UC_DK:
   high UC_LED
   PAUSE 2000
   LOW UC_LED
   'SLEEP 180
   GOTO ALARM
   
   
   BES_DK:
   high BES_LED
   PAUSE 2000
   LOW BES_LED
   'SLEEP 300
   GOTO ALARM
   
   
   ON_DK:
   high ON_LED
   PAUSE 2000
   LOW ON_LED
   'SLEEP 600
   GOTO ALARM
   
   
   ONBES_DK:
   high ONBES_LED
   PAUSE 2000
   LOW ONBES_LED
   SLEEP 900
   GOTO ALARM
   
   
   YIRMI_DK:
   high YIRMI_LED
   PAUSE 2000
   LOW YIRMI_LED
   SLEEP 1200
   GOTO ALARM
   
   
   YIRMIBES_DK:
   high YIRMIBES_LED
   PAUSE 2000
   LOW YIRMIBES_LED
   SLEEP 1500
   GOTO ALARM
 
   
   OTUZ_DK:
   high OTUZ_LED
   PAUSE 2000
   LOW OTUZ_LED
   SLEEP 1800
   GOTO ALARM
   
   
   ALARM:
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   '@SLEEP
   RETURN



Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Bahri Bilir

#6
Kağan Hocam eğer yapmak istediğinizi doğru anladı isem aşağıdaki kod çalışıyor.İsisde denedim.Eğer sigorta ayarlarında bir problem yoksa gerçektede problem çıkaracağını sanmıyorum.
Bu arada kodlarda çok fazla pause kullanmışsınız.Bu picin kod döngüsünü dondurduğu için pause süreleri boyunca pic butonu algılamayacak ve saymayacaktır.Veya yarıda saymaya başlayacak yanlış sayacaktır.
Pause komutu yerine tüm işlemleri main döngüsü içinde yapıp farklı döngülere gitmeden kapı tekniğiyle olayları algılayıp,pause yerinede aynı döngü içinde sürekli saydırırsanız kod daha verimli çalışacağını düşünüyorum.


;----[16LF1503 Hardware Configuration]------------------------------------------
#IF __PROCESSOR__ = "16LF1503"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _FOSC_INTOSC           ; INTOSC oscillator: I/O function on CLKIN pin
cfg1&= _WDTE_ON               ; WDT enabled
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_OFF             ; MCLR/VPP pin function is digital input
cfg1&= _CP_ON                 ; Program memory code protection is enabled
cfg1&= _BOREN_OFF             ; Brown-out Reset disabled
cfg1&= _CLKOUTEN_OFF          ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
  __CONFIG _CONFIG1, cfg1

cfg2 = _WRT_OFF               ; Write protection off
cfg2&= _STVREN_ON             ; Stack Overflow or Underflow will cause a Reset
cfg2&= _BORV_LO               ; Brown-out Reset Voltage (Vbor), low trip point selected.
cfg2&= _LPBOR_OFF             ; Low-Power BOR is disabled
cfg2&= _LVP_OFF               ; High-voltage on MCLR/VPP must be used for programming
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

#ENDIF


OSCCON = %01101011
'ANSELA = %00000000  ' PORTA ANALOG-DIGITAL AYARI  (TÜMÜ DIGITAL I/O)  1:ANALOG, 0:DIGITAL
'ANSELC = %00000000  ' PORTC ANALOG-DIGITAL AYARI

'ADCON0 = %00011010  ' Analog Channel Select bits
'ADCON1 = %11000000  ' Analog Channel Select bits. HIZ VS.

TRISA = %00000000   ' PORTA GİRİŞ ÇIKIŞ AYARI
TRISC = %00000100   ' PORTA GİRİŞ ÇIKIŞ AYARI
PORTA = %00000000
PORTC = %00000000
'WPUA  = %00000011   'PULL UP DİRENÇ AYARI
'WPUC =   'PULL UP DİRENÇ AYARI

UC_LED       VAR PORTA.5       
BES_LED      VAR PORTA.4
ON_LED       VAR PORTC.5
ONBES_LED    VAR PORTC.4
YIRMI_LED    VAR PORTC.3
YIRMIBES_LED VAR PORTA.2
OTUZ_LED     VAR PORTC.0
BUZZER       VAR PORTC.1
BUTON        VAR PORTC.2   
SURE         var word
SAY          VAR BYTE
BASILDI      VAR BIT
BUTONK       var bit
PAUSE 200
clear

MAIN:

if basildi=1 then
sure=SURE+1
endif

if sure=50000 then 'Bu süre butonun basılma aralıklarının max olacağı süre.Yani sizin istediğiniz 2 sn lik süre.Ve bu değer ortalama 3,5 sn yeye denk geliyor.İsteğinize uygun düzenleyebilirsiniz.

     IF SAY=1 THEN GOTO UC_DK          ' SAY=1 İSE UC_DK YA GİT   
     IF SAY=2 THEN GOTO BES_DK         ' SAY=2 İSE BES_DK YA GİT
     IF SAY=3 THEN GOTO ON_DK
     IF SAY=4 THEN GOTO ONBES_DK
     IF SAY=5 THEN GOTO YIRMI_DK
     IF SAY=6 THEN GOTO YIRMIBES_DK
     IF SAY=7 THEN GOTO OTUZ_DK
     
     basildi=0
     
endif


if basildi=1 then

    if butonk=1 then
   
        if buton=1 then
        sure=0
        butonk=0
        say=say+1
        endif
       
    endif
   
endif

if buton=0 then
butonk=1
endif

if basildi=0 then

    if buton=1 then
    say=1
    basildi=1
    sure=0
    butonk=0
    endif
   
endif
     
               
     
       
  GOTO MAIN
 
   UC_DK:
   high UC_LED
   PAUSE 2000
   LOW UC_LED
   'SLEEP 180
   GOTO ALARM
   
   
   BES_DK:
   high BES_LED
   PAUSE 2000
   LOW BES_LED
   'SLEEP 300
   GOTO ALARM
   
   
   ON_DK:
   high ON_LED
   PAUSE 2000
   LOW ON_LED
   'SLEEP 600
   GOTO ALARM
   
   
   ONBES_DK:
   high ONBES_LED
   PAUSE 2000
   LOW ONBES_LED
   SLEEP 900
   GOTO ALARM
   
   
   YIRMI_DK:
   high YIRMI_LED
   PAUSE 2000
   LOW YIRMI_LED
   SLEEP 1200
   GOTO ALARM
   
   
   YIRMIBES_DK:
   high YIRMIBES_LED
   PAUSE 2000
   LOW YIRMIBES_LED
   SLEEP 1500
   GOTO ALARM
 
   
   OTUZ_DK:
   high OTUZ_LED
   PAUSE 2000
   LOW OTUZ_LED
   SLEEP 1800
   GOTO ALARM
   
   
   ALARM:
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   '@SLEEP
   RETURN



"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

. Kağan

#7
Teşekkürler. Yalnız şöyle bir durum var. aslında tamda olmasını istediğim bu değilmiş.

Butona ilk basışta 1. led yanacak ve ikinci kez basılmamışsa 3 dk.lık süre başlayacak.
Butona ikinci basışta 1. led sönecek ve 2. led yanacak, butona 3. kez basılmamışsa 5 dk.lık süre başlayacak.
Butona üçüncü basışta 2. led sönecek ve 3. led yanacak, butona 4. kez basılmamışsa 10 dk.lık süre başlayacak.
.
.
.
şeklinde 30 dk. kadar gidecek ve 8. basışta başa dönecek.

Aşağıdaki kodu yazdım fakat taşma oluyor diyor proteus.

UC_LED       VAR PORTA.5       
BES_LED      VAR PORTA.4
ON_LED       VAR PORTC.5
ONBES_LED    VAR PORTC.4
YIRMI_LED    VAR PORTC.3
YIRMIBES_LED VAR PORTA.2
OTUZ_LED     VAR PORTC.0
BUZZER       VAR PORTC.1
BUTON        VAR PORTC.2 

BUTONKONTROL VAR BIT
SAYI         VAR BYTE
SURE         VAR WORD
BASILDI      VAR BYTE
sayi=0
sure=0
PAUSE 200
clear

MAIN: 'ana program dongdusu

If BUTON=1 and BUTONKONTROL=1 then 'sayi saydirilmasi
sayi=sayi+1
if sayi>3 then sayi=1  ' sayı üçden büyük değer alırsa başa dön
BUTONKONTROL=0
endif

if sayi=1 then GOTO UC_DK
if sayi=2 THEN GOTO BES_DK
if sayi=3 then GOTO ON_DK
'if sayi=4 then GOTO ONBES_DK
'if sayi=5 then GOTO YIRMI_DK
'if sayi=6 then GOTO YIRMIBES_DK
'if sayi=7 then GOTO OTUZ_DK


if buton=0 then
BUTONKONTROL=1
endif

goto MAIN

   
     
   UC_DK:
   high UC_LED
   'SLEEP 180
   'GOTO ALARM
   RETURN
       
   BES_DK:
   LOW UC_LED
   high BES_LED
   'SLEEP 300
   'GOTO ALARM
   RETURN
   
   ON_DK:
   LOW BES_LED
   high ON_LED
   'SLEEP 600
   'GOTO ALARM
   RETURN
   
   
   
   
   ALARM:
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   PAUSE 200
   HIGH  BUZZER
   PAUSE 200
   LOW   BUZZER
   '@SLEEP
   GOTO MAIN

ete

Taşma sebebi GOTO ile gidip RETURN ile dönmek. GOSUB ile gidilip RETURN ile dönülür.
Goto ile gidilen yerden yine goto ile dönülür.

Ete

Powered by EzPortal