Keypad sorunu

Başlatan Cem, 21 Mart 2014, 18:18:36

Cem

arkadaşlar ben bir devre kurdum simulasyan programında keypadden istediğim değerleri okuyabiliyorum ancak devreyi kurduğum zaman keypadden rakam okuyamıyorum kodları yazıyorum acaba sorunun nerden kaynaklandıgını yazabilirmisiniz ?



TRISA=0
TRISD=%00000000
TRISB=0
TRISC=%00001111


'----------------------------------------------------------------
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 1
DEFINE LCD_RWREG PORTD
DEFINE LCD_RWBIT 2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'----------------------------------------------------------------
KAPIZ VAR BYTE
SIFRE VAR WORD 
A var byte
TUS VAR WORD
BASAMAK1 VAR BYTE
BASAMAK2 VAR BYTE
BASAMAK3 VAR BYTE
BASAMAK4 VAR BYTE
SAYI VAR word
SAYAC VAR BYTE
'----------------------------------------------------------------
Symbol YATAY_A=PORTB.3
Symbol YATAY_B=PORTB.4
Symbol YATAY_C=PORTB.5
Symbol YATAY_D=PORTB.6
Symbol DIKEY_1=PORTB.2
Symbol DIKEY_2=PORTB.1
Symbol DIKEY_3=PORTB.0
'----------------------------------------------------------------
SAYAC=0

a=15
KAPIZ=15
LOW PORTD.2
pause 200
'----------------------------------------------------------------
ACL:                                               
LCDOUT $FE,$80,"YENI SIFRE GIRINIZ"       
LCDOUT $FE,$C0,dec4 SIFRE
TUS=255
gosub tus_arA
IF TUS<10 then SIFRE=SIFRE*10+TUS     'İLK ŞİFRE OKUMA
IF SAYI>9999 then SAYI=0               ' sayı 10000 geçerse sıfırla
IF TUS!=255 THEN SAYAC=SAYAC+1           'TUSA 4 KERE BASARSA SIFRE TAMAM DEMEK
IF SAYAC=4 THEN LCDOUT $FE,1            'GITMEDEN ONCE EKRANI SIL
IF SAYAC=4 THEN ANA                  '4 SAYI GIRILIRSE SIFRE TAMAM
GOTO ACL                                 
'----------------------------------------------------------------
ANA:
tus=255
gosub tus_arA
IF TUS<10 then SAYI=SAYI*10+TUS              'KULLANICIDAN SIFRE ISTE
IF SAYI>9999 then SAYI=0                     'SAYI 9999 GECERSE SAYIYI RESETLE
LCDOUT $FE,$80,"SIFRE GIRINIZ"
LCDOUT $FE,$C0,dec4 SAYI
IF SIFRE=SAYI THEN LCDOUT $FE,1
IF SIFRE=SAYI THEN SORGU
PAUSE 200                           
GOTO ANA
'----------------------------------------------------------------
SORGU:
TUS=255
LCDOUT $FE,$80,"KURMAK ICIN 1"
LCDOUT $FE,$C0,"IPTAL  ICIN 2"
GOSUB TUS_ARA
IF TUS=1 THEN LCDOUT $FE,1
IF TUS=1 THEN KURMA
IF TUS=2 THEN TEMIZLE
GOTO SORGU
'----------------------------------------------------------------
KURMA:
a=a-1
PAUSE 1000
LCDOUT $FE,$80,"HAZIR OLMAYA"
LCDOUT $FE,$C0,dec2 a
IF A=10 THEN LCDOUT $FE,1
IF A=10 THEN ALARM
GOTO KURMA
'----------------------------------------------------------------
ALARM:
SAYI=0
LCDOUT $FE,$80,"HAZIR"
PAUSE 500
IF PORTC.0=0 THEN KAPI          '  ZONE1 KONTROL ET
IF PORTC.1=0 THEN SIREN           '  ZONE2 KONTROL ET
IF PORTC.2=0 THEN SIREN           '  ZONE3 KONTROL ET
IF PORTC.3=0 THEN SIREN           '  ZONE4 KONTROL ET
GOTO ALARM
'----------------------------------------------------------------
KAPI:
TUS=255
KAPIZ=KAPIZ-1
PAUSE 1000
LCDOUT $FE,$80,"SIREN SESINE",DEC2 KAPIZ
GOSUB TUS_ARA
IF TUS<10 then SAYI=SAYI*10+TUS     'SIFREYI SORUYOR
IF SAYI>9999 then SAYI=0               ' sayı 10000 geçerse sıfırla
lCDOUT $FE,$C0,"SIFRE GIR=",dec4 SAYI
IF SIFRE=SAYI THEN TEMIZLE                'SIFRE DOGRUYSA HERSEYI TEMIZLE VE BASA DON
IF KAPIZ=0 THEN LCDOUT $FE,1
IF KAPIZ=0 THEN SIREN
GOTO KAPI

