Elektronik / Mikrodenetleyici Projeleri/

PIC 16F877 Tuş takımı ile 2X16 lcd‘ye karakter girişi

Sponsorlu Bağlantılar

Devrenin Çlışması

LCD : Programda çıkış olarak B Portu çıkış olarak kullanılmaktadır. Bu port LCD’nin D0-D7 data bağlantı uçlarına bağlanır. Aynı zamanda LCD’nin E ve RS bitleri (LCD’yi aktif yapma ve Data/ komut okuma seçenekleri) PIC’in D0 ve D1 bitleri ile kontrol edilir.

Devrede kullanılan LCD’miz 2*16’lıktır. Yani LCD’miz 2 satır ve 16 sütundan oluşmaktadır. LCD çıkışlarından 15-16. bacaklar kullanılmamaktadır. Çünkü 15 ve 16. bacaklar LCD’nin ışığının yanması için kullanılır. LCD’miz ışıklı olmadığı için de bu bacakları kullanmamıza gerek yoktur.

LCD’nin sadece 1. satırına bilgi yazımı gerçekleşmektedir, 2. satır kullanılmamaktadır. 16 karakter girişi gerçekleştikten sonra LCD ekranı temizlenir, yani reset atılmış olur ve kursör 1. satırın 1. sütununda yanıp sönmeye başlar. Devredeki reset butonuna basıldığında da ekran tazelenir, yani temizlenir ve kursör yine 1. satır 1. sütuna gider. Parlaklık ayarı 1., 2., 3. bitlerin uçlarının pot aracılığı ile kontrolüyle sağlanır. Aslında V0 geriliminin pot ile kontrolü ile gerçekleşir.

Lcd Yazı Yazdırma 1 (assembly) Dosyalar tus-takimi-lcd-yazi-yazdirma-assembly Emeği geçen Kişilere Teşekkürler

Devre şema ve Pcb çizimleri
2x16lcd-yazdirma-devresi lcd-yazdirma-pcb lcd-yazdirma-pcb-ust

2x16-lcd

Klavye : Devre 4*4 tuş takımıyla yani 16 harfle 2*16’lık LCD ekrana bilgi yazdırma işlemini yapıyor. Tuş takımında 16 harf olduğu için sadece bu harflerle bilgi yazımı gerçekleşmektedir (A-Q harfleri arası). Klavyeden PIC’in C Portu ile giriş alınır. C1-C3 bitleri klavyenin Y1-Y4 satır ve C4-C7 bitleri de klavyenin X1-X4 sütun çıkışlarına bağlıdır.

4x4-tus-takimi-klavye

PIC’imiz ve Kristal Osilatörümüz 4MHz’liktir. PIC’in 1. bacağından 10K ve 100K dirençler ve anahtar aracılığıyla çevresel kesme yani reset alınır. Baskı devrenin şeklinden de görüleceği üzere; plaket üzerinde LCD için 16’lık ve Klavye içinde 8’lik dişi konnektör kullanılmıştır. Bu elemanlarla direk bu konnektörler aracılığı ile bağlantı gerçekleştirilir.

Aynı zamanda 8 tane 33K’lık Pull-Down dirençleri kullanılmıştır. Bunlar klavyeden bir tuşa basıldığında LCD’de kararlı görüntü alabilmeyi yani kararlı girişler alabilmeyi sağlar yani; tuş basımlarında oluşabilecek manyetik ve mekanik kararsızlıkları şaseye vererek sistemin kararlılığını artırır.

İsis Devre Şeması
picbasic-2x16-lcd-yazdirma-pic16f877

Projenin Çalışması : 4*4 Tuş takımı ile LCD ye PIC yardımıyla karekter girişi yapıyor. Devrede tuş takımı bulamadığımız için 16 tane butonla 4*4 lük bir kombinasyon yaptık . bunun dışında devrede bir reset düğmesi ve LCD nin netlik ayarının yapılabildiği bir ayarlı direnc bulunuyor.

Her bir buton alfabeden üç karekteri barındırıyor en alttada iki yöne hareketi sağlayan iki buton bulunuyor,Programı yazmak için PIC BASIC PRO kullanılmıştır. Programın çalışıp çalışmadığını denetlemek için programı anime edebilen ISIS programı kullanılmıştır

Hazırlayanlar : Güngör Köprücü ,Mehmet Ayaz Lcd Yazı Yazdırma 2 (picbasic pro) Dosyalar PIC 16F877 Tuş takımı ile 2X16 lcd‘ye karakter girişi

Dosya indirme LINK listesi (HTML formatında) link-4272.zip şifre-pass: 320volt.com
Emeği geçen Kişilere Teşekkürler

Picbasic pro .bas yazılımı

INCLUDE "modedefs.bas"          ' Include serial modes
' LCD İletişimi tanımlanıyor
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTE
Define  LCD_EBIT        1
define ADC_SAMPLEUS 50

'Program değişkenleri tanımlanıyor
adsonuc var byte
col       var byte            ' Tuş takımı sütunu
row       var byte            ' Tuş takımı satırı
sonuc     var byte            ' Tuş Değeri
satir1 var byte[17] 'LCD'deki birinci satır
satir2 var byte[17] 'LCD'deki ikinci satır
satirno var byte 'aktif satır
artir     var byte 'aktif sutun

karakter_no var byte 'tuşta kayıtlı kullanılacak karakter numarası
aktif_karakter var byte 'kullanılan tuş 1-10
k var byte


tus1 var byte[3]
tus2 var byte[3]
tus3 var byte[3]
tus4 var byte[3]
tus5 var byte[3]
tus6 var byte[3]
tus7 var byte[3]
tus8 var byte[3]
tus9 var byte[3]
tus10 var byte[3]
karakter_no=0
aktif_karakter=1
satirno=1
artir=1
tus1[0]="A"
tus1[1]="B"
tus1[2]="C"
tus2[0]="D"
tus2[1]="E"
tus2[2]="F"
tus3[0]="G"
tus3[1]="H"
tus3[2]="I"
tus4[0]="J"
tus4[1]="K"
tus4[2]="L"
tus5[0]="M"
tus5[1]="N"
tus5[2]="O"
tus6[0]="P"
tus6[1]="Q"
tus6[2]="R"
tus7[0]="S"
tus7[1]="T"
tus7[2]="U"
tus8[0]="V"
tus8[1]="W"
tus8[2]="X"
tus9[0]="Y"
tus9[1]="Z"
tus9[2]=" "
for k=1 to 16
satir1[k]= " "
next
for k=1 to 16
satir2[k]= " "
next




'Değişkenler sıfırlanıyor


        OPTION_REG.7 = 0        ' Enable PORTB pullups
        ADCON1 = 7              ' Porta ve porte dijital yapılıyor
        Low PORTE.2             ' LCD R/W low (write)
        Pause 100               ' LCD yi başlatmak için bir süre bekleniyor
'Açılış mesajı gönderilecek
trisc =%11110000 
ADCON1 = %00000100
'Eeproma ilk şifre kaydediliyor
'*****************************ANA PROGRAM*****************************
        Lcdout $fe, 1, "Micro Islemciler"  ' Satır 1
        Lcdout $fe, $C0, "    Projesi"
        pause(1000)
'        lcdout $FE, $0E
loop:  
 Gosub getkey            'Tuş takımından değer alınacak

' satir2 = "F"
' lcdout $fe,1,"Sifreyi Girin" 
' Lcdout $fe, $c0, satir2
' pause 10
  
 Goto loop               'Döngüye devam
'****************************ANA PROGRAM SONU*************************


' ******************************** Tuş takımından değer okuyan alt program *************************
getkey:

        Pause 50                ' Bekle

getkeyu:
        ' Wait for all keys up
        PORTB = 0               'PortB nin bütün çıkış pinleri lojik 0 
        TRISB = $f0             ' 4 pin çıkış ve 4 pin giriş yapılıyor
        If ((PORTB >> 4) != $f) Then getkeyu    ' eğer herhangi bir tuşa basılmış ise

        Pause 50                ' Bekle

getkeyp:
        ' tuşa basılana kadar bekle
        For col = 0 to 3        ' 4 columns in keypad
                PORTB = 0       ' PortB sıfırlanıyor
                TRISB = (dcd col) ^ $ff ' Set one column pin to output 
'dcd col trisb nin coluncu basamağını 1 yapar. 0.1.2. gibi
                row = PORTB >> 4        ' Satır oku
                If row != $f Then gotkey        ' If any keydown, exit
        Next col
pause 50
'diğer buttonların sonu

        Goto getkeyp            ' No keys down, go look again

gotkey: ' karekter çagir
	
	
        sonuc = (col * 4) + (ncd (row ^ $f))-1	'Gelen binary değeri  hex çeviriyormuş.	 
	
'artir =artir +1			
if artir > 16 then
if satirno=1 then
satirno=2
endif
if satirno=2 then
satirno=1
endif
artir=1
endif 'Arrtir
	goto kaydir

son: 

        Return                  '******** Alt program sonu ************

' Alınan Karakterlerin LCD üzerinde gösterim şekli seçiliyor
'******************************** Tuş takımından değer okuyan alt program sonu ********************
kaydir:

'**Ekrana yazma işlemleri burada yapılacak

'adsonuc var byte
'col       var byte            ' Tuş takımı sütunu
'row       var byte            ' Tuş takımı satırı
'sonuc     var byte            ' Tuş Değeri
'satir1 var byte[16] 'LCD'deki birinci satır
'satir2 var byte[16] 'LCD'deki ikinci satır
'satirno var byte 'aktif satır
'artir     var byte 'aktif sutun

'karakter_no var byte 'tuşta kayıtlı kullanılacak karakter numarası
'aktif_karakter var byte 'kullanılan tuş 1-10
'k var byte


'adsonuc var byte
'col       var byte            ' Tuş takımı sütunu
'row       var byte            ' Tuş takımı satırı
'sonuc     var byte            ' Tuş Değeri
'satir1 var byte[16] 'LCD'deki birinci satır
'satir2 var byte[16] 'LCD'deki ikinci satır
'satirno var byte 'aktif satır
'artir     var byte 'aktif sutun

'karakter_no var byte 'tuşta kayıtlı kullanılacak karakter numarası
'aktif_karakter var byte 'kullanılan tuş 1-10
'k var byte

if sonuc =%00000000 then '1. Tuş

if aktif_karakter<>1 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 1
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus1[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus1[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc

if sonuc =%00000001 then '2. Tuş
if aktif_karakter<>2 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 2
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus2[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus2[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc



if sonuc =%00000010 then '3. Tuş
if aktif_karakter<>3 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 3
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus3[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus3[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc

'Kendime Not : Başlangıca ilk karakter koymayı unutma

if sonuc =%00000011 then '4. Tuş
if aktif_karakter<>4 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 4
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus4[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus4[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc



if sonuc =%00000100 then '5. Tuş
if aktif_karakter<>5 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 5
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus5[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus5[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc



if sonuc =%00000101 then '6. Tuş
if aktif_karakter<>6 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 6
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus6[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus6[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc



if sonuc =%00000110 then '7. Tuş
if aktif_karakter<>7 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 7
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus7[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus7[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc



if sonuc =%00000111 then '8. Tuş
if aktif_karakter<>8 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 8
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus8[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus8[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc



if sonuc =%00001000 then '9. Tuş
if aktif_karakter<>9 then 'aktif karakter bu değilse karakter no sıfırlanacak
aktif_karakter = 9
karakter_no=0
endif 'if aktif_karakter

if satirno=1 then 
satir1[artir]=tus9[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 1 ise

if satirno=2 then 
satir2[artir]=tus9[karakter_no]
karakter_no=karakter_no+1
endif 'satir no 2 ise

if karakter_no>2 then
karakter_no=0
endif 'karakter_no

endif 'if sonuc
'1001 '9
'1010 'A
'1011 'B
'1100 'C 'GERİ
'1101 'D 'ÜST SATIR
'1110 'E 'ALT SATIR
'1111 'F 'İLERİ
if sonuc =%00001100 then 'C. Tuş
artir=artir-1
if artir<1 then 
if  satirno =1 then 
satirno=2
artir=16
endif
if satirno =2 then
satirno=1
artir=16
endif
endif 'artir<1
ENDIF 'GERİ

 if sonuc =%00001111 then 'F. Tuş
artir=artir+1
if artir>16 then 
if  satirno =1 then 
satirno=2
artir=1
endif
if satirno =2 then
satirno=1
artir=1
endif
endif 'artir<1
ENDIF 'GERİ


        Lcdout $fe, 1, satir1[1],satir1[2],satir1[3],satir1[4],satir1[5],satir1[6],satir1[7],satir1[8],satir1[9],satir1[10],satir1[11],satir1[12],satir1[13],satir1[14],satir1[15],satir1[16]
        Lcdout $fe, $C0,satir2[1],satir2[2],satir2[3],satir2[4],satir2[5],satir2[6],satir2[7],satir2[8],satir2[9],satir2[10],satir2[11],satir2[12],satir2[13],satir2[14],satir2[15],satir2[16]
pause 50

goto son
end
  • Ahmet Oflazlar

    2×14 lcd ekran satan bir yer varmı? ahmet@konyaofset.com olduğunu düşündüğünüz bir yer varsa mail atarsanız sevinirim

  • erenet

    arkadaşım tuştakımının da varsa pcb sini verirmisin çok zor bulunuyor hazırları ,izmitte

  • mert

    İyi günler,öncelikle emeğinize sağlık üstad.Bilgileriniz çok değerli ve paylaşmaktan çekinmiyorsunuz. Rica etsem benimle irtibata geçer misiniz ? 10 gün içinde teslim etmem gereken bir proje var.Yardımcı olursanız çok sevinirim. Şimdiden teşekkürler …. mert-yilmaz11@hotmail.com