Keypad'dan Tuş okuma

Başlatan dijital74, 19 Ekim 2009, 18:12:06

dijital74

Merhaba arkadaşlar;

Okuduğum kitapların da katkısıyla 4x4 telefon tuş takımında basılan tuşun değerini LCD'de gösteren bir program yaptım. Daha sonra bunu hem LCD hem 7SD de gösteren bir programa dönüştürmeye kalktım. Ne yazık ki LCDde gördüğüm gibi 7SD de değerleri gösteremedim.

PIC16f877 kullanıyorum. LCD portB'ye tuş takımı portC'ye ve 7SD ortak katot olup lojik 1 sinyali ile transistörler ile portA'dan sürülüyor. Segment uçları da portD'ye bağlı. Programın kodları aşağıdaki gibidir.

   
define OSC 8
define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2

'Segmentler var portb
'Dijitler var porta

'i var byte
n var byte
Tus var word
    adcon1=7
    trisa=0
    trisb=0
    trisc=%11110000
    trisd=%00000000
    porta=%00000000
    Tus=0

pause 500   
Lcdout  "     HAZIR"
LCDOUT $FE,$C0,"Giris bekleniyor."
 
    
loop:
    portc=%00000001    '1. Satır seçildi
    if portc.4 then 
     tus="1"
     n=1
     goto lcd_goster
     endif
     
    if portc.5 then 
    tus="2"
    N=2
    goto lcd_goster
    endif
    
    if portc.6 then 
    tus="3"
    n=3    
    goto lcd_goster
    endif
    
    if portc.7 then 
    tus="A"    
    n=10
    goto lcd_goster
    endif
    
    portc=%00000010
    if portc.4 then 
    tus="4"  
    n=4
    goto lcd_goster
    endif
    
    if portc.5 then 
    tus="5"  
    n=5
    goto lcd_goster
    endif

    if portc.6 then 
    tus="6"  
    n=6
    goto lcd_goster
    endif
    
    if portc.7 then 
    Tus="B"  
    n=11
    goto lcd_goster
    endif
    
    portc=%00000100
    if portc.4 then 
    tus="7"
    n=7
    goto lcd_goster
    endif
    
    if portc.5 then 
    tus="8"  
    n=8
    goto lcd_goster
    endif
    
    if portc.6 then 
    tus="9"
    n=9
    goto lcd_goster
    endif
    
    if portc.7 then 
    Tus="C"  
    n=12
    goto lcd_goster
    endif
        
    portc=%00001000
    if portc.4 then 
    tus="*" 
    n=14
    goto lcd_goster
    endif
    
    if portc.5 then
    Tus="0"
    n=0
    goto lcd_goster
    endif
    
    if portc.6 then 
    Tus="#" 
    n=15
    goto lcd_goster
    endif
    
    if portc.7 then 
    tus="D" 
    n=13
    goto lcd_goster
    endif
    
    goto loop

LCD_goster:

pause 500

lcdout $fe,1
lcdout " Basilan tus:"
pause 500
lcdout $fe,$C0,"  ",tus,"     tusudur."
porta=1
lookup n, [$3f,$06,$5b,$4f,$66,$7c,$07,$7f,$6f,$77,$39,$5e,$79,$71],Portd
pause 500
goto loop
end


Elimde EasyPIC5 var, aynı zamanda programın işleyişini Proteustan takip ediyorum. Ne PortA'da ne de PortD'de bir hareket göremiyorum. Programda hatam varsa yardımcı olursanız sevinirim.

turkbey06

Merhabalar, bunun nedeni bariz bir şekilde belli. ama doğru olan biraz araştırma yapıp öğrenmen diye düşünüyorum. Kaldıki elindeki Easypic5 var. 7SD için de LCD için de örnekleri mevcut.  Ayrıca forumda aratırsan ETE hocamızın derslerinde'de  gayet güzel anlatılıyor bu konu, yine çözemedim dersende, biz buradayız kolay gelsin

dijital74

Herhangi bir konuda sıkıntım olsa onu okur öyle işe girişirim. Burada yaptıysam bir hata onu fark edemedim. Yazdıklarınız meseleye bir çözüm getirmiyor. Hazıra konmak gibi bir niyetim yok. Baştan aşağı yazdığım kod bana ait. PBP uzun zamandır kullanıyorum fakat bir süre ara vermiştim.

Yapıcı öneriler bekliyorum.

Ruzgarbey