'----------------------------------------------------------------
SIREN:
PORTC.5=1                          'SIREN CIKIS AKTIF
TUS=255
LCDOUT $FE,$80,"ALARM"             
LCDOUT $FE,$C0,"SIFRE GIR=",dec4 SAYI
GOSUB TUS_ARA
IF TUS<10 then SAYI=SAYI*10+TUS     'SIFREYI SORUYOR
IF SAYI>9999 then SAYI=0               ' sayı 10000 geçerse sıfırla
IF SIFRE=SAYI THEN PORTC.5=0            'SIFRE DOGRUYSA SIREN SUSTUR
IF SIFRE=SAYI THEN TEMIZLE                'SIFRE DOGRUYSA HERSEYI TEMIZLE VE BASA DON
GOTO SIREN
'----------------------------------------------------------------
EKRANTEM:
LCDOUT $FE,1
RETURN 
'----------------------------------------------------------------
TEMIZLE:
KAPIZ=15
a=15
SAYI=0               
TUS=255               
LCDOUT $FE,1           
GOTO ANA
'----------------------------------------------------------------
TUS_ARA:                                   'BUTUN KEYPAD ISLEMLERI
YATAY_A=0
If DIKEY_1=0 THEN Tus=1
While DIKEY_1=0
Wend
If DIKEY_2=0 Then Tus=2
While DIKEY_2=0
Wend
If DIKEY_3=0 Then Tus=3
While DIKEY_3=0
Wend
YATAY_A=1

YATAY_B=0
If DIKEY_1=0 THEN Tus=4
While DIKEY_1=0
Wend
If DIKEY_2=0 Then Tus=5
While DIKEY_2=0
Wend
If DIKEY_3=0 Then Tus=6
While DIKEY_3=0
Wend
YATAY_B=1

YATAY_C=0
If DIKEY_1=0 THEN Tus=7
While DIKEY_1=0
Wend
If DIKEY_2=0 Then Tus=8
While DIKEY_2=0
Wend
If DIKEY_3=0 Then Tus=9
While DIKEY_3=0
Wend
YATAY_C=1

YATAY_D=0
If DIKEY_1=0 THEN Tus=11
While DIKEY_1=0
Wend
If DIKEY_2=0 Then Tus=0
While DIKEY_2=0
Wend
If DIKEY_3=0 Then Tus=13
While DIKEY_3=0
Wend
YATAY_D=1

RETURN

END

ete

#1
Yaptığın devreden kaynaklanıyor demem gerekir. Sira simulasyonda çalışıyor diyorsun.
Ancak simulasyonda da olsa çalışabilmesi için tuş takımına bağlanan bacaklardan ya yatayların yada dikeylerin giriş pini olarak ayarlanmaları gerekir. Senin programda dikeylerin giriş pini olması gerekiyor.
Bak bakalım TRISB registerine hiç bir pini giriş yapmışmısın.
Mutlaka simulasyonda başka devre yada program gerçekte ise daha başka devre yada program kullanıyorsun yoksa bu programın simulasyonda da çalışmaması gerekir.

Ete

Cem

