Pic girişine ms süre ekleme

Başlatan Muyat, 19 Eylül 2012, 17:22:04

Muyat

IF TUS=0 THEN ANM komutu yerine  giriş 50ms veya 100 ms   0 olduktan sonra ANM isimli etikete atla komutu verilmesi parazitlenmeyi önlemek açısından yararlı olur mu?TAbi burda parazitlenmenin 50ms kadar sürmeyeceegini hesap ederek soruyorum.

muhittin_kaplan

buton kontrolünden sonra bir müddet beklemek iyidir. bu süre program a göre değişiklik gösterebilir.

serhat1990

Buton okumadan sonra belli bir süre beklemek daha iyi çalışan bir program ortaya çıkarır. Bu süreyi ben programlarımda genelde 100mS tutuyorum. Tabi programa göre bu değişiklik gösterebilir. Bazı programlarda beklemeler sıkıntı yaratabilir. Özellikle timer kullanılan programlarda beklemelerin çok önemli olduğunu gözden kaçırmayalım .  Yanılmıyorsam pic basic'te bununla ilgili bir komut vardı. Button diye bir komut olabilir. Araştırın bi isterseniz.

Mucit23

Veya if içerisinde bir while döngüsü oluştur. Butonun bırakılmasını bekle

Örn:

If tus=0 then
whıle tus=0:wend
goto anm
endıf

Muyat

arkadaşlar.Benim demek istediğim buton okunduktan sonra 100ms  beklemek degil.butonu 100ms okuduktan sonra veya elimi butona 100ms basılı tuttuktan sonra  ilgili etikete atla olacak.odolaysıyla butona 100ms den az basarsam ilgili etikete atlamayacak.bunu nasıl yaparız?

muhittin_kaplan

Bunu Timer Kurarak Yaparsın. Malum PIC ve diğer MCU larda Zamanlayıcı birimler mevcut. Sen butona bastığın anda Timer çalışmaya başlar bıraktığında durur eğer 100ms olmuşsa yapacağını yapar.
Bu işlemi yapabilmen için Timer kesmelerini yapabilmen gerekir (Timer Interrupt)

mesaj birleştirme:: 19 Eylül 2012, 19:11:37

Ama şunu belirteyim. İlk sorunla şu anki arasında (Parazit- Bounce etkisi) ilişki yok.

Andromeda

Alıntı yapılan: Muyat - 19 Eylül 2012, 17:22:04
IF TUS=0 THEN ANM komutu yerine  giriş 50ms veya 100 ms   0 olduktan sonra ANM isimli etikete atla komutu verilmesi parazitlenmeyi önlemek açısından yararlı olur mu?TAbi burda parazitlenmenin 50ms kadar sürmeyeceegini hesap ederek soruyorum.
Bu konu daha öncede konuşuldu...
butona basılmış ise 50ms beklenecek..
sonra tekrar "butona basıldımı" kontrolu yapılacak..
eğer hala butona basıldı gibi gözüküyorsa gerçekten basıldığı kabul edilip ilgili yere dallanma yapılacak..
buradaki mantık parazit darbesinin uzun sürmeyeceği...
ben denedim ve işe yarıyor ... :)
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

K46

Alıntı yapılan: elek - 19 Eylül 2012, 19:53:01
Bu konu daha öncede konuşuldu...
butona basılmış ise 50ms beklenecek..
sonra tekrar "butona basıldımı" kontrolu yapılacak..
eğer hala butona basıldı gibi gözüküyorsa gerçekten basıldığı kabul edilip ilgili yere dallanma yapılacak..
buradaki mantık parazit darbesinin uzun sürmeyeceği...
ben denedim ve işe yarıyor ... :)

