Lütfen Yardım Keypad sorunu

Başlatan eee1984, 21 Şubat 2008, 11:25:03

eee1984

Merhaba arkadaslar

Ben keypadden bastıgım tusu lcd de gormek istiyorum ama goremiyorum proteus goruntusu ve kodları asagıda

'****************************************************************
'*  Name    : Kablosuz Diafon.BAS                               *
'*  Author  :                                               *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20.02.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :  LCD, Keypad ve pic 16f870 le yapılan k  *
'*          : *
'****************************************************************

DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40 


'******LCD TANIMLAMALARI******
DEFINE LCD_DREG     PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI
DEFINE LCD_DBIT     0    'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??!
DEFINE LCD_EREG     PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     5    'LCD ENABLE BITI HANGI PORTA BAGLI  ??
DEFINE LCD_RSREG    PORTC 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    6     'LCD RS BACAGI HANGI BITE BAGLI   ???
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR   satır sayısı

Tus var byte

TRISB=%00001111
TRISC=0
Portc.6=1
PORTC.5=1

PAUSE 500           '500 ms BEKLEME YAP

LCDOUT $FE,1,"TUS BAS"
LCDOUT $FE,$C0,"LUTFEN"
PAUSE 2000


Keypad:

PORTB=%10000000 ;1.Satır SECİLDİ
            if PORTB.0 then Tus=%00000001   ;  7
            if PORTB.1 then Tus=%00000010   ;  8
            if PORTB.2 then Tus=%00000011   ;  9
            if PORTB.3 then Tus=%00001010   ;  /
             pause 20
            PORTB=%01000000 ;2.Satır SECİLDİ
            if PORTB.0 then Tus=%00000100   ; 4
            if PORTB.1 then Tus=%00000101   ;5
            if PORTB.2 then Tus=%00000110   ;6
            if PORTB.3 then Tus=%00001011   ;*
             pause 20
            PORTB=%00100000 ;3.Satır SECİLDİ
            if PORTB.0 then Tus=%00000111   ; 1
            if PORTB.1 then Tus=%00001000   ; 2
            if PORTB.2 then Tus=%00001001   ; 3
            if PORTB.3 then Tus=%00001100   ;  -
              pause 20
            PORTB=%00010000 ;4.Satır SECİLDİ
            if PORTB.0 then Tus=%00001110   ;  On/C
            if PORTB.1 then Tus=%00000000   ; 0
            if PORTB.2 then Tus=%00001111   ; =
            if PORTB.3 then Tus=%00001101   ; +
              pause 20
            
            LCDOUT $FE,1,"Basilan"
            LCDOUT $FE,$C0,#Tus
            goto keypad
END



Birde Lcd de  su komut benim rakam olarak gormemi saglar mı Basılan tusu


LCDOUT $FE,$C0,Tus


Yardım edebilirmisiniz acaba :oops:

Logan

@eee1984, devrenin kurulumu yanlış, araya pull-up dirençleri atmamışsın. Ayrıca diyotta koymamışsın. Programda ise;

Alıntı Yap
if PORTB.0 then Tus=%00000001

bu satırı bu kadar kısa kesme, araya bir gecikme koy. Alt programdan çıkarken PortB'nin ilgili bacağını low'a çekmeyi unutma. LCDOUT komutuna gelince "LCDOUT $fe,1, dec2 tus" şeklinde yaz. Ekranda tus registerinin decimal değerini 2 haneli olarak gösterir...
İmza.

eee1984

Alıntı yapılan: "Logan"@eee1984, devrenin kurulumu yanlış, araya pull-up dirençleri atmamışsın. Ayrıca diyotta koymamışsın. Programda ise;

Alıntı Yap
if PORTB.0 then Tus=%00000001

bu satırı bu kadar kısa kesme, araya bir gecikme koy. Alt programdan çıkarken PortB'nin ilgili bacağını low'a çekmeyi unutma. LCDOUT komutuna gelince "LCDOUT $fe,1, dec2 tus" şeklinde yaz. Ekranda tus registerinin decimal değerini 2 haneli olarak gösterir...

Devreyi kabaca yaptım sorun değil zaten proteus biçok şeyi ihmal ettiğini bildiğim için.. Ama yazılımda sey demişssiniz ya gecikme koy yani ben zaten her satır için 20 ms gecikme koyuyorum yani tekrar koymama gerek var mı acaba birde mesela her aktif ettiğim satır ı bir sonraki sartta 0 lıyorum yani low a cekiyorum