merhaba.devre şemanı koysaydın daha kolay yardımcı olabilirdik.7sd lerin ortak katot olduğunu yazmışsın.peki portlardan bilgi verdiğinde segmentlerde hiç bir yanma olmuyormu?ayrıca çıkışlar için kullandığın transistörler nedir.ortak katot için pnp tipi transistör kullanman gerekiyor.transistörün iletimde olması için lojik 0 uygulaman gerekirki buda lookup tablosundan aldığın değişkenleri terslemen gerektiğini anlıyorum ben.bunu ister yazılımla istersende bir uln2803 ile halledebilirisn.tersleme işlemi yapıldıktan sonra 7sd lerin çalışmaması bir neden yok bana göre.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

dijital74

@Ruzgarbey

EasyPIC5 deneme kartı kullanıyorum. 7SD katot uçları CA3083 adlı entegre ile PortA'nın 0-3.bitlerine bağlanmış. Manual'de CA3083'ün 4 adet NPN transistörden oluştuğunu gösteriyor. Ben de ISISdeki simülasyonda tek bir display için( 1tanesi bana şimdilik yeter) BC237 kullandım.

BC237 de logic1 ile sürüldüğüne göre (ISISte denedim) donanım olarak bir sorun yok. Yazdığım kodlara odaklandım.

Diyelim ki lookup tablosu yanlış ya da terslenmesi gerekiyor; öyle de böyle de displaylerde birşeyler gözükmesi gerekmez mi? (Saçma sapan da olsa) Ne simülasyonda ne de deneme kartında PortA ve PortD çıkışlarında lojik seviyelerinde bir değişme göremedim.

Devre şeması aşağıdadır.

[/URL][/img]

ahmet2004

Bu konuyu daha önce ekledim diye hatırlıyorum.

Transistor'e bir direnç bağlamak gibi.


dijital74

@Ahmet2004

Transistör sürerken beyz ve collector uçlarına direnç konulduğunu biliyorum. Fakat bu dirençlerin simülasyona bir etkisi olmadığını düşündüğüm için ISISdeki devreme koymadım. Gerçek devrede bu dirençler bulunmakta..

Yine de isisde çizdiğim şemayı gösterdiğiniz şekilde değiştirdim. Değişen birşey yok. Zaten hata bu kadar basit olsaydı EasyPIC5 deneme kartında program çalışırdı. Çünkü hazır sistemin içinde transistörler dirençler üzerinden sürülmüştür. Yine de beyninize fikrinize sağlık.

ahmet2004

Bu şekilde ISIS de çalışıyor?

dijital74

Ne yazık ki hayır üstad. Bu yüzden özellikle yazdığım bir programda bir ayrıntıyı gözden kaçırdığımı düşünüyorum.

Edit: ETE hocam, nerdesin ?

tyildizak

Şu ve benzeri satırlar hatalı :  "if portc.5 then "..
Portc.5 ne değerde olacak da altındaki komutlar işletilecek?
"if portc.5 = 1 then" şeklinde olması gerekir.
Çok iyi inceleyemedim ama sanırım burada çuvallıyorsun.

Ruzgarbey

Alıntı yapılan: "tyildizak"Şu ve benzeri satırlar hatalı :  "if portc.5 then "..
Portc.5 ne değerde olacak da altındaki komutlar işletilecek?
"if portc.5 = 1 then" şeklinde olması gerekir.
Çok iyi inceleyemedim ama sanırım burada çuvallıyorsun.
hocam basicte
if portc.5 then ile if portc.5=1 then aynı anlama gelmektedir.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

tyildizak

@Ruzgarbey, teşekkürler, bunu kaçırmışım, manualinde  böyle bir kullanımdan örnek vermemişler .

M_B

porta=1 
lookup n, [$3f,$06,$5b,$4f,$66,$7c,$07,$7f,$6f,$77,$39,$5e,$79,$71],Portd


Portd yazan yerde bir değişken tanımla

Daha sonra o değişkeni Portd ye gonder.

Gordugum tum uygulamalarda hep o kısımda bir değişken var.
Bir bu şekilde dene bakalım.
Epey zamandir Basic le ilgilenmiyorum. ( Fazla bilgi sahibide değilim. )

Kolay gelsin
M_B
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Ruzgarbey

merhaba devreni tus takımı olmadan denedim.tus değişkenine bir değer atayarak.kodlarda sadece yer değiştirme yaptım.kristal olarak 4 mhz kullandım.devre şu anda çalışmaktadır.



Kodlar.......................


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [ MESUT ESKİ ]                                    *
'*  Notice  : Copyright (c) 2009 [ ESKIOGLU ELEKTRONIK ]        *
'*          : All Rights Reserved                               *
'*  Date    : 21.10.2009                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F877                      'işlemci 16F877                              
@ DEVICE pic16F877, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F877, PWRT_ON             'Power on timer açık
@ DEVICE pic16F877, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F877, XT_OSC              '4 MHZ osilatör kullanılacak
@ DEVICE pic16F877, BOD_OFF
@ DEVICE pic16F877, LVP_OFF
@ DEVICE pic16F877, PROTECT_OFF
   adcon1=7
   trisa=0
   trisb=0
   trisc=%11110000
   trisd=%00000000
   porta=0
   PORTD=0