Ben de bu çift kontrol yöntemini kullanıyorum, parazitleri büyük oranda engelliyor ama, parazitler çok yoğunsa, arada sırada hem 1. hem de 2. kontrolü aşan parazitler, istenmeyen algılamalara sebep olabiliyor. Soruyu soran arkadaşın dediği gibi, buton sadece 25-50 ms boyunca basılı olduğunda işlem yapacak bir buton kontrol yapısı yoğun parazit altında bile kararlı çalışan programlar için çok gerekli aslında..
Bak, ibret al, yere düşen yaprağa, O da eskiden, yukarıdan bakardı toprağa!

Andromeda

Daha iyi ..benim söylediğimin bir sonraki versiyonu.
picbasic de pals genişliğini ölçen komut var,  belki yardımcı olur...
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

Muyat

Aşagıdaki uygulama dogru mudur?Butona 100msden kısa basılırsa etiket başa dönecek.

BASLA:
IF TUS=0 THEN
FOR I=0 to 100
IF TUS=1 THEN BASLA
PAUSE 1
NEXT
goto anm
ENDIF


medese

muyat doğrusu aşağıdaki şekil
BASLA:
IF TUS=0 THEN
FOR I=0 to 100
IF TUS=1 THEN anm
PAUSE 1
NEXT
goto BASLA
ENDIF

OG

Basla:
    If TUS = 0 Then
bekle:
        For I = 0 To 100
            PAUSE 1
            If TUS = 0 Then bekle
        Next
        
        
    EndIf 
GoTo anm
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mucit23

Benim buradaki yaptığım uygulamamda birçok yerde yapmak istediğini kullandım. 
http://arectron.com/microchip/pic16f88-ve-ds18b20-ile-sicaklik-kontrol-devresi.html


DEFINE OSC 4

@ DEVICE pic16F88                      'işlemci 16F88                              
@ DEVICE pic16F88, WDT_OFF             'Watch Dog timer Kapatıldı.
@ DEVICE pic16F88, PWRT_ON             'Power on timer açık
@ DEVICE pic16F88, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F88, LVP_OFF             'Low Voltage Programming kapalı
@ DEVICE pic16F88, BOD_ON              'Brow Out Detect açık
@ DEVICE pic16F88, MCLR_off            'MCLR kullanılmıyor
@ DEVICE pic16F88, FCMEN_OFF           'Fail Safe Clok Monitör kapalı
@ DEVICE pic16F88, IESO_OFF            'Internal/External Swıtch Over kapatıldı
@ DEVICE pic16F88, CCPMX_OFF           'CCPMX kapalı  (default)
@ DEVICE pic16F88, DEBUG_OFF           'Debug kapalı
@ DEVICE pic16F88, WRT_OFF             'Flash Write Protect kapalı
@ DEVICE pic16F88, CPD_OFF             'Data code Protection kapalı
@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 

TRISA=%10111000
TRISB=%00000000
PORTA=0:PORTB=0

CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ANSEL=0  ;Analog Girişler İptal
OSCCON=%01100000
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256	
OPTION_REG=%00000011  'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%00100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
symbol GIEH = INTCON.7
TMR0=99
'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLE  VAR PORTA.6
'-----------------------------DEĞİŞKENLER---------------------------------------
TERM   VAR  WORD
ISIS   VAR  WORD  ; ISIS = SET DEĞERİ - POZİTİF TOLERANS
ISIP   VAR  WORD  ; ISIP = SET DEĞERİ + POZİTİF TOLERANS
ISIZ   VAR  WORD  ; ISIZ = SET DEĞERİ + NEGATİF TOLERANS
ISIN   VAR  WORD  ; ISIN = SET DEĞERİ - NEGATİF TOLERANS
ISIF   VAR  WORD  ; ISIF = POZİTİFTOLERANS - SET DEĞERİ
ISIK   VAR  WORD  ; ISIK = NEGATİFTOLERANS - SET DEĞERİ
I      VAR  WORD
FOREND VAR  WORD
SAYAC  VAR  BYTE
SIRA   VAR  BYTE
SAYI   VAR  BYTE
ONDA   VAR  BYTE
AKTAR1 VAR  BYTE
AKTAR2 VAR  BYTE
AKTAR3 VAR  BYTE
SYC    VAR  BYTE
SNS    VAR  BYTE  ; SNS DEĞERİ POZİTİF SICAKLIKLAR İÇİN TOLERANS DEĞERİDİR.
ZNS    VAR  BYTE  ; ZNS DEĞERİ NEGATİF SICAKLIKLAR İÇİN TOLERANS DEĞERİDİR.
SNY    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
SIGN   VAR  BYTE
NSIGN  VAR  BYTE
PSIGN  VAR  BYTE
TEMP   VAR  BYTE
TUS    VAR  BYTE
Z      VAR  BYTE
X      VAR  BYTE
POZ    VAR  BYTE
AYR    VAR  BIT
DP     VAR  BIT
SP     VAR  BIT
W      VAR  BIT
U      VAR  BIT
'---------------------------------ISI TANIMLAMALARI-----------------------------
    Busy        VAR BIT         ' Busy Status-Bit
    HATA        VAR BIT
    HAM         VAR	WORD
    ISI         VAR WORD        ' Sensör HAM okuma değeri
    Float       VAR WORD        ' Holds remainder for + temp C display       
    ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık     
    ISARET      VAR BYTE        
    Comm_Pin    VAR	PORTA.7
    SYMBOL Data_Pin = TRISA.7
