Elektronik / Mikrodenetleyici Projeleri/

PicBasic Pro 4×4 buton keypad uygulaması pic16f877

Sponsorlu Bağlantılar

Hazırlayan: H.KORATEŞ – Devre pic16f877 mikro denetleyici üzerine kurulu 4×4 keypad bölümü 16 adet butondan oluşuyor butonlara basıldığında lcd ekranda buton numarası görünüyor. Ayrıca 1 numaralı butona basıldığında 8 numaralı D8 ledi yanıyor sırası ile her basışta led yanıyor sekizinci butondan sonra 9..16 butonlarına basıldığında ledler sırası ile sönüyor

Proteus isis simülasyonu

Emeği geçen hazırlayan kişilere teşekkürler uygulamanın picbasic pro ve proteus isis dosyaları: PicBasic Pro 4×4 buton keypad uygulaması pic16f877

Dosya indirme LINK listesi (TXT formatında) link-8509.zip şifre-pass: 320volt.com

Picbasic yazılım içeriği


' H.KORATEŞ 22.07.2003       YALOVA
' 4x4 KEYPAD UYGULAMASI
'**********************  Tanımlama Blokları ******************

@  device WDT_OFF &  pwrt_on & protect_on & cpd_on 
PCON=%00000000
define osc 20

Define  LCD_DREG       PORTD   ' LCD bağlantılarını tanımla
Define  LCD_DBIT	    4
Define  LCD_RSREG      PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG       PORTE
Define  LCD_EBIT      	1

        ADCON1 = 7 		' PORTA ve  E dijital giriş çıkış olarak ayarla
        Low PORTE.2		' LCD R/W low = yazma modu
        Pause 300   	' LCD başlamak için bekle

option_reg=0        'PORTB Pulluplar etkin.
                    '(Pullup=Portb' nin tüm uçlarını +5V a çekmektir.lojik 1)

TRISB=%11110000     'PORTB 7654 giriş 3210 çıkış olarak ayarlandı
TRISC=%00000000     'PORTC Tüm uçlar çıkış olarak ayarlandı

portb=0:portc=0      'PORTB ve PORTC yi 0 yap

lcdout $FE,1        'LCD ekranı sil
lcdout $FE,2,"LCD-KEYPAD uyg."

' ***************DEĞİŞKEN Tanımlama Blokları ****************
SW1  var byte
SW2  var byte
SW3  var byte
SW4  var byte
SW5  var byte
SW6  var byte
SW7  var byte
SW8  var byte
SW9  var byte
SW10 var byte
SW11 var byte
SW12 var byte
SW13 var byte
SW14 var byte
SW15 var byte
SW16 var byte

gosub degisken0
'**********************  Ana Program ************************
anadongu:
'*******  1.satır taraması ******
portb=%11111110
' portb.0 a 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.
if portb.4=0 then SW1=1
if portb.5=0 then SW2=1
if portb.6=0 then SW3=1
if portb.7=0 then SW4=1
 
'*******  2.satır taraması ******
portb=%11111101
' portb.1 e 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.

if portb.4=0 then SW5=1
if portb.5=0 then SW6=1
if portb.6=0 then SW7=1
if portb.7=0 then SW8=1

'*******  3.satır taraması ******
portb=%11111011
' portb.2 ye 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.

if portb.4=0 then SW9=1
if portb.5=0 then SW10=1
if portb.6=0 then SW11=1
if portb.7=0 then SW12=1

'*******  4.satır taraması ******
portb=%11110111
' portb.3 e 0 değeri verilerek 1.satır taraması gerçekleştirilir
' buna göre portb.4,5,6,7 deki durum gözlenir.
' Eğer bu butonlardan birine basıldıysa ilgili buton değişkeni 1 yapılır.

if portb.4=0 then SW13=1
if portb.5=0 then SW14=1
if portb.6=0 then SW15=1
if portb.7=0 then SW16=1
gosub lcdgoster
gosub degisken0

goto anadongu
'****************** Değişken ilk değerleri ****************
degisken0:
SW1=0:SW2=0:SW3=0:SW4=0:SW5=0:SW6=0:SW7=0:SW8=0:SW9=0
SW10=0:SW11=0:SW12=0:SW13=0:SW14=0:SW15=0:SW16=0

return

'******* Buton değerlerini LCD ekranda gösterim ************
lcdgoster:
if SW1=1 then lcdout $FE,$C0,"1 nolu buton...":portc.0=1   'portc.0 portuna bağlı ledi yakar
if SW2=1 then lcdout $FE,$C0,"2 nolu buton...":portc.1=1   'portc.1 portuna bağlı ledi yakar
if SW3=1 then lcdout $FE,$C0,"3 nolu buton...":portc.2=1   'portc.2 portuna bağlı ledi yakar
if SW4=1 then lcdout $FE,$C0,"4 nolu buton...":portc.3=1   'portc.3 portuna bağlı ledi yakar
if SW5=1 then lcdout $FE,$C0,"5 nolu buton...":portc.4=1   'portc.4 portuna bağlı ledi yakar
if SW6=1 then lcdout $FE,$C0,"6 nolu buton...":portc.5=1   'portc.5 portuna bağlı ledi yakar
if SW7=1 then lcdout $FE,$C0,"7 nolu buton...":portc.6=1   'portc.6 portuna bağlı ledi yakar
if SW8=1 then lcdout $FE,$C0,"8 nolu buton...":portc.7=1   'portc.7 portuna bağlı ledi yakar
if SW9=1 then lcdout $FE,$C0,"9 nolu buton...":portc.0=0   'portc.0 portuna bağlı ledi söndürür
if SW10=1 then lcdout $FE,$C0,"10 nolu buton...":portc.1=0 'portc.1 portuna bağlı ledi söndürür
if SW11=1 then lcdout $FE,$C0,"11 nolu buton...":portc.2=0 'portc.2 portuna bağlı ledi söndürür
if SW12=1 then lcdout $FE,$C0,"12 nolu buton...":portc.3=0 'portc.3 portuna bağlı ledi söndürür
if SW13=1 then lcdout $FE,$C0,"13 nolu buton...":portc.4=0 'portc.4 portuna bağlı ledi söndürür
if SW14=1 then lcdout $FE,$C0,"14 nolu buton...":portc.5=0 'portc.5 portuna bağlı ledi söndürür
if SW15=1 then lcdout $FE,$C0,"15 nolu buton...":portc.6=0 'portc.6 portuna bağlı ledi söndürür
if SW16=1 then lcdout $FE,$C0,"16 nolu buton...":portc.7=0 'portc.7 portuna bağlı ledi söndürür


return

end 
  • ahmet dara

    iyi akşamlar, benim sorum şu yönde, 4×4 keypad’den lcd ekrana microC kullanarak, rakamları ve A B C D’yi yazdırabildim. Ama benim yapmak istediğim, cep telefonu keypad’i gibi, yani 2’ye bir kere basıldığında B’yi, 1 saniye içinde tekrar basıldığında C’yi vericek. Bunla ilgili yardımcı olabilir misiniz? teşekkürler

  • dojan_allstar

    sanırım şöyle bir kod kullanabilirsiniz ( Microcode studio + picbasic pro kullandım):

    '***************************************************
    '*  Name    : UNTITLED.BAS                                      *
    '*  Author  : [select VIEW...EDITOR OPTIONS]                    *
    '*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
    '*          : All Rights Reserved                               *
    '*  Date    : 19.05.2010                                        *
    '*  Version : 1.0                                               *
    '*  Notes   :                                                   *
    '*          :                                                   *
    '****************************************************
    
    '****************************************************
    ' LCD İLE MULTİPUSH BUTON KULLANIMI #1
    ' 
    ' 19.05.2010 -  by dojan_allstar
    ' pic 16f628a mcu kullanılmıştır. 
    '
    ' ****************************************************
    
    
    
    trisa=%00000000    ' a portunun hepsi çıkış 
    trisb=%00001111    ' b portunda 0 1 2 3 pinleri giriş gerisi çıkış
    
    define LCD_DREG PORTA     ' data portları nerede
    define LCD_DBIT 0         ' data pinleri kaç numaradan başlıyor
    define LCD_RSREG PORTA    ' reset pini nerde
    define LCD_RSBIT 4        ' reset pini kaç numaraya bağlı
    define LCD_EREG PORTA     ' enable pini nerde
    define LCD_EBIT 6         ' enable pini kaç numaraya bağlı
    define LCD_BITS 4         ' lcd haberleşme için kaç bit kullanacak
    define LCD_LINES 2 
    
    OPTION_REG.7=0   ' pull up dirençleri aktifleştir
    CMCON=7
    
    @ device pic16f628a
    @ device pic16f628a, wdt_off
    @ device pic16f628a, pwrt_on
    @ device pic16f628a, protect_off
    @ device pic16f628a, mclr_off
    @ device pic16F628a, INTRC_OSC_NOCLKOUT
    
    symbol tus1 = PORTB.0
    symbol tus2 = PORTB.1
    symbol tus3 = PORTB.2
    ' diğer tuşları yazmadım siz isterseniz yazabilirsiniz.
    
    ' Aşağıda pin diyagramını çizmeye çalıştım:
    '   PIC bacakları
    '      B0     -------o--------/\/\/\/\-----/¯ .-------o-----|ı (gnd)
    '      B1     -------o--------/\/\/\/\-----/¯ .-------o-----|ı (gnd)
    '      B2     -------o--------/\/\/\/\-----/¯ .-------o-----|ı (gnd)
    '      B3     -------o--------/\/\/\/\-----/¯ .-------o-----|ı (gnd)
    
    ' üstte pinlere bağlı pulluplar ve butonlar görülmekte
    
    pause 200
    lcdout $fe,1 ' lcd temizle
    
    giris:
    'PORTB = $FF 
    ' ....
    if tus1 = 0 then
    pause 20    ' tus basma aralığı
    if tus1 = 0 then
    pause 20
    if tus1 = 0 then
    lcdout $fe,$80,"3 kere basildi."
    pause 10
    goto tmm
    endif
    lcdout $fe,$80,"2.kere basildi."
    pause 10
    goto tmm
    endif
    lcdout $fe,$80,"1 kere basildi."
    pause 10
    goto tmm
    endif
    pause 25
    tmm: 
    goto giris
    end
    '......
    ' devamını getirirsiniz artık.
    

    kodu proteusta denedim en sağdaki butonu kullandım(pic’e en yakın olan buton, üstünde D port yazıyor):

    resim :

    umarım yardımcı olmuşumdur…

  • Erkan AVCI

    Merhabalar. ben bu projeyi yapmak istiyorum fakat bana devre elemanlarının ve baskı devresini verebilir misiniz? saygılarımla.

  • tolga danışman

    iyi akşamlar öncelikle paylaşımınız için teşekkürler ben sizin yaptığınıza benzer fakat 4 butonlu 4 ledli herbir butona bastığımızda ilgili led yanacak şekilde ve lcd ekranın 1. satırında hangi led in yandığı bilgisini gösterecek şekilde bu işlemi yaptım yazdığınız programı ve proteus görselini değiştirerek.buna ek olarak her bir butona bastığımızda voltaj değerini basılan butondaki voltaj değerini pic16f877 deki herhangi bir adc yi kullanarak ekranda lcd nin 2. satırında bu voltaj değerini göstermem lazım ve aynı zamanda da yine bir adc daha kullanarak bu voltaj değerini DAC çıkışında okumam lazım bu konuda bana yardımcı olabilirmisiniz
    şimdiden eşekkür ederim…
    saygılarımla