hocam dediğiniz şekilde dikey kısımları giriş olarak ayarladım ancak simulasyon programında bile çalışmamaya başladı.
TRİSA=%00000111 yanlış anlamadıysam bu şekilde yapmam gerekmiyormuydu ?

ete

Tuş takımın nereye bağlı onuda bilmiyormusun? Şemaya bakmak damı aklına gelmiyor?
Bak buraya şema koymadın. Ama ben programına bakarak sana ne yazmışım? Hiç olmazsa oraya bak hemde dikkatli bak.
TRISB registerine bak demişim çünki programında tuş takımı PortB ye bağlı ohalde TRISB de düzeltme yaman gerekirken neden TRISA (PORTA nın registeridir) da bunu yapıyorsun.?

Ete

Cem

hocam buraya yanlıs yazmısım b portunda farkındayım.şuan pic e yazılımı attım tuş okuma kısmında biraz değişiklik yaptım ancak sistem açılır açılmaz surekli 1 e basılıyormus gibi algılıyor keypad i soksem bile b portunu tamamen bosa cıkarttım ve yinede surekli 1 e basılıymıs gibi davranıyor.

Cem

#5

kodu bu şekle getirdim


TRISA=0
TRISD=%00000000
TRISB=%00000111
TRISC=%00001111
'----------------------------------------------------------------
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 1
DEFINE LCD_RWREG PORTD
DEFINE LCD_RWBIT 2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
'----------------------------------------------------------------
KAPIZ VAR BYTE
SIFRE VAR WORD 
A var byte
TUS VAR WORD
BASAMAK1 VAR BYTE
BASAMAK2 VAR BYTE
BASAMAK3 VAR BYTE
BASAMAK4 VAR BYTE
SAYI VAR word
SAYAC VAR BYTE
'----------------------------------------------------------------
Symbol YATAY_A=PORTB.3
Symbol YATAY_B=PORTB.4
Symbol YATAY_C=PORTB.5
Symbol YATAY_D=PORTB.6
Symbol DIKEY_1=PORTB.2
Symbol DIKEY_2=PORTB.1
Symbol DIKEY_3=PORTB.0
'----------------------------------------------------------------
SAYAC=0
a=15
KAPIZ=15
LOW PORTD.2
pause 200
'----------------------------------------------------------------
ACL:                                               
LCDOUT $FE,$80,"YENI SIFRE GIRINIZ"       
LCDOUT $FE,$C0,dec4 SIFRE
tus=255
gosub tus_arA
IF TUS<10 then SIFRE=SIFRE*10+TUS     'İLK ŞİFRE OKUMA
IF SAYI>9999 then SAYI=0               ' sayı 10000 geçerse sıfırla
IF TUS!=255 THEN SAYAC=SAYAC+1           'TUSA 4 KERE BASARSA SIFRE TAMAM DEMEK
IF SAYAC=4 THEN LCDOUT $FE,1            'GITMEDEN ONCE EKRANI SIL
IF SAYAC=4 THEN ANA                  '4 SAYI GIRILIRSE SIFRE TAMAM
GOTO ACL                                 
'----------------------------------------------------------------
ANA:
tus=255
gosub tus_arA
IF TUS<10 then SAYI=SAYI*10+TUS              'KULLANICIDAN SIFRE ISTE
IF SAYI>9999 then SAYI=0                     'SAYI 9999 GECERSE SAYIYI RESETLE
LCDOUT $FE,$80,"SIFRE GIRINIZ"
LCDOUT $FE,$C0,dec4 SAYI
IF SIFRE=SAYI THEN LCDOUT $FE,1
IF SIFRE=SAYI THEN SORGU
PAUSE 200                           
GOTO ANA
'----------------------------------------------------------------
SORGU:
TUS=255
LCDOUT $FE,$80,"KURMAK ICIN 1"
LCDOUT $FE,$C0,"IPTAL  ICIN 2"
GOSUB TUS_ARA
IF TUS=1 THEN LCDOUT $FE,1
IF TUS=1 THEN KURMA
IF TUS=2 THEN TEMIZLE
GOTO SORGU
'----------------------------------------------------------------
KURMA:
a=a-1
PAUSE 1000
LCDOUT $FE,$80,"HAZIR OLMAYA"
LCDOUT $FE,$C0,dec2 a
IF A=10 THEN LCDOUT $FE,1
IF A=10 THEN ALARM
GOTO KURMA
'----------------------------------------------------------------
ALARM:
SAYI=0
LCDOUT $FE,$80,"HAZIR"
PAUSE 500
IF PORTC.0=0 THEN KAPI          '  ZONE1 KONTROL ET
IF PORTC.1=0 THEN SIREN           '  ZONE2 KONTROL ET
IF PORTC.2=0 THEN SIREN           '  ZONE3 KONTROL ET
IF PORTC.3=0 THEN SIREN           '  ZONE4 KONTROL ET
GOTO ALARM
'----------------------------------------------------------------
KAPI:
TUS=255
KAPIZ=KAPIZ-1
PAUSE 1000
LCDOUT $FE,$80,"SIREN SESINE",DEC2 KAPIZ
GOSUB TUS_ARA
IF TUS<10 then SAYI=SAYI*10+TUS     'SIFREYI SORUYOR
IF SAYI>9999 then SAYI=0               ' sayı 10000 geçerse sıfırla
lCDOUT $FE,$C0,"SIFRE GIR=",dec4 SAYI
IF SIFRE=SAYI THEN TEMIZLE                'SIFRE DOGRUYSA HERSEYI TEMIZLE VE BASA DON
IF KAPIZ=0 THEN LCDOUT $FE,1
IF KAPIZ=0 THEN SIREN
GOTO KAPI

