Hi-Tech Eğitim Bölüm9 (Karakter LCD display sürmek)

Başlatan arslan74, 06 Şubat 2008, 06:44:41

arslan74

Merhaba arkadaşlar,

bundan önceki dersimizde timer0 kullanımı anlatmıştım. birde TMR0 kesmesine güzel bir örnek vermiştim.

Şimdi konu anlatma mı ilerleteceğim için, bacak sayısı fazla olan başka bir PIC'e gececeğim. En yaygın olan 16F877 gececeğim. Devre şemasını yeniden cizmeyeceğim. Proteus ISIS simülasyonunda "PICDEM2+ with PIC16F877.DSN" projesi var. Hata içinde örnek kodlarda mevcud ancak ASM kodları şeklinde. Klasörü aşağıda ki yerde

Alıntı YapC:\Program Files\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM MPLAB Viewer\Eval Boards\PICDEM2+ with PIC16F877\

Anlatmayı artık bu devre üzerinden yapacağım. Cünkü bir cok devre üzerinde yerleştirilmiştir. LCD, USART, I2C, PWM gibi bir cok uygulamayı yapabileceğiz.

Şimdi de Hi-Tech örnek kod yazmaya gecelim.
Alıntı Yap"C:\HT-PIC\samples\lcd\"
klasöründe örnek lcd programını var ancak bacak bağlatıları buna göre yapılmamış. Yeni versiyon doğrudan bu portlar için LCD programını yazmışlar.
Alıntı Yap"C:\Program Files\HI-TECH Software\PICC\STD\9.60\samples\picdem2\"
burdan projemizin içinde kopyalayım.

Yeni bir proje acalım ve işlemci olarak 16F877 secelim.

Sonra ana programın kodu oluşturalım, ama bu sefer başlık dosyasınıda oluşturalım. Biraz profesyonel proje görünümü alsın.

Şimdi projemizin görünümü aşağıdaki şekilde oldu. CRTL+F10 derliyelim.




Şimdi de Simulasyonu çalıştıralım.



Görüldüğü gibi basit bir şekilde ekrana gidiğimiz yazıyı yazabiliyoruz.

Şimdi biraz LCD fonksiyonlarını inceleyelim. Asıl işi yapan fonksiyonlar

void lcd_cmd(unsigned char);
void lcd_data(unsigned char);
void lcd_puts(const char * s);
void lcd_init(unsigned char);


Bu dört fonksiyon dur.

void lcd_init(unsigned char);


Bu fonksiyon LCD ön ayaralarını yapiyor. LCD dorudan çalışmiyor. Önce onu uygun şeklide ayarlamak gerekiyor. En başka açılışta 8bit olarak acılıyor. Onun için çalışmasını 4 bit moda gecirmemiz gerekiyor. Ayrıca lcd_init fonksiyonun içinde söyle bir kod eklemişler.

lcd_cmd(0xF); //Display On, Cursor On, Cursor Blink


Buyüzden kursörün nerede kaldığı gösteriyor ve ayrıca flash yapiyor.

bunu istemez iseniz.

lcd_cmd(0b00001100); // display on, cursor off, blink off


Bu şekilde yazarsanız cursor gözükmez.

Ayrıca bu fonksiyonları kullanarak bazı hazır kalıblar hazırlamışlar.

#define lcd_cursor(x)		lcd_cmd(((x)&0x7F)|0x80)
#define lcd_clear()			lcd_cmd(0x1)
#define lcd_putch(x)			lcd_data(x)
#define lcd_goto(x)			lcd_cmd(0x80+(x));
#define lcd_cursor_right()		lcd_cmd(0x14)
#define lcd_cursor_left()		lcd_cmd(0x10)
#define lcd_display_shift()		lcd_cmd(0x1C)
#define lcd_home()			lcd_cmd(0x2)
#define lcd_home2()			lcd_cmd(0xC0)


lcd_clear()


Ekranı temizler Dos da CLS komutu gibi düşünün.

lcd_home()


Kursörü ilk satırda ki ekranın en başına getiriyor.

lcd_home2()

Kursörü ikinci satırda ki ekranın en başına getiriyor.


lcd_goto();

İse ekranda istediğimiz satırın istediğimiz sütününa gidebiliyoruz. Ancak bu kod anlaşılması biraz zor. Cünkü bu ekran chipi 80 karakter göstermesine göre ayarlanmıştır. En fazla 80 karekter gösterebilir. Piyasada yüzden en büyük ekranlar 4x20 veya 2x40 şeklinde satılıyor. piyasada satılan 4x40 LCD sizi yanıltmasın onların içinde iki tane birbirinden bağımsız farklı sürücüler var.

Bu devrede 2x16 ekran kullanılmış olmasına rağmen sürücü yine aynı o yüzden ikinci satırın adresini 80 karektere göre ayarlamışlar.

Bu ksım biraz karışık olduğu için bu o kısma kendimde bazı eklemeler yaprak işi kolaylaştırdım.

"LCD.H" içinde bunları eklerseniz işiniz cok kolaylaşacaktır.

//----------------------------------