'-------------------------------------------------------------- 
CLEAR
GIRIS:
  GOSUB  DS_Check                     ;Sensörü denetle
  WHILE HATA=1
    GOSUB SENSOR_YOK
    GOTO GIRIS
  WEND

gosub SENSORYAZ                    ;sensör set
gosub EKRAN3:GIEH=1                ;KESME AÇILDI
BASLANGIC:'--------------------BAŞLANGIC------------------------------------
  GOSUB SENSOROKU            ;İKİ DEFA SENSÖRÜ OKU
  GOSUB SENSOROKU
      read $0,ISIL
      READ $1,ISIH
      READ $2,SNS
      READ $3,ZNS
      READ $4,SIGN
      READ $5,TEMP
        IF ISIL>99 THEN ISIL=0
        IF ISIH>9 THEN ISIH=0
        IF SNS>50 THEN SNS=0
        IF ZNS>5 THEN ZNS=0
        IF SIGN>45 THEN SIGN = "+"
        IF TEMP>1 THEN TEMP=1
           TERM=(ISIL*10)+ISIH
               ISIS=TERM-SNS
               ISIP=TERM+SNS
               ISIZ=TERM+ZNS
               ISIN=TERM-ZNS
             IF SNS>TERM THEN
               ISIS=0 
               PSIGN = "-"
               ISIF=SNS-TERM
             ELSE
               PSIGN = "+"
             ENDIF
             IF ZNS>TERM THEN
               ISIN=0
               NSIGN = "+"
               ISIK=ZNS-TERM
             ELSE
               NSIGN = "-"
             ENDIF
        FOREND=15000
        GOSUB DELAY                                                                              
   U=0:AYR=0:FOREND=150
BASLA:'----------------------------ANA DONGÜ------------------------------------
   IF HATA=1 THEN
    W=0:GOSUB SENSOR_YOK
   ELSE
    W=1:GOSUB EKRAN
   ENDIF
   GOSUB SENSOROKU
   GOSUB KONTROL
   
   IF SET=0 THEN 
     WHILE SET=0
       SYC=SYC+1
       GOSUB DELAY
       IF SYC>10 AND SYC<81 THEN
          DP=0:GOSUB EKRAN1
          IF SET=1 THEN GOTO AYAR
       ENDIF
       IF SYC>100 THEN
          DP=0:SP=1:GOSUB EKRAN5
          IF SET=1 THEN GOTO AYAR2
       ENDIF
       IF SYC>100 THEN syc=101
     WEND
   ELSE
     SYC=0
   ENDIF   
      
GOTO BASLA