PORTB=%10000000
PORTB=%01000000
PORTB=%00100000

gb yani ben sanırım sizi anlamadım  :cry:

Birde pic i programlayıp devreye yerleştirdiğimde tus basmamı beklemeden hep
"Basılan "
"13" yada 55 gozukuyor neden olabilir acaba  :oops:

ete

@eee1984,
Tuş takımı kullanmanın bazı kuralları var ve bu kurallar tamamen mantıksal düşünceye dayanır. Öncelikle bunları öğrenmen gerek.
Pic portlarına bağlı olan bir tuş takımında tuşa basıldığını nasıl anlayacaksın.
Tuş denilen şey iki kontak dan ibaret bir mekanik aksam biliyorsun.
Kontağın birisi HIGH da dururken tusa basılınca diğer kontağa da HIGH ulaşır. Senin bunu anlayabilmen için sonradan HIGH ulaşan kontağın önceki konumunun LOW olması lazımki farkı ayırd edebilesin.
Şimdi tuş takımında 4 adet yatay 4 adet de dikey hat bulunmaktadır. Bu sisteme matriks yerleşim deniliyor.
Bu hatlardan yatay yada dikey olanları giriş yada çıkış yapmak gerekiyor.
Senin örneğinde olduğu gibi ABCD yatay hatlarını çıkış 1234 hatlarınıda giriş yapalım. Şimdi sen ilk satırında A hattını HIGH yapmışsın. Peki bu hat önce low olmalıki sen high yapınca bir farklılık olduğu anlaşılabilsin. Bu durumda ABCD hatları Pull-Down yapılmalı ki birisini High yapınca diğerleri LOW da beklemiş olsun. Amaaaa burada PortB nin dahili pull-up dirençleri olduğunu ve dışarıdan direnç bağlamadan bu uçların pull-up yapılabileceğini göz ardı etmemek gerek. O halde PortB nin pullup larını açarsan bütün yatay hatlar High da beklemiş olacaktır. Bu hali ile her hangi bir tuşa basılır ise dikey hatlardan da High almış olacaksın. Ancak ABCD hatlarını sırası ile LOW yapıp dikey hatları kontrol edersen işin daha kolay olacaktır sanırım.

Bu durumda programında değişiklik yapmak gerekecek. Önce  Dahili Pull-up dirençleri açılacak;
OPTION_REG.7=0   'pullup lar açıldı

TUSBAK:
PORTB=%01111111   'Yatay_A hattını LOW'a çekecek;
've ardından dikeyleri kontrol edeceksin.
IF PORTB =%00001110 then TUS=7
IF PORTB =%00001101 then TUS=8
IF PORTB =%00001011 then TUS=9
IF PORTB =%00000111 then TUS=10 '/"
PORTB=%10111111  'YATAY_B HATTINI LOW'A ÇEK
IF PORTB=%00001110 then TUS=4
IF PORTB=%00001101 then TUS=5
IF PORTB=%00001011 then TUS=6
IF PORTB=%00000111 then TUS=11 'x tusu"
PORTB=%11011111   'YATAY_C HATTINI LOW'A ÇEK
IF PORTB=%00001110 then TUS=1
IF PORTB=%00001101 then TUS=2
IF PORTB=%00001011 then TUS=3
IF PORTB=%00000111 then TUS=12 '- tusu"
PORTB=%11101111   'YATAY_D HATTINI LOW'A ÇEK
IF PORTB=%00001110 then TUS=13  'ON/C tusu
IF PORTB=%00001101 then TUS=0
IF PORTB=%00001011 then TUS=14 '= TUSU
IF PORTB=%00000111 then TUS=15 '+ tusu"
PORTB=%11111111  'YATAY HATLARI HIGH YAP
IF TUS<10 THEN 
    LCDOUT $fe,2,"TUS=",dec tus
ELSE
     IF TUS=10 THEN  LCDOUT $FE,2,"TUS="," / "
     IF TUS=11 THEN  LCDOUT $FE,2,"TUS=", "X"
     IF TUS=12 THEN  LCDOUT $FE,2,"TUS="," - "
     IF TUS=13 THEN  LCDOUT $FE,2,"TUS=","ON/C"
     IF TUS=14 THEN LCDOUT $FE,2,"TUS="," ="
     IF TUS =15 THEN LCDOUT $FE,2,"TUS="," +"
ENDIF
PAUSE 100
GOTO TUSBAK
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eee1984

Çok sağol un gercekten çok yardımcı oldunuz :oops:  ;)
Ama çalışmıyor sizin söylediğinizin aynısını yaptım ama en son  haliyle program su


DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 


'******LCD TANIMLAMALARI******
DEFINE LCD_DREG     PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI
DEFINE LCD_DBIT     0    'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??!
DEFINE LCD_EREG     PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     5    'LCD ENABLE BITI HANGI PORTA BAGLI  ??
DEFINE LCD_RSREG    PORTC 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    6     'LCD RS BACAGI HANGI BITE BAGLI   ???
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR   satır sayısı


OPTION_REG.7=0 'pullup lar açıldı 

Tus var byte

TRISB=%00001111
TRISC=0
Portc.6=1
PORTC.5=1


PAUSE 500           '500 ms BEKLEME YAP

lcdout $FE,1
LCDOUT $FE,$80,"ExE"
PAUSE 500
LCDOUT $FE,$C0,"2008"
PAUSE 500

;Buraya kadar LCD komutları dogru calısııyor
pause 500
lcdout $FE,1

TUSBAK:
PORTB=%01111111
;ve ardından dikeyleri kontrol edecegiz.
IF PORTB =%00001110 then TUS=7
IF PORTB =%00001101 then TUS=8
IF PORTB =%00001011 then TUS=9
IF PORTB =%00000111 then TUS=10 '/"
PORTB=%10111111
IF PORTB=%00001110 then TUS=4
IF PORTB=%00001101 then TUS=5
IF PORTB=%00001011 then TUS=6
IF PORTB=%00000111 then TUS=11 'x tusu"
PORTB=%11011111
IF PORTB=%00001110 then TUS=1
IF PORTB=%00001101 then TUS=2
IF PORTB=%00001011 then TUS=3
IF PORTB=%00000111 then TUS=12 '- tusu"
PORTB=%11101111
IF PORTB=%00001110 then TUS=13 'ON/C tusu
IF PORTB=%00001101 then TUS=0
IF PORTB=%00001011 then TUS=14 '= TUSU
IF PORTB=%00000111 then TUS=15 '+ tusu"
PORTB=%11111111

lcdout $FE,2,"Basilan"
pause 500
lcdout $FE,1
pause 500 
IF TUS<10 THEN  LCDOUT $fe,2,"TUS=",dec tus
IF TUS=10 THEN  LCDOUT $FE,2,"TUS="," / " 
IF TUS=11 THEN LCDOUT $FE,2,"TUS=", "X"
IF TUS=12 THEN LCDOUT $FE,2,"TUS="," - "
IF TUS=13 THEN LCDOUT $FE,2,"TUS=","ON/C"
IF TUS=14 THEN LCDOUT $FE,2,"TUS="," ="
IF TUS=15 THEN LCDOUT $FE,2,"TUS="," +"

PAUSE 100
 goto TUSBAK

END


Yukarıdaki programda en son "basilan" surekli tekrar ediyor yanıp sönerek ama bu arada herhangi bi tusa bassamda ekranda bişey gozukmuyor sorun nerde olabilir acaaba


:cry:

ete

Tek seferde program çalıştığı görülmemiştir zaten.
Tuşa basıldığında PortB nin alacağı değerlerin tespitinde hatamız var.

IF PORTB =%00001110 then TUS=7   ifadesinde şayet 7 tuşuna basılımış ise aslında B portu %01111110 değerini almaktadır. Baştaki sıfır bizim low'a çektiğimiz hattı ifade ediyor. SOndaki sıfır ise basılan tuştan dolayı sıfır oluyor. O halde bu tanımlamaların tamamı hatalı. Maalesef sonradan gördüm bu hatayı. Her neyse doğru kodlar aşağıdadır.

E T E

DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

'******LCD TANIMLAMALARI******
DEFINE LCD_DREG     PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI
DEFINE LCD_DBIT     0    'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??!
DEFINE LCD_EREG     PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     5    'LCD ENABLE BITI HANGI PORTA BAGLI  ??
DEFINE LCD_RSREG    PORTC 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    6     'LCD RS BACAGI HANGI BITE BAGLI   ???
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR   satır sayısı

ADCON1=7
OPTION_REG.7=0 'pullup lar açıldı
PORTA=0:TRISA=0
PORTB=0:TRISB=%00001111
portc=0:TRISC=0

Tus var byte


Portc.6=1
PORTC.5=1


PAUSE 500           '500 ms BEKLEME YAP

lcdout $FE,1
LCDOUT $FE,$80,"ExE"
PAUSE 500
LCDOUT $FE,$C0,"2008"
PAUSE 500


lcdout $FE,1

TUSBAK:
PORTB=%01111111
;ve ardından dikeyleri kontrol edecegiz.
IF PORTB =126 then TUS=7
IF PORTB =125 then TUS=8
IF PORTB =123 then TUS=9
IF PORTB =119 then TUS=10 '/"

PORTB=%10111111 
IF PORTB=%10111110 then TUS=4
IF PORTB=%10111101 then TUS=5
IF PORTB=%10111011 then TUS=6
IF PORTB=%10110111 then TUS=11 'x tusu"

PORTB=%11011111
IF PORTB=%11011110 then TUS=1
IF PORTB=%11011101 then TUS=2
IF PORTB=%11011011 then TUS=3
IF PORTB=%11010111 then TUS=12 '- tusu"
PORTB=%11101111 
IF PORTB=%11101110 then TUS=13 'ON/C tusu
IF PORTB=%11101101 then TUS=0
IF PORTB=%11101011 then TUS=14 '= TUSU
IF PORTB=%11100111 then TUS=15 '+ tusu"
PORTB=%11111111

IF TUS<10 THEN  LCDOUT $fe,2,"TUS=", Dec Tus ,"   "
IF TUS=10 THEN  LCDOUT $FE,2,"TUS="," /    "
IF TUS=11 THEN LCDOUT $FE,2,"TUS=", "X   "
IF TUS=12 THEN LCDOUT $FE,2,"TUS="," -    "
IF TUS=13 THEN LCDOUT $FE,2,"TUS=","ON/C   "
IF TUS=14 THEN LCDOUT $FE,2,"TUS="," =   "
IF TUS=15 THEN LCDOUT $FE,2,"TUS="," +  "

PAUSE 10
 goto TUSBAK

END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

eee1984

Alıntı yapılan: "ete"Tek seferde program çalıştığı görülmemiştir zaten.
Tuşa basıldığında PortB nin alacağı değerlerin tespitinde hatamız var.

IF PORTB =%00001110 then TUS=7   ifadesinde şayet 7 tuşuna basılımış ise aslında B portu %01111110 değerini almaktadır. Baştaki sıfır bizim low'a çektiğimiz hattı ifade ediyor. SOndaki sıfır ise basılan tuştan dolayı sıfır oluyor. O halde bu tanımlamaların tamamı hatalı. Maalesef sonradan gördüm bu hatayı. Her neyse doğru kodlar aşağıdadır.

E T E


[/code]

;) Çok sağol un inanın çok işime yaradı tesekurler... ;)

madpic

birde bunu dene istersen
keyb. bağlantısı
portb           keyboard
 b0 ----------------4
 b1 ----------------3
 b2 ----------------2
 b3 ----------------1
 b4 ----------------a
 b5 ----------------b
 b6 ----------------c
 b7 ----------------d

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 21.02.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4 'Oscillator speed in MHz: 3(3.5 4 8 10 12 16 20 24 25 32 33 40 


'******LCD TANIMLAMALARI****** 
DEFINE LCD_DREG PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI 
DEFINE LCD_DBIT 0 'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??! 
DEFINE LCD_EREG PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI 
DEFINE LCD_EBIT 5 'LCD ENABLE BITI HANGI PORTA BAGLI ?? 
DEFINE LCD_RSREG PORTC 'LCD RS BACAGI HANGI PORTA BAGLI 
DEFINE LCD_RSBIT 6 'LCD RS BACAGI HANGI BITE BAGLI ??? 
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI 
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR satır sayısı 

Tus var byte 

TRISB=%00001111 
TRISC=0 
Portc.6=1 
PORTC.5=1 

PAUSE 500 '500 ms BEKLEME YAP 

LCDOUT $FE,1,"TUS BAS" 
LCDOUT $FE,$C0,"LUTFEN" 
PAUSE 500 


Keypad: 

PORTB=%10000000 ;1.Satır SECİLDİ 
if PORTB.0 then Tus="+"; %00000001 ; 7 
if PORTB.1 then Tus="=";%00000010 ; 8 
if PORTB.2 then Tus="0";%00000011 ; 9 
if PORTB.3 then Tus="c";%00001010 ; / 
;pause 20 
PORTB=%01000000 ;2.Satır SECİLDİ 
if PORTB.0 then Tus="-";%00000100 ; 4 
if PORTB.1 then Tus="3";%00000101 ;5 
if PORTB.2 then Tus="2";%00000110 ;6 
if PORTB.3 then Tus="1";%00001011 ;* 
;pause 20 
PORTB=%00100000 ;3.Satır SECİLDİ 
if PORTB.0 then Tus="x";%00000111 ; 1 
if PORTB.1 then Tus="6";%00001000 ; 2 
if PORTB.2 then Tus="5";%00001001 ; 3 
if PORTB.3 then Tus="4";%00001100 ; - 
;pause 20 
PORTB=%00010000 ;4.Satır SECİLDİ 
if PORTB.0 then Tus="/";%00001110 ; On/C 
if PORTB.1 then Tus="9";%00000000 ; 0 
if PORTB.2 then Tus="8";%00001111 ; = 
if PORTB.3 then Tus="7";%00001101 ; + 
pause 50 

LCDOUT $FE,1,"Basilan" 
LCDOUT $FE,$C0,Tus 
goto keypad 
END

eee1984

Alıntı yapılan: "madpic"birde bunu dene istersen
keyb. bağlantısı
portb           keyboard
 b0 ----------------4
 b1 ----------------3
 b2 ----------------2
 b3 ----------------1
 b4 ----------------a
 b5 ----------------b
 b6 ----------------c
 b7 ----------------d

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 21.02.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4 'Oscillator speed in MHz: 3(3.5 4 8 10 12 16 20 24 25 32 33 40 


'******LCD TANIMLAMALARI****** 
DEFINE LCD_DREG PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI 
DEFINE LCD_DBIT 0 'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??! 
DEFINE LCD_EREG PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI 
DEFINE LCD_EBIT 5 'LCD ENABLE BITI HANGI PORTA BAGLI ?? 
DEFINE LCD_RSREG PORTC 'LCD RS BACAGI HANGI PORTA BAGLI 
DEFINE LCD_RSBIT 6 'LCD RS BACAGI HANGI BITE BAGLI ??? 
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI 
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR satır sayısı 

Tus var byte 

TRISB=%00001111 
TRISC=0 
Portc.6=1 
PORTC.5=1 

PAUSE 500 '500 ms BEKLEME YAP 

LCDOUT $FE,1,"TUS BAS" 
LCDOUT $FE,$C0,"LUTFEN" 
PAUSE 500 


Keypad: 

PORTB=%10000000 ;1.Satır SECİLDİ 
if PORTB.0 then Tus="+"; %00000001 ; 7 
if PORTB.1 then Tus="=";%00000010 ; 8 
if PORTB.2 then Tus="0";%00000011 ; 9 
if PORTB.3 then Tus="c";%00001010 ; / 
;pause 20 
PORTB=%01000000 ;2.Satır SECİLDİ 
if PORTB.0 then Tus="-";%00000100 ; 4 
if PORTB.1 then Tus="3";%00000101 ;5 
if PORTB.2 then Tus="2";%00000110 ;6 
if PORTB.3 then Tus="1";%00001011 ;* 
;pause 20 
PORTB=%00100000 ;3.Satır SECİLDİ 
if PORTB.0 then Tus="x";%00000111 ; 1 
if PORTB.1 then Tus="6";%00001000 ; 2 
if PORTB.2 then Tus="5";%00001001 ; 3 
if PORTB.3 then Tus="4";%00001100 ; - 
;pause 20 
PORTB=%00010000 ;4.Satır SECİLDİ 
if PORTB.0 then Tus="/";%00001110 ; On/C 
if PORTB.1 then Tus="9";%00000000 ; 0 
if PORTB.2 then Tus="8";%00001111 ; = 
if PORTB.3 then Tus="7";%00001101 ; + 
pause 50 

LCDOUT $FE,1,"Basilan" 
LCDOUT $FE,$C0,Tus 
goto keypad 
END

Çok teşekkür ederim ben bu forumu çok seviyorum :D  :roll: