2x16 sorunsuz calışan lcd yazılımına basit örnekler.

Başlatan mrtclk0891, 22 Nisan 2009, 23:56:36

mrtclk0891

LIST P=16F72                  
   ERRORLEVEL  -302  
   include <p16f72.inc>   
   __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC &_BODEN_OFF  
CBLOCK   0X20
D5   
DEGERH   
DEGERL
DEGER3   
SAYI1   
SAYI2   
SAYI3   
SAYI4   
D1       
D2       
D3       
D4
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
D16
D17
D18
D19
D20
D21
;D22
D23
D25
D24
D26
D27
D1111       
LSB       
MSB       
TEMP   
BEKLEM   
TOPLA1   
TOPLA2   
TOPLA3
ENDC
;---------
   ORG   00H
   GOTO   START
;-------------
START
   CLRF   PORTA
   CLRF   PORTB
   CLRF   PORTC
  ;   CLRF   PORTD
   ;CLRF   DEGER
   CLRF   DEGERH
   CLRF   DEGERL
   CLRF   DEGER3
   CLRF   SAYI1
   CLRF   SAYI2
   CLRF   SAYI3
   CLRF   SAYI4
   CLRF   D1   
   CLRF   D2   
   CLRF   D3   
   CLRF   D4
   CLRF   LSB
   CLRF   MSB
   CLRF   TEMP
   CLRF   BEKLEM
   MOVLW   B'01000001'
   MOVWF   ADCON0
   BSF     STATUS,RP0
   MOVLW   B'11111111'
   MOVWF   TRISA    
   CLRF   TRISB      
   CLRF   TRISC
   ;CLRF   TRISD
   ;CLRF   TRISE         
   MOVLW   B'10001111'
   MOVWF   ADCON1   
   MOVLW   B'10000111'   
   MOVWF   OPTION_REG
   BCF     STATUS,RP0    
   CALL   TEMIZLE
   GOTO   MURAT
;______________________________________________   
;YAZDIRMAK İSTENEN PIROGRAM RUTİNİ   
MURAT;1.SATIR 1. KARAKTER AKTİF.
   BSF     PORTC, 4
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   BCF     PORTC, 4
   MOVLW   H'80'   ;BİRİNCİ SATIR KOMUT ADRESİ SIRA İLE 80,81...87 KADAR GİDER İLK KARAKTER HANGİ ADRES VERİLMİŞ İSE
   CALL   KOMUTYAZ;İLK ORDAN BAŞLAR BUDA KOMUT YAZLA LCD YE GÖNDERİR LCD DE O ŞEKİLDE ÇALIŞIR GÖNDERİLEN VERİLER
   MOVWF   PORTB   ;BU KOMUT BİÇİMİNDE İŞLER.
   MOVLW   'M'
   MOVWF   D1
   MOVLW   'U'
   MOVWF   D2
   MOVLW   'R'
   MOVWF   D3
   MOVLW   'A'
   MOVWF   D4
   MOVLW   'T'
   MOVWF   D5
   
   CALL   TEMIZLE
   MOVF   D1,W
   CALL   VERIYAZ
   MOVF   D2,W
   CALL   VERIYAZ
   MOVF   D3,W
   CALL   VERIYAZ
   MOVF   D4,W
   CALL   VERIYAZ
   MOVF    D5, W
   CALL    VERIYAZ
   CALL   BEKLE
   CALL   BEKLE
;__________________________________________________
CELIK
   MOVLW   H'86';1.SATIR H.86 ADRESTEN İLK KARAKTER BAŞLASIN
   CALL    KOMUTYAZ
   MOVWF   PORTB
   MOVLW   'C'
   MOVWF   D6
   MOVLW   'E'
   MOVWF   D7
   MOVLW   'L'
   MOVWF   D8
   MOVLW   'I'
   MOVWF   D9
   MOVLW   'K'
   MOVWF   D10
   
   MOVF   D6,W
   CALL   VERIYAZ
   MOVF   D7,W
   CALL   VERIYAZ
   MOVF   D8,W
   CALL   VERIYAZ
   MOVF   D9,W
   CALL   VERIYAZ
   MOVF    D10, W
   CALL    VERIYAZ
   CALL   BEKLE
;____________________________________________________
SUDEM
                   ;2.SATIR 3. KARAKTER AKTİF.
     MOVLW   H'C3'   ;BİRİNCİ SATIR KOMUT ADRESİ SIRA İLE CO,C1,...C7 KADAR GİDER İLK KARAKTER HANGİ ADRES VERİLMİŞ İSE
   CALL   KOMUTYAZ;İLK ORDAN BAŞLAR BUDA KOMUT YAZLA LCD YE GÖNDERİR LCD DE O ŞEKİLDE ÇALIŞIR GÖNDERİLEN VERİLER            
   ;MOVWF   PORTB   ;BU KOMUT BİÇİMİNDE İŞLER.
   MOVLW   'S'
   MOVWF   D11
   MOVLW   'U'
   MOVWF   D12
   MOVLW   'D'
   MOVWF   D13
   MOVLW   'E'
   MOVWF   D14
   MOVLW   'M'
   MOVWF   D15

   MOVF   D11,W
   CALL   VERIYAZ
   MOVF   D12,W
   CALL   VERIYAZ
   MOVF   D13,W
   CALL   VERIYAZ
   MOVF   D14,W
   CALL   VERIYAZ
   MOVF    D15, W
   CALL    VERIYAZ
   CALL   BEKLE
   CALL   BEKLE
;_____________________________________________________
SERPIL
   MOVLW   H'C9';2.SATIR H.C9.ADRESTEN İLK KARAKTER BAŞLASIN.
   CALL    KOMUTYAZ      
   MOVWF   PORTB
   MOVLW   'S'
   MOVWF   D16
   MOVLW   'E'
   MOVWF   D17
   MOVLW   'R'
   MOVWF   D18
   MOVLW   'P'
   MOVWF   D27
   MOVLW   'I'   
   MOVWF   D19
   MOVLW   'L'
   MOVWF   D20
     
   MOVF   D16,W
   CALL   VERIYAZ
   MOVF   D17,W
   CALL   VERIYAZ
   MOVF   D18,W
   CALL   VERIYAZ
   MOVF    D27,W
   CALL    VERIYAZ
   MOVF   D19,W
   CALL   VERIYAZ
   MOVF    D20, W
   CALL    VERIYAZ
;_______________________________________________________    
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   CALL   BEKLE
   
AAA  
   GOTO    AAA

;__________________________________________________
;SATIR SECME ALT RUTİNLERİ
SATIR2
   MOVLW   H'C0'   ;BİRİNCİ SATIR KOMUT ADRESİ SIRA İLE CO,C1,...C7 KADAR GİDER İLK KARAKTER HANGİ ADRES VERİLMİŞ İSE
   CALL   KOMUTYAZ;İLK ORDAN BAŞLAR BUDA KOMUT YAZLA LCD YE GÖNDERİR LCD DE O ŞEKİLDE ÇALIŞIR GÖNDERİLEN VERİLER
   RETURN          ;BU KOMUT BİÇİMİNDE İŞLER.
SATIR1
   MOVLW   H'80'   ;BİRİNCİ SATIR KOMUT ADRESİ SIRA İLE 80,81...87 KADAR GİDER İLK KARAKTER HANGİ ADRES VERİLMİŞ İSE
   CALL   KOMUTYAZ;İLK ORDAN BAŞLAR BUDA KOMUT YAZLA LCD YE GÖNDERİR LCD DE O ŞEKİLDE ÇALIŞIR GÖNDERİLEN VERİLER
   RETURN          ;BU KOMUT BİÇİMİNDE İŞLER.

;___________________________________________________   
;LCD YE KOMUT YAZDIRMA ALT RUTİNLERİ   
   
VERIYAZ
 
   BSF       PORTC,1 ;VERİ YAZ KOMUT ALT PROGRAMINDA İSE LCD YE GÖNDERİLECEK OLAN KARAKTERLERİN PORTB
   MOVWF   PORTB   ;ÜZERİNDEN NASIL GÖNDERİLMESİ GEREKTİĞİNİ VE LCD NİN RS VE E BACAKLARININ HANGİ
   BCF       PORTC,0 ;ŞEKİLDE LCD YE KARAKTER GÖNDERİLECEĞİNİ VE GÖNDERDİKTEN SONRA EKRANDA RS VE E BACAKLARINI
   CALL   BEKLE   ;HANGİSİNİN SET VE RESET OLDUKTAN SONRA GÖRÜNECEĞİNİ YAPAR.PR KOMUT YAZ VE VERİ YAZ FARKLI
   BSF       PORTC,0 ;İŞLER YAPAR KOORDİNELİ CALIŞIR.
   RETURN
TEMIZLE
   MOVLW   H'01';VERİYİ LCD SİL
   CALL   KOMUTYAZ
   MOVLW   H'0F';DİSPLAY ACIK İLMEC ALT ÇİGİ VAR YANIP SÖNME DURUMU VAR.
   CALL   KOMUTYAZ
   MOVLW   H'38';8BİT ARA BİRİM 2 SATIR AKTİF 5X7 NOKTA FONT.
   CALL   KOMUTYAZ
   RETURN
KOMUTYAZ
   BCF       PORTC,1 ;KOMUT YAZDIRMA ALT PR.BURDA LCD YE NASI BİR POZİSYONDA NE ŞEKİLDE
   MOVWF   PORTB   ;CALIŞMASINI SÖYLEYEN KOMUTLAR GÖNDERİLİR LCD NİN RS VE E BACAKLARINI KONTROL EDER
   BCF       PORTC,0 ;PORTB ÜZERİNDEN İLK İŞLEM GÖNDERME OLARAK YAPILIR BİR ÜSTTEKİ VERİ YAZ KOMUTUNU İNCELE
   CALL   BEKLE   ;PORTB NİN BACAK BİTLERİNİ KONTROL ET
   BSF       PORTC,0
   RETURN
   
;_______________________________________________________-   
BEKLE
   MOVLW   .10          
   MOVWF   MSB
D111   
   MOVLW   .150
   MOVWF   LSB
D22
   DECFSZ   LSB,F
   GOTO   D22
   DECFSZ   MSB,F
   GOTO   D111
   RETURN

   END
kabaca iş görür..barı sorunları anlamaya yardımcı olabilir.

Tagli

Paylaşım için teşekkürler ama kodun LCD kurulum bölümü pek açık değil. Ayrıca karakter ve komut yollama kodlarını da göremedim.

Bir eleştiride bulunmak gerekirse, kod okunaklı değil. Kendi yazdığım bir programdan örnek vereyim, ne demek istediğim daha rahat anlaşılır belki (4 bitlik arayüz ile):
LCD_EMRET				;W'deki komutu LCD'ye gönderir
	movwf	lcdbuf		;W'deki değer LCD tampon belleğine atıldı
	call	LCD_BEKLE		;LCD'nin önceki işlemi bitirmesi bekleniyor
	movf	lcdbuf,W		;Veri tampon bellekten geri çağrıldı
	andlw	h'F0'		;W'nin küçük 4 biti sıfırlandı
	iorlw	h'08'		;E 1 yapıldı
	movwf	PORTB		;W'deki emir PORTB'ye yazıldı
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E kapatılıyor
	call	BEKLE1US		;1 us bekleniyor

	swapf	lcdbuf,W		;Komut ters çevrilip W'ye yazıldı
	andlw	h'F0'		;W'nin küçük 4 biti sıfırlandı
	iorlw	h'08'		;E 1 yapıldı
	movwf	PORTB		;W'deki emir PORTB'ye yazıldı
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E kapatılıyor
	call	BEKLE1US		;1 us bekleniyor
	return

