(http://img221.imageshack.us/img221/4162/yeniwindowsresimdosyasfb4.jpg) (http://imageshack.us)
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
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