'----------------------------------------------------------------
SIREN:
PORTC.5=1                          'SIREN CIKIS AKTIF
TUS=255
LCDOUT $FE,$80,"ALARM"             
LCDOUT $FE,$C0,"SIFRE GIR=",dec4 SAYI
GOSUB TUS_ARA
IF TUS<10 then SAYI=SAYI*10+TUS     'SIFREYI SORUYOR
IF SAYI>9999 then SAYI=0               ' sayı 10000 geçerse sıfırla
IF SIFRE=SAYI THEN PORTC.5=0            'SIFRE DOGRUYSA SIREN SUSTUR
IF SIFRE=SAYI THEN TEMIZLE                'SIFRE DOGRUYSA HERSEYI TEMIZLE VE BASA DON
GOTO SIREN
'----------------------------------------------------------------
EKRANTEM:
LCDOUT $FE,1
RETURN 
'----------------------------------------------------------------
TEMIZLE:
KAPIZ=15
a=15
SAYI=0               
TUS=255               
LCDOUT $FE,1           
GOTO ANA
'----------------------------------------------------------------
TUS_ARA:                                   'BUTUN KEYPAD ISLEMLERI
YATAY_A=1
If DIKEY_1=1 THEN Tus=1
While DIKEY_1=1
Wend
If DIKEY_2=1 Then Tus=2
While DIKEY_2=1
Wend
If DIKEY_3=1 Then Tus=3
While DIKEY_3=1
Wend
YATAY_A=0

YATAY_B=1
If DIKEY_1=1 THEN Tus=4
While DIKEY_1=1
Wend
If DIKEY_2=1 Then Tus=5
While DIKEY_2=1
Wend
If DIKEY_3=1 Then Tus=6
While DIKEY_3=1
Wend
YATAY_B=0

YATAY_C=1
If DIKEY_1=1 THEN Tus=7
While DIKEY_1=1
Wend
If DIKEY_2=1 Then Tus=8
While DIKEY_2=1
Wend
If DIKEY_3=1 Then Tus=9
While DIKEY_3=1
Wend
YATAY_C=0

YATAY_D=1
If DIKEY_1=1 THEN Tus=11
While DIKEY_1=1
Wend
If DIKEY_2=1 Then Tus=0
While DIKEY_2=1
Wend
If DIKEY_3=1 Then Tus=13
While DIKEY_3=1
Wend
YATAY_D=0

RETURN

END

Powered by EzPortal