I2C LCD kullanımı

Başlatan alien876, 18 Temmuz 2017, 21:17:15

ete

Pepe nin verdiği şemaya bakarsanız seri bilgiyi paralel bilgiye çevirip LCD ye veriyor.
Bu mantık aslında Onur'un verdiği kod örneğinde de kullanılmış. Bu durumda bütün yapılacak iş Onur2un verdiği kütüphaneyi ve Pepe nin verdiği şemayı kullanarak bu işi başarmak. Zor değil sanırım. Buradaki temel mantık LCD registerlerini bırakıp işi Basic komutları ile çözmek.
Bu şekilde proje yapılabilir hale geliyor.

Vakit bulursam üzerinde bende çalışmak istiyorum.

Ete

Pepe

Proteus'ta simülasyonlu Proton'da iki ekranlı örnek

cemilsivas

Hocam sanırım olayı anladım. Eğer kontrol etme imkanınız varsa göz atarsanız sevinirim. Biz önce elimizdeki metni karakterlere bölmemiz lazım. Sonra o karakterleri ilk 4 ve son 4 bit olarak ayırıp o şekilde göndermemiz gerekiyor. Benim önceki mesajda gönderme prosedürünü anlamadığım yerin çözümü böyle. Şimdi birinci satır ve ikinci satır olayını çözmem gerekiyor.

onurinci

ilgili adresten dosyaları sağlıklı bir şekilde almayı başardım. derlemeyi başaramdım. İnclude dosyasındaki bazı satırlara kusur buluyor. benim donanım Win10 , belkide eski derleyici içindir. birde tüm yönergeler PCF8574 için bağlantı falan izah edilmiş. ilgili bir simulasyon dosyasıda ekledim.fakat sanki I2C address 7FF demiş, oysa bu PCF8574A versiyonu içindi..

onurinci

Merhum Darrel'in dosyası güzel çalışıyor.

istinaf duvarı

#20
Alıntı yapılan: onurinci - 19 Aralık 2024, 01:43:18Merhum Darrel'in dosyası güzel çalışıyor.
Ama bağlantı sırası hazır modüllerden farklı, piyasadaki I2C LCD modülleri ile çalışmaz. Hazır modüllerde pin çıkışları şu şekildedir:
P0 = RS
P1 = RW
P2 = E
P3 = Backlight
P4 = D4
P5 = D5
P6 = D6
P7 = D7

Bu eki görüntüleyemezsiniz.

ete

İnclude dosyası düzenlenerek hazır modüller ile çalışabilir.
Ete

ete

#22
Hazır modül bağlantı uçları doğru ise bütün dosyaları hazır modüle göre yeniden düzenledim.
Bu arada asıl programda çalışmayan özel karekterleride çalışır hale getirdim.
İlişiktedir.

Ete

onurinci

hocam eliniz değmişken , birde PCF8574A versiyonu uygularsanız seviniriz..

ete

#24
PCF8574 ile PCF8574A arasındaki yegane fark Device Address leri.
PCF8574 Cihaz adresi $40
PCF8574A Cihaz adresi $70
bu verdiğim adresler A0-A1-A2 pinlerinin hepsinin GND ye (LOW) bağlı olmaları durumunda geçerlidir.
Ben bir deneme yapayım sorun çıkmaz ise buraya dosyayı koyarım. Yalnızca İnclude dosyası değişecek.

Ete

not: Include dosyası değil de ana program dosyasında yer alan;
LCD_Addr    CON $40           ; A0, A1, A2 tied to ground
değişecek.
LCD_Addr    CON $70           ; şeklinde.


onurinci

evet değiştirdim oldu hocam , teşekkürler..

cemilsivas

İyi akşamlar hocam. Gönderdiğiniz kodlar pbp3 için mi? Bende pbp2.61 var kodlar hata veriyor.
Bir de hocam benim gönderdiğim kodda verileri tek tek göndermek için lookup2 kullanıyorum. Eğer
FOR sayi = 0 TO 5 
  LOOKUP2 sayi,["hello!"],LCD_data 
 gosub lcd_write_
 pauseus 50
NEXT sayi 
şeklinde yazarsam ekrana hello! yazısı geliyor. Ama hello yerine kendi belirlediğim değişkeni yazmaya kalkarsam  karakter yerine yatay çizgiler çıkıyor. Değişkenden olabilir mi dedim değişken tiplerini değiştirdim yine sonuç alamadım. Lookup kodu değişkeni desteklemediğinden mi ekrana görüntü basamıyorum?

onurinci

sayfada şöyle bir ifade vardı

Yazdığım kod PBP3 için yazılmıştı. PBP 2.60'ın parçası olmayan ARRAYREAD ve ARRAYWRITE talimatlarını PBP3'e ekledi. Bu nedenle 2.60 derleyicisi ARRAYWRITE talimatını işleyemiyor ve bu gördüğünüz derleyici hatasını üretiyor olabilir. ARRAYWRITE, bir diziyi karakterlerle doldurmak için kullanılır.

ete

@cemilsivas ,
Keşke o örnek verdiğin Hello yazdıran kod yerine çalışmayan karekter kodları ile yazılmış kod parçasını koysaydın da anlasaydık nasıl kullandığını. Belki kullanım şeklin hatalıdır.
Ne kullandığını hangi karekterleri yazdırmaya çalıştığını bilmeyince de ne üzerinde konsantre olacağımıda bilemedim.
Kod örnekleri PBP3.x derleyici için yazılmış durumda. 2.61 versiyonda bu komutların bazıları bulunmuyor sistem çalışmayabilir.

Ete

cemilsivas

@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
'DEFINE I2C_HOLD 1
DEFINE  OSC             4
DEFINE I2C_SLOW 1

OPTION_REG.7 = 0
SCL      VAR PORTB.1
SDA      var PORTB.0
W var word
LCD_Addr CON 78
'LCD_BuffSize    CON 30
'LCD_Buff        VAR BYTE[LCD_BuffSize]
'LCD_BuffAddr    CON EXT : @LCD_BuffAddr = _LCD_Buff
'LCD_BuffLen     VAR WORD        ; Length of data in buffer
LCD_Data        VAR WORD        ; Data to Send to LCD
LCD_Byte        VAR BYTE        ; Nibbles to Send
LCD_RS          VAR LCD_Byte.0  ; Register Select bit
LCD_RW          VAR LCD_Byte.1  ; Read/Write bit
LCD_E           VAR LCD_Byte.2  ; Enable bit
LCD_BackLight   VAR LCD_Byte.3  ; Backlight 0=ON
LCD_WriteMode   VAR BYTE        ; 1=LowNibble, 2=HighNibble, 3=Both
LCD_CommandMode VAR BIT         ; Indicates next byte is a command
LCD_Byte2       VAR BYTE        ; Same nibble without E bit
LCD_Idx         VAR BYTE
testmode        var byte
sayi            var byte
buffer          var byte

;----[Initialize the LCD]-------------------------------------------------------
PAUSE 250             ; LCD Power-on delay
LCD_Backlight = 1     ; Backlight OFF
LCD_RW = 0            ; Write to LCD
LCD_RS = 0            ; Command Register

LCD_WriteMode = 1     ;-- Low Nibbles only
LCD_Data = 3          ; Reset 3 times
gosub LCD_Write_
PAUSEUS 6000
gosub LCD_Write_
PAUSEUS 1000
gosub LCD_Write_
PAUSEUS 1000

LCD_Data = 2          ; Start 4-bit mode
gosub LCD_Write_
PAUSEUS 1000

LCD_WriteMode = 3     ;-- Both Nibbles
LCD_Data = $28
gosub LCD_Write_      ; Function Set, 4-bit, 2-line, 5x7

LCD_Data = $C0
gosub LCD_Write_      ; second line

LCD_Data = $0C
gosub LCD_Write_      ; Display ON
LCD_Data = $01
gosub LCD_Write_      ; Clear Screen
PAUSE 2
LCD_Data = $06 
gosub LCD_Write_      ; Entry Mode
                       
PAUSE 2               ; Let command finish
LCD_RS = 1   ' this is data
goto main

LCD_WRITE_:
   LCD_E = 1
   IF LCD_WriteMode.1 = 1 THEN                             ; Write High Nibble
     LCD_Byte = (LCD_Byte & $0F) | (LCD_Data  & $F0)
     LCD_Byte2 = LCD_Byte & $FB    
     I2CWRITE SDA,SCL, LCD_Addr,[LCD_Byte, LCD_Byte2]
   ENDIF
  
   IF LCD_WriteMode.0 = 1 THEN                             ; Write Low Nibble
     LCD_Byte = (LCD_Byte & $0F) | ((LCD_Data << 4 )& $F0)
     LCD_Byte2 = LCD_Byte & $FB
     I2CWRITE SDA,SCL, LCD_Addr,[LCD_Byte, LCD_Byte2]
   ENDIF
return

Main:
w=10

FOR sayi = 0 TO 9 
  LOOKUP2 sayi,[W],LCD_data 
 gosub lcd_write_
 pauseus 50
NEXT sayi 

lcd_rs=0
LCD_Data = $C0
gosub LCD_Write_ :pause 2     ; second line
lcd_rs=1

FOR sayi = 0 TO 5 
  LOOKUP2 sayi,[#w],LCD_data 
 gosub lcd_write_
 pauseus 50
NEXT sayi 
pause 500
lcd_rs=0
LCD_Data = $80
gosub LCD_Write_ :pause 2     ; second line
LCD_Data = $01
gosub LCD_Write_
lcd_rs=1

pause 500
stop

Aynen hocam. Bizimki de cahil acemiliği oldu. :-) Neyse kodlar bunlar hocam. Birinci ve ikinci satıra 10 sayısını yazdırmaya çalıştım. Ama hep çizgi geliyor ekran.

Powered by EzPortal