define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2

'Segmentler var portb
'Dijitler var porta

'i var byte


   
n var byte
Tus var word

PAUSE 2000
BASLA:
Tus=3
lcdout $fe,1
lcdout " Basilan tus:"
pause 500
lcdout $fe,$C0,"  ",#tus,"     tusudur."
porta=1
pause 1
lookup Tus, [$3f,$06,$5b,$4f,$66,$7c,$07,$7f,$6f,$77,$39,$5e,$79,$71],Portd
pause 500

END


kodlara tuş takımını ilave edersin.saygılarımla kolay gelsin..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

dijital74

@Rüzgarbey

Verdiğiniz kodlara, tuş takımı ile ilgili olan kodları ekledim. 7SD de bazı harflerin düzgün gözükmesi için Lookup tablosunu gözden geçirdim. Şu an herşey istediğim gibi. Henüz nerede hata yaptığıma bakamadım. Projenin son halini koyuyorum.

'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [ MESUT ESKİ ] *
'* Notice : Copyright (c) 2009 [ ESKIOGLU ELEKTRONIK ] *
'* : All Rights Reserved *
'* Date : 21.10.2009 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'@ DEVICE pic16F877 'işlemci 16F877
'@ DEVICE pic16F877, WDT_ON 'Watch Dog timer açık
'@ DEVICE pic16F877, PWRT_ON 'Power on timer açık
'@ DEVICE pic16F877, PROTECT_OFF 'Kod Protek kapalı
'@ DEVICE pic16F877, XT_OSC '4 MHZ osilatör kullanılacak
'@ DEVICE pic16F877, BOD_OFF
'@ DEVICE pic16F877, LVP_OFF
'@ DEVICE pic16F877, PROTECT_OFF

adcon1=7
trisa=0
trisb=0
trisc=%11110000
trisd=%00000000
porta=0
PORTD=0


define LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
define OSC 8
'Segmentler var portb
'Dijitler var porta

'i var byte



n var byte
Tus var word
pause 1000   
Lcdout  "     HAZIR"
LCDOUT $FE,$C0,"Giris bekleniyor."
PAUSE 500
loop:
    portc=%00000001    '1. Satır seçildi
    if portc.4 then 
     tus="1"
     n=1
     goto lcd_goster
     endif
     
    if portc.5 then 
    tus="2"
    N=2
    goto lcd_goster
    endif
    
    if portc.6 then 
    tus="3"
    n=3    
    goto lcd_goster
    endif
    
    if portc.7 then 
    tus="A"    
    n=10
    goto lcd_goster
    endif
    
    portc=%00000010  '2. Satır seçildi
    if portc.4 then 
    tus="4"  
    n=4
    goto lcd_goster
    endif
    
    if portc.5 then 
    tus="5"  
    n=5
    goto lcd_goster
    endif

    if portc.6 then 
    tus="6"  
    n=6
    goto lcd_goster
    endif
    
    if portc.7 then 
    Tus="B"  
    n=11
    goto lcd_goster
    endif
    
    portc=%00000100      '3. Satır seçildi
    if portc.4 then 
    tus="7"
    n=7
    goto lcd_goster
    endif
    
    if portc.5 then 
    tus="8"  
    n=8
    goto lcd_goster
    endif
    
    if portc.6 then 
    tus="9"
    n=9
    goto lcd_goster
    endif
    
    if portc.7 then 
    Tus="C"  
    n=12
    goto lcd_goster
    endif
        
    portc=%00001000                '4. Satır seçildi
    if portc.4 then 
    tus="*" 
    n=14
    goto lcd_goster
    endif
    
    if portc.5 then
    Tus="0"
    n=0
    goto lcd_goster
    endif
    
    if portc.6 then 
    Tus="#" 
    n=15
    goto lcd_goster
    endif
    
    if portc.7 then 
    tus="D" 
    n=13
    goto lcd_goster
    endif
    
    goto loop

lcd_goster:
lcdout $fe,1
lcdout " Basilan tus:"
pause 200
lcdout $fe,$C0," ",Tus," tusudur."
porta=1
pause 1
lookup n, [$3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,$77,$7c,$39,$5e,$79,$71],Portd
pause 100
goto loop

END


Projenin buraya gelmesinde emeği geçen tüm arkadaşlara teşekkür ediyorum.