LCD_YAZ				;W'deki karakteri LCD'ye yazar
	banksel	lcdbuf		;Bank 0'a geçildi
	movwf	lcdbuf		;W'deki değer LCD tampon belleğine atıldı
	call	LCD_BEKLE		;LCD'nin önceki işlemi bitirmesi bekleniyor
	movf	lcdbuf,W		;Veri tampon bellekten geri çağrıldı
	andlw	h'F0'		;W'nin küçük 4 biti sıfırlandı
	iorlw	h'0A'		;RS ve E 1 yapıldı
	movwf	PORTB		;W'deki emir PORTB'ye yazıldı
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E kapatılıyor
	call	BEKLE1US		;1 us bekleniyor

	swapf	lcdbuf,W		;Komut ters çevrilip W'ye yazıldı
	andlw	h'F0'		;W'nin küçük 4 biti sıfırlandı
	iorlw	h'0A'		;RS ve E 1 yapıldı
	movwf	PORTB		;W'deki emir PORTB'ye yazıldı
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E kapatılıyor
	call	BEKLE1US		;1 us bekleniyor
	return

LCD_KUR				;LCD başlangıç ayarları yapılıyor (4 bit arayüz)
	call	BEKLE20MS		;Kur için gerekli bekleme
	movlw	b'00110000'		;Reset komutu W'ye yüklendi
	movwf	PORTB		;Komutu PORTB'ye aktar
	call	BEKLE1MS		;1 ms bekleniyor
	bsf	PORTB,3		;E'yi aç
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E'yi kapat, emir gitsin (1. emir)
	call	BEKLE20MS		;20 ms bekleniyor
	bsf	PORTB,3		;E'yi aç
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E'yi kapat, emir gitsin (2. emir)
	call	BEKLE1MS		;1 ms bekleniyor
	bsf	PORTB,3		;E'yi aç
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E'yi kapat, emir gitsin (3. emir)
	call	BEKLE20MS		;20 ms bekleniyor
	movlw	b'00101000'		;Kontrol değeri W'ye atıldı
	movwf	PORTB		;Komut güncelleniyor ve E açılıyor
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E kapatıldı (4 bit arayüze geçildi)
	call	BEKLE20MS		;20 ms bekleniyor
	call	BEKLE20MS		;20 ms daha bekleniyor

	movlw	b'00101000'		;Emir: 4bit, 2 satır, 5x8 karakter
	call	LCD_EMRET		;Emir gönderiliyor
	call	LCD_BEKLE		;İşlemin bitmesi bekleniyor
	movlw	b'00001000'		;Emir: Ekran kapalı
	call	LCD_EMRET		;Emir gönderiliyor
	call	LCD_BEKLE		;İşlemin bitmesi bekleniyor
	movlw	b'00000001'		;Emir: Ekranı temizle başa dön
	call	LCD_EMRET		;Emir gönderiliyor
	call	LCD_BEKLE		;İşlemin bitmesi bekleniyor
	movlw	b'00000110'		;Emir: İmleç sağa kayar
	call	LCD_EMRET		;Emir gönderiliyor
	call	LCD_BEKLE		;İşlemin bitmesi bekleniyor
	movlw	b'00001100'		;Emir: Ekranı aç
	call	LCD_EMRET		;Emir gönderiliyor
	call	LCD_BEKLE		;İşlemin bitmesi bekleniyor
	return			;Çağrılan yere dönülüyor


Bir diğer nokta da LCD'ye gönderilecek verilerin mümkün olduğunca az komut ile gönderilmesi. Bunun için, karakterleri bir RETLW tablosunda saklayıp, bir döngü içinde artan bir sayaç değeri ile tablodan değerleri çekip LCD'ye göndermek daha doğru olacaktır. Kendi program hafızasını oluma yeteneği olan PIC'lerde karakterleri program hafızasına ham olarak gömmek (ki 14 bitlik alana 2 adet 7 bitlik ASCII karakteri gömülebilir) hafıza yönüyle daha verimli bir kullanım olacaktır.
Gökçe Tağlıoğlu

mrtclk0891

kardeş temel aynı gibi geldi ama tek farkı ben komutları ve mesajı hex verdin sizde binari vermişiniz buda karışık geldi evet doğru diyosun bu başka pr. dan kısaltma halinde verdim teşekkür ederim elgine seninki daha güzel olmuş.