'--------------------------------ALT PROGRAMLAR---------------------------------
SENSORYAZ: 'okumaya hazırlan..          
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]  ;Hassasiyet 12 bit olarak ayarlanıyor
OWOUT   Comm_Pin, 1, [$CC,$48]          
OWOUT   Comm_Pin, 1, [$CC,$B8]          
OWOUT   Comm_Pin, 1, [$CC,$BE]          
return 

SENSOROKU:
          GOSUB  DS_Check :IF HATA=1 THEN RETURN
          OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
          OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
          IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
          OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
          OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
          GOSUB   Hesapla
RETURN

DS_Check:
          Data_Pin=0
          Comm_Pin=0
          pauseus 500
          Data_Pin=1
          PAUSEUS 100  
          IF Comm_Pin=1 THEN 
            HATA=1               ;Sensör Yok
          ELSE
            HATA=0
          ENDIF
          pauseus 400
return

Hesapla:  ' Ham değerden Santigrat derece hesabı
    IF ISARET_BITI = 1 THEN
       ISARET = "-" ;İşaret negatif,Nokta pasif.. 
       ham=~ham+2
       GOTO CIK
    endif
    ISARET  = "+"   ;İşaret pozitif,Nokta aktif..
CIK:
    float = (HAM*10)/16 
    ISI=FLOAT/10 
RETURN  

KONTROL: ' Role kontrol.
IF TEMP=1 THEN            ;MOD POZİTİF İSE (Poz)
    IF SIGN = "+" THEN      ;SET DEĞERİ POZİTİF İSE 
      IF PSIGN = "+" THEN   ; tolerans değeri set değerinden küçük.
        IF ISIS=>FLOAT THEN 
          POZ=POZ+1
            IF POZ=>3 THEN 
              POZ=3:HIGH ROLE
            ENDIF
        endIF
        IF FLOAT=>TERM THEN 
          POZ=0:LOW ROLE
        ENDIF
      ENDIF                  
      IF PSIGN = "+" AND ISARET = "-" THEN ;şayet sıcaklık değeri negatif ise 
          HIGH ROLE                        ;sıcaklık pozitif oluncaya kadar röleyi çalışıtır
      endIF 
      IF PSIGN = "-" THEN                  ;Şayet Tolerans set değerinden büyük ise
        IF FLOAT=>ISIF AND ISARET = "-" THEN
          POZ=POZ+1
            IF POZ=>3 THEN
              POZ=3:HIGH ROLE
            ENDIF
        ENDIF
        IF FLOAT=>TERM and ISARET = "+" THEN 
          POZ=0:LOW ROLE
        ENDIF
      ENDIF
    ELSE                                ; SET DEĞERİ NEGATİF   
    
        IF ISI=>ISIZ and ISARET = "-" THEN
          POZ=POZ+1
            IF POZ=>3 THEN 
              POZ=3:HIGH ROLE
            ENDIF
        ENDIF
        IF TERM=>ISI OR ISARET = "+" THEN 
          POZ=0:LOW ROLE
        ENDIF
    ENDIF 
  ELSE               ;ÇALIŞMA MODU SOĞUTMA(NEG)
    IF SIGN = "+" THEN
      IF ISARET = "-" THEN LOW ROLE
      IF NSIGN = "-" THEN
        IF FLOAT=>ISIP THEN
          POZ=POZ+1
            IF POZ=>3 THEN
              POZ=3:HIGH ROLE
            ENDIF
        ENDIF
        IF TERM=>FLOAT THEN
          POZ=0:LOW ROLE
        ENDIF
      ENDIF
    ELSE
      IF NSIGN = "-" AND ISARET = "+" THEN LOW ROLE
      IF NSIGN = "+" THEN
        IF ISI=>ISIK AND ISARET = "+" THEN 
          POZ=POZ+1 
            IF POZ=>3 THEN
              POZ=3:HIGH ROLE 
            ENDIF
        ENDIF
        IF ISI=>TERM and ISARET = "-" THEN 
          POZ=0:LOW ROLE
        ENDIF
      ENDIF
      IF NSIGN = "-" THEN
        IF ISIN=>ISI THEN
          POZ=POZ+1
            IF POZ=>3 THEN
              POZ=3:HIGH ROLE
            ENDIF
        ENDIF
        IF ISI=>TERM THEN
          POZ=0:LOW ROLE
        ENDIF
      ENDIF
    ENDIF
  ENDIF
RETURN   

DELAY: 'gecıkme 
  FOR I=0 TO FOREND:NEXT
RETURN

SENSOR_YOK:
    DP=0
    Z=17:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
    Z=17:GOSUB AL:AKTAR2=SAYI:IF U=1 THEN AKTAR2=0
    Z=13:GOSUB AL:AKTAR3=SAYI:IF U=1 THEN AKTAR3=0
RETURN

EKRAN:'Sıcaklık gösteriliyor.
  IF ISARET = "+" THEN  ;sıcaklık pozitif ise...
    DP=1
    Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI          
    Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI
    Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI
  ELSE                  ;sıcaklık negatif ise
    DP=0
    z=FLOAT DIG 1:GOSUB AL:AKTAR1=SAYI;3 dijit old. için negatif sıcalıklarda
    Z=FLOAT DIG 2:GOSUB AL:AKTAR2=SAYI;sadece tam sıcaklık değeri gösterilir.
    AKTAR3=64   ;Bu değer eksi işaretini temsil eder.
  ENDIF
RETURN

EKRAN1: 'SET yazısı
 Z=14:GOSUB AL:AKTAR1=SAYI
 Z=13:GOSUB AL:AKTAR2=SAYI
 Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'Set değeri gösteriliyor
   IF SIGN = "+" THEN     ;sıcaklık pozitif ise
       DP=1
     Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
     Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
     Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI
   ELSE                   ;SICAKLIK EKSİ DEĞER DEMEK
       DP=0
     Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
     Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
     AKTAR3=64    
   ENDIF
RETURN
EKRAN3: ;Başlangıç
 DP=0:SP=0
 AKTAR1=64
 AKTAR2=64
 AKTAR3=64
RETURN
EKRAN4:'Hassasiyet ekranı
 Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
 Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI
 aktar3=0
RETURN
EKRAN5:;Çalışma Modu Ekranı
  IF TEMP.0=1 THEN 
     IF U=1 THEN
       AKTAR1=0:AKTAR2=0:AKTAR3=0:SP=0
     ELSE
       SP=1
       Z=15:GOSUB AL:AKTAR3=SAYI   ;POZiTiF(POZ.)
       Z=0 :GOSUB AL:AKTAR2=SAYI   ;O   
       Z=2 :GOSUB AL:AKTAR1=SAYI   ;Z
     ENDIF
  ELSE
     IF U=1 THEN
       AKTAR1=0:AKTAR2=0:AKTAR3=0:SP=0
     ELSE
      SP=1
      Z=16:GOSUB AL:AKTAR3=SAYI   ;NEGATiF(NEG.)
      Z=13:GOSUB AL:AKTAR2=SAYI   ;E
      Z=9 :GOSUB AL:AKTAR1=SAYI   ;G
     ENDIF
  ENDIF
 RETURN
EKRAN6:'Neg. Hassasiyet ekranı
   z=ZNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
   AKTAR2=0
   AKTAR3=0
RETURN

AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120,115,55,80],SAYI :RETURN'Karekter al 
;AL:LOKUP  Z,[0,1,2,3,4,5,6,7,8,9,o,C,-,E,T,P,N,r],SAYI :RETURN ; KARAKTER AL

KAYDET: 'Değerler eproom'a kaydediliyor..
WHILE SET=0:WEND
 ISIL=TERM/10
 ISIH=TERM//10
 WRITE $0,ISIL:PAUSEUS 10
 WRITE $1,ISIH:PAUSEUS 10
 WRITE $2,SNS :PAUSEUS 10
 WRITE $3,ZNS :pauseus 10
 WRITE $4,SIGN:pauseus 10
 
GOTO BASLANGIC

AYAR: 'Menuye gırıs 
 low ROLE
 READ $0,ISIL
 READ $1,ISIH
 read $4,SIGN
 IF ISIL>99 THEN ISIL=0
 IF ISIH>9 THEN ISIH=0
 IF SIGN>45 THEN SIGN = "+"
 TERM=(ISIL*10)+ISIH
 FOREND=5000:GOSUB DELAY
 syc=0:SNY=0:W=0:FOREND=150 
MENU:                           ;MENÜ ALT PROGRAMI
IF YUKARI=0 THEN
 W=1:U=0:sny=0 
  IF SIGN= "+" THEN
     TERM=TERM+1 
     WHILE YUKARI=0
      SYC=SYC+1:GOSUB DELAY
        IF SYC>40 THEN
          SYC=50:TERM=TERM+1:GOSUB DELAY
        ENDIF 
      GOSUB EKRAN2
      IF TERM>990 THEN TERM=990
    WEND
    SYC=0:IF TERM>999 THEN TERM=990
  ELSE 
    TERM=TERM-1
    WHILE YUKARI=0
      SYC=SYC+1:GOSUB DELAY
        IF SYC>40 THEN
          FOREND=300:SYC=50
          TERM=TERM-1:GOSUB DELAY
        ENDIF
      GOSUB EKRAN2
      IF TERM=0 OR TERM>50 THEN
        TERM=0:SIGN = "+"
        GOSUB EKRAN2
        GOTO MENU
      ENDIF
    WEND
    SYC=0:FOREND=150
  ENDIF
ELSE
  W=0:FOREND=150
ENDIF

MENU2:

IF ASAGI=0 THEN
W=1:U=0:sny=0 
  IF SIGN = "+" THEN                              ;
    TERM=TERM-1                                   ;
    WHILE ASAGI=0                                 ;               
      SYC=SYC+1:GOSUB DELAY                       ;               
        IF SYC>40 THEN                            ;               
          SYC=50:TERM=TERM-1:GOSUB DELAY          ;               
        ENDIF                                     ;               
      GOSUB EKRAN2                                ;               
      IF TERM>999 THEN                            ;              
        TERM=0:SIGN = "-" ;SICAKLIK EKSİYE İNMİŞ  ;              
        GOTO MENU2                                ;               
      ENDIF                                       ;               
    WEND                                          ;               
    SYC=0                                         ;               
    IF TERM>999 THEN                              ;               
      TERM=0:SIGN = "-"   ;SICAKLIK EKSİYE İNMİŞ  ;               
      GOTO MENU2                                  ;               
    ENDIF                                         ;               
  ELSE                                            ;               
    TERM=TERM+1
    GOSUB EKRAN2
      WHILE ASAGI=0
        SYC=SYC+1:GOSUB DELAY
          IF SYC>40 THEN
            FOREND=300:SYC=50
            TERM=TERM+1:GOSUB DELAY
          ENDIF                                                                               
       IF TERM>49 THEN TERM=50                                   
       GOSUB EKRAN2
      WEND                                              
      SYC=0:FOREND=150
      IF TERM>49 THEN TERM=50                                                                                                                   ;               
  ENDIF                                           
ELSE                                              
W=0:FOREND=150
ENDIF

gosub ekran2

IF SET=0 THEN
  WHILE SET=0:WEND
  GOTO SENSIVITY
ENDIF
GOTO MENU

SENSIVITY: 'TOLERANS menusu giriş..
  read $2,sns
  READ $3,ZNS
  IF SNS>50 THEN SNS=0
  IF ZNS>5 THEN ZNS=0
  SNY=0
SENS:
IF SIGN = "+" THEN
  DP=1:gosub ekran4
  IF YUKARI=0 THEN
    W=1:SNY=0:U=0  
    SNS=SNS+1
      WHILE YUKARI=0
        SYC=SYC+1:GOSUB DELAY
          IF SYC>40 THEN
            FOREND=125
            SYC=40:SNS=SNS+1:GOSUB DELAY
          ENDIF 
        GOSUB EKRAN4
        IF SNS=>50 THEN SNS=50
      WEND
    SYC=0:FOREND=150:IF SNS=>50 THEN SNS=50
  ELSE
    W=0
  ENDIF            
  IF ASAGI=0 THEN
    W=1:U=0:sny=0 
    SNS=SNS-1
      WHILE ASAGI=0
        SYC=SYC+1:GOSUB DELAY
          IF SYC>40 THEN
            FOREND=125
            SYC=40:SNS=SNS-1:GOSUB DELAY
          ENDIF 
        GOSUB EKRAN4
        IF SNS>50 THEN SNS=0
      WEND
    SYC=0:FOREND=150:IF SNS>50 THEN SNS=0
  ELSE
    W=0
  ENDIF
ELSE
DP=0:GOSUB EKRAN6
  IF YUKARI=0 THEN 
    W=1:SNY=0:U=0
    ZNS=ZNS+1 
    IF zNS=>5 THEN zNS=5
    GOSUB EKRAN6
      WHILE YUKARI=0:WEND
  ELSE
    W=0
  ENDIF 
  IF ASAGI=0 THEN
    W=1:SNY=0:U=0
    ZNS=zNS-1
    IF ZNS>5 THEN ZNS=0
    GOSUB EKRAN6 
      WHILE ASAGI=0:WEND
  ELSE
    W=0
  ENDIF
ENDIF  

IF SET=0 THEN
  DP=0
  gosub EKRAN3  
  GOTO KAYDET
ENDIF
GOTO SENS

AYAR2:
  LOW ROLE
  READ $5,TEMP
    IF TEMP>1 THEN TEMP=1
  W=0:SP=1
POZ_AYAR:
  
IF YUKARI=0 THEN
  W=1:U=0:SNY=0
  TEMP=TEMP+1
    IF TEMP>1 THEN TEMP=0
  GOSUB EKRAN5
  WHILE YUKARI=0:WEND
ELSE
W=0
ENDIF

IF ASAGI=0 THEN 
  W=1:U=0:SNY=0
  TEMP=TEMP-1
    IF TEMP>1 THEN TEMP=1
  GOSUB EKRAN5
  WHILE ASAGI=0:WEND
ELSE
W=0
ENDIF

 GOSUB EKRAN5

IF SET=0 THEN 
  WHILE SET=0:WEND
  WRITE $5,TEMP:PAUSEUS 10
  gosub EKRAN3 
  GOTO BASLANGIC
ENDIF
GOTO POZ_AYAR

Disable         		
KESME:  'kesme alt programı
  
IF W=0 THEN 
  SNY=SNY+1
  IF SNY=>120 THEN 
    U=1
    ELSE
    U=0
  ENDIF
ENDIF
IF SNY=>240 THEN SNY=0

	SAYAC=SAYAC+1				
   	If SAYAC>2 then SAYAC=0	

    If SAYAC=0 then
	  DIG2=0 
	  PORTB=AKTAR1
	  PORTB.7=SP
	  DIG0=1  
      PAUSEUS 2   	
	  Endif

	  If SAYAC=1 then		
	  DIG0=0
	  PORTB=AKTAR2
	  PORTB.7=DP
	  DIG1=1 
	  PAUSEUS 2
	  Endif
	  
	  If SAYAC=2 then		
	  DIG1=0
	  PORTB=AKTAR3
	  DIG2=1 
	  PAUSEUS 2
	  Endif	
          
   	TMR0=160
    INTCON.2=0
    			
    Resume		
	Enable	
  end		     

farklı menülere gitmek için tek butona farklı sürelerde basmak gerekiyor. Örneğin 0-2sn>>1.Menü, 2-xxSn>>2.Menü

Aynı şekilde menülerde parametreleri girerken tuşa basılı tutulduğu zaman değerleri hızlı hızlı arttırıyor.