segment+keypad durdurma hatası

Başlatan matador86, 22 Eylül 2008, 23:21:18

matador86




keypad+lcd olan devreyi keypad+segment olarak değiştirdimbastığım her tuşun karşılığının alabiliyorum fakat *(tus10) basıldığında 0-9 arası sayım yapmaktadır aynı şekilde #(tus12) basıldığında 9-0 arası sayım yapılmaktadır fakat herhangi bir şekilde bu herhangi 2 tuştan biri aktif haldeyken diğer hiç bir tuş çalışmamaktadır kısacası kesme atayamadık.
0 tuşuna basınca devrenin resetlenmesini istiyoruz.fakat kesme atayamadığımız için çalışmamaktadır.

NOT:* yada # tuşlarınızdan herhangi biri çalışır durumdayken basılı tuttuğumuzda saymayı dondurmaktadır.daha sonra tekrar aktif hala gelmektedir.


KODLAR:

trisA=%00000000
trisB=%11111111

@ device_pic16f628A
@ device_pic16f628A_wdt_off
@ device_pic16f628A_pwrt_on
@ device_pic16f628A_protect_off
@ device_pic16f628A_mclr_off
@ DEVICE_pic16F628A_INTRC_OSC_NOCLKOUT


CMCON=7    
OPTION_REG.7=0 'pull-up dirençleri aktif

tus var word
i VAR WORD


Symbol YATAY_A= PORTB.4
Symbol YATAY_B= PORTB.5
Symbol YATAY_C= PORTB.6
Symbol YATAY_D= PORTB.7
Symbol  DIKEY_1= PORTB.1
Symbol  DIKEY_2= PORTB.2
Symbol  DIKEY_3= PORTB.3

Tus=0
Pause 200

 
BASLA:
PORTB =254  
YATAY_A=0
   If DIKEY_1=0THEN
     Tus=1:PORTA=%00000001
     While DIKEY_1=0
     Wend
   Endif
  If DIKEY_2=0 Then
   Tus=2:PORTA=%00000010
   While DIKEY_2=0
   Wend
   Endif
   If DIKEY_3=0 Then
   Tus=3:PORTA=%00000011
   While DIKEY_3=0
   Wend
   Endif
   High YATAY_A
YATAY_B=0
   If DIKEY_1=0 Then
   Tus=4:PORTA=%00000100
   While DIKEY_1=0
   Wend
   Endif
   If DIKEY_2=0 Then
   Tus=5:PORTA=%00000101
   While DIKEY_2=0
   Wend
   Endif
   If DIKEY_3=0 Then
   Tus=6:PORTA=%00000110
   While DIKEY_3=0
   Wend
   Endif
   High YATAY_B
YATAY_C=0
   If DIKEY_1=0 Then
   Tus=7:PORTA=%00000111
   While DIKEY_1=0
   Wend
   Endif
   If DIKEY_2=0 Then
   Tus=8:PORTA=%00001000
   While DIKEY_2=0
   Wend
   Endif
   If DIKEY_3=0 Then
   Tus=9:PORTA=%00001001
   While DIKEY_3=0
   Wend
   Endif
   High YATAY_C
YATAY_D=0
 
 
   If DIKEY_1=0 Then
   Tus=11
   ENDIF
   IF DIKEY_1=0 THEN
      xx:
         PORTA=i
         i=i+1
         PAUSE 100
         while DIKEY_1=0
         WEND
         goto xx
         IF i>9 THEN i=0
         
   Endif

 
   If DIKEY_2=0 Then
   Tus=0:PORTA=%00000000
   While DIKEY_2=0
   Wend
   Endif
   
   
   If DIKEY_3=0 Then
   Tus=12
   Endif
   If DIKEY_3=0 Then
      yy:
         PORTA=i
         i=i-1
         PAUSE 100
         while DIKEY_3=0
         wend
     RESUME YY
         IF i>9 THEN i=0
         ENDIF
   High YATAY_D


pause 100
Goto BASLA
     
END


PROTEUS DOSYASI:
http://rapidshare.com/files/147513821/segment__keypad.rar.html

ete

Birinci hatanız ;
TRISB=%11111111 şeklinde bir komut vermişsiniz. Bu bütün B portunu giriş olarak ayarlar. Halbuki yatay girişler çıkış dikey girişler de input olması gerekir çünki programda öyle kullanmışsınız. Dolayısıyla bu komutu;
TrisB=%00000111 şeklinde değiştirmeniz gerekir.

İkinci olarak aynı anda iki tuşun basılı olup olmadığını kontrol etmek için illa kesme oluşturmak gerekmez. Bunun için 0-12 arası tuşların kontrolünü  bir alt programa verin ve  diğer iki tş olan # ve * tuşlarını ise normal program içinde ayrıca kontrol edin.

Örnek vermek gerekir ise ;
Basla:
        I=0
        Tus=255 'basılan tusu tespit etmek veya basılmadığını anlamak için
        Gosub Tusbak  '0-12 arası tuslardan biri basıldımı?
        IF TUS<11 then PortA=Tus
        IF TUS=11 or  TUS=12 then
        WHILE  Dikey_1=0 or Dikey_3=0
          Gosub Tusbak 'ikinci tuşun kontrolü bu şekilde yapılabilir
          if tus=x then xxxxx 'burada ikinci tus basılı iken ne yapılacak ise o yapılmalıdır.
          PORTA=I
          I=I+1
          IF I>9 then 
            I=0
             RESUME YY
          WEND
..........
........

          


Tabiiki anlattıklarım yalnızca size yol gösterme amaçlı. Programınızı alıp üzerinde biraz çalıştıktan sonra aşağıdaki hale getirdim. Bu hali ile sizin isteklerinize cevap verecek seviyede. Ufak tefek düzeltmeler gerekebilir.
Mantık olarak 0-9 arası tuşların basılmasını bir alt programla kontrol ediyorum ancak # ve * tuşlarının kontrollarını ana bölüm içinde yaparak alt programdan ikinci bir tuşun basılı olup olmadığını kontrol ediyorum.

Bu arada sıfır tuşuna basılınca devrenin resetlenmesi ifadesini anlamadığım için bir şey yapmadım. Resetlemeden neyi kast ediyorsunuz açıklayın yada o kısmını kendiniz yapın.

# yada * tuşalrında biri basılı iken ikinci bir tuşa basılması halinde program sayma işini kesmekte ancak sürekli kontrol yaptığı için ekrana bir sıfır sonra ikinci basılan tuş gelmektedir. Şayet bu konumda ekrannın sabit kalması isteniyor ise kodun biraz daha değiştirilmesi gerekir. Aslında onuda yaptım ama burası fazla şişecek diye koymadım. Yapılan iş yalnızca bir kere ikinci tuş kontrolü yaptırdım. Bunun için bir bit değişkenini set ettim.  # ve * tuşları veya ikinci tuş bırakılırsa  set edilen değişken yeniden reset olmakta.

Tam olarak amacınızı anlayamadığım için tam sonuca ulaşmam mümkün değil.(belkide ulaşmışımdır çünki program istediklerinizi yapıyor). Gerisini sizde halledebilirsiniz.
Simulasyon için mutlaka keypad yerine buton kullanın. AYnı anda iki tuşa birden basma simulasyonu için ise tuşlara paralel swich kullanın derim.

Ete
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : orhan seven                                       *
'*  Notice  : Copyright (c) 2008 orhan seven                    *
'*          : All Rights Reserved                               *
'*  Date    : 20.09.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
trisA=%00000000
trisB=%00001110

@ device pic16f628A
@ device pic16f628A,wdt_off
@ device pic16f628A,pwrt_on
@ device pic16f628A,protect_off
@ device pic16f628A,mclr_off
@ DEVICE pic16F628A,INTRC_OSC_NOCLKOUT  

CMCON=7    
OPTION_REG.7=0 'pull-up dirençleri aktif

tus var word
i   VAR byte
Z   var BIT 

Symbol YATAY_A= PORTB.4
Symbol YATAY_B= PORTB.5
Symbol YATAY_C= PORTB.6
Symbol YATAY_D= PORTB.7
Symbol  DIKEY_1= PORTB.1
Symbol  DIKEY_2= PORTB.2
Symbol  DIKEY_3= PORTB.3

Tus=0
Pause 200   
BASLA:
      TUS=255:z=0
      GOSUB TUSBAK
      if tus<10 then 
        PortA=TUS:pause 300
      endif 
      z=1 
      YATAY_D=0
       I=0
       while dikey_1=0 'then
          PORTA=i
          i=i+1
          PAUSE 100
          gosub TUSBAK
          IF TUS<10 then ATLA
          IF i>9 THEN i=0      
        wend 
      
      I=9      
        while dikey_3=0 
          PORTA=i
          i=i-1
          PAUSE 100
          gosub TUSBAK
          IF TUS<10 then ATLA
          IF i=255 THEN i=9      
        wend
ATLA:         
      z=0 
      HIGH YATAY_D
      Goto BASLA

TUSBAK:
PORTB =254  
YATAY_A=0
    If DIKEY_1=0THEN
      Tus=1
     goto CIK
    Endif
   If DIKEY_2=0 Then
    Tus=2
    goto CIK
    Endif
    If DIKEY_3=0 Then
    Tus=3 
    goto CIK
    Endif
High YATAY_A

YATAY_B=0
    If DIKEY_1=0 Then
    Tus=4
    goto CIK
    Endif
    If DIKEY_2=0 Then
    Tus=5
    goto CIK
    Endif
    If DIKEY_3=0 Then
    Tus=6
    goto CIK
    Endif
High YATAY_B

YATAY_C=0
    If DIKEY_1=0 Then
    Tus=7
    goto CIK
    Endif
    If DIKEY_2=0 Then
    Tus=8
    goto CIK
    Endif
    If DIKEY_3=0 Then
    Tus=9
    goto CIK
    Endif
High YATAY_C
    
low YATAY_D
    If DIKEY_2=0 Then
    Tus=0
    Endif       
 if z=0 then High YATAY_D
CIK:
    IF Z=0 then 
      PORTB=254
      else
      PORTB=126
      endif
    pause 100
    return  
      
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com