#define	S1_1	   		0x00 
#define	S1_2	   		0x01 
#define	S1_3	   		0x02 
#define	S1_4	   		0x03 
#define	S1_5	   		0x04 
#define	S1_6	   		0x05 
#define	S1_7	   		0x06 
#define	S1_8	   		0x07 
#define	S1_9	   		0x08 
#define	S1_10	   		0x09 
#define	S1_11	   		0x0A 
#define	S1_12	   		0x0B 
#define	S1_13	   		0x0C 
#define	S1_14	   		0x0D 
#define	S1_15	   		0x0E 
#define	S1_16	   		0x0F 
#define	S1_17	   		0x10 
#define	S1_18	   		0x11 
#define	S1_19	   		0x12 
#define	S1_20	   		0x13 

//----------------------------------

#define	S2_1	   		0x40 
#define	S2_2	   		0x41 
#define	S2_3	   		0x42 
#define	S2_4	   		0x43 
#define	S2_5	   		0x44 
#define	S2_6	   		0x45 
#define	S2_7	   		0x46 
#define	S2_8	   		0x47 
#define	S2_9	   		0x48 
#define	S2_10	   		0x49 
#define	S2_11	   		0x4A 
#define	S2_12	   		0x4B 
#define	S2_13	   		0x4C 
#define	S2_14	   		0x4D 
#define	S2_15	   		0x4E 
#define	S2_16	   		0x4F 
#define	S2_17	   		0x50 
#define	S2_18	   		0x51 
#define	S2_19	   		0x52 
#define	S2_20	   		0x53 

//----------------------------------

#define	S3_1	   		0x14 
#define	S3_2	   		0x15 
#define	S3_3	   		0x16 
#define	S3_4	   		0x17 
#define	S3_5	   		0x18 
#define	S3_6	   		0x19 
#define	S3_7	   		0x1A 
#define	S3_8	   		0x1B 
#define	S3_9	   		0x1C 
#define	S3_10	   		0x1D 
#define	S3_11	   		0x1E 
#define	S3_12	   		0x1F 
#define	S3_13	   		0x20 
#define	S3_14	   		0x21 
#define	S3_15	   		0x22 
#define	S3_16	   		0x23 
#define	S3_17	   		0x24 
#define	S3_18	   		0x25 
#define	S3_19	   		0x26 
#define	S3_20	   		0x27 

//----------------------------------

#define	S4_1	   		0x54 
#define	S4_2	   		0x55 
#define	S4_3	   		0x56 
#define	S4_4	   		0x57 
#define	S4_5	   		0x58 
#define	S4_6	   		0x59 
#define	S4_7	   		0x5A 
#define	S4_8	   		0x5B 
#define	S4_9	   		0x5C 
#define	S4_10	   		0x5D 
#define	S4_11	   		0x5E 
#define	S4_12	   		0x5F 
#define	S4_13	   		0x60 
#define	S4_14	   		0x61 
#define	S4_15	   		0x62 
#define	S4_16	   		0x63 
#define	S4_17	   		0x64 
#define	S4_18	   		0x65 
#define	S4_19	   		0x66 
#define	S4_20	   		0x67


Şimdi şöyle örnek bir kod yazdığımızda.



ekrana görüntüsü bu şeklide oldu.



Bu işlem ilerde işimizi cok kolaylaştıracak. istediğimiz yere gidip bilgi yazabilieceğiz.

Bu günlük bu kadar. Ancak konu anlatımını bitirmedim, LCD konu anlatımına bu başlık altında daha devam edeceğim.

Projenin örnek kodları aşağıda ki linkte dir.

http://www.4shared.com/file/36988316/9c50a867/Blm9.html?dirPwdVerified=5a7b6e3a

Selamlar

erkan614

hocam 16f877nin c için kod hahfızası küçük
sizden ricam 18f452 ile çalışırsak daha verimli olur bence hem çoğu arkadaş da 18f serisine geçmeye başlar

salih18200

Sıra onada gelir inşallah dört gözle takip ediyoruz... 8O

arslan74

Alıntı yapılan: "erkan614"hocam 16f877nin c için kod hahfızası küçük
sizden ricam 18f452 ile çalışırsak daha verimli olur bence hem çoğu arkadaş da 18f serisine geçmeye başlar

16F877 8Kb hafızaya sahib. Bu 8Kb dolurmak için bayağı büyük bir kod yazmak gerek. Ben bircok büyük gözüken uygulamayı 877 ile helletim. Burada onemli olan konu PIC'in sahib olduğu sistemi verimli kullanabilmektir.

877 in tek kotü yani RAM hafızası fazla değil. En kötüsü RAM 4 banka bölümüş durumda. RAM de uzun dizi tanımlamak gerektiğinde yetmiyor.


Ayrıca 18F452 için giriş seviyesinde eğitim dökümanı hazırlamıştım ondan başlayabilirsiniz.

http://www.4shared.com/file/36352185/e1a99149/Hi-Tech_PICC18_Egitim.html

Sonra bu yazdığım kodları cok rahat PIC18 adapte edebilirsiniz.

Sonucta ben size C kodu yaziyorum. Mümkün olduğunda Ansi-C standartlarına uygun olanı tercih ediyorum ki programın taşınabilinirliği kolay olsun.

Selamlar

Seferi

Hocam linkler çalışmıyor. Yenileyebilir misin?

a.zorba

Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.