Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

4 bit LCD display yazdırma

Başlatan Tom, 06 Mayıs 2005, 01:07:51

Tom

Arkadaşlar ben 4 bit LCD displayde "Merhaba Dunya" yazısını yazmak için proğ yazdım ama çalışmıyor.Burada data hattı olarak Portd,3.....Portd,0 kullandım
rs için portc,4
rw için portc,4
e için portc,6 kulalandım.Aynı zamanda yazdığım bu proğran hakan karakaş ın kitabındaki ile aynı ama çalışmıyor.Yardımcı olanlara şimdiden teşekkür ederim .proğram aşagıdadır.

;===SAIT.ASM===29/04/05===
	LIST	P=16F877A
	INCLUDE	"P16F877A.INC"
ADCON1	EQU	h'9F'
TMRO	EQU	h'01'
GENEL	EQU	h'10'		; genel amaclı sayac

PC	EQU	h'02'		; program sayıcı
VERI	EQU	h'11'		; veri reg
VERI_AD	EQU	h'12'		; veri adresinin tutuldugu reg
SAY0	EQU	h'13'		; sayac
SAY1	EQU	h'14'		; sayac

#DEFINE	RS	PORTC,4		;0->kontrol   1->data
#DEFINE	RW	PORTC,5		; 0->Write    1->Read
#DEFINE	EN	PORTC,6		; lcd enable
	
	CLRF	PORTA
	CLRF	PORTB
	CLRF	PORTC
	CLRF	PORTE
	CLRF	PORTD
	CLRF	VERI_AD

	BSF	STATUS,5
	MOVLW	h'06'
	MOVWF	ADCON1
	BCF	TRISE,4
	CLRF	TRISA
	CLRF	TRISB
	CLRF	TRISC
	CLRF	TRISD
	CLRF	TRISE
	BCF	OPTION_REG,7
	BCF	STATUS,5
	

BASLA
	CLRWDT
	CALL	POWER_UP_GECIK
	CALL	LCD_RESET	; lcd resetle
	CALL	LCDBIT_SET	; 4 bit işlem icin lcd kur
	CALL	DISPLAY_ON		
	CALL	KURSOR_KUR	; kursör 1 artan mod display kaydır
	CALL	MESAJ			; verileri lcd yaz
TEK
	GOTO	TEK

;..........................................
LCD_RESET
	MOVLW	d'03'		
	MOVWF	GENEL
	
DEV1
	MOVLW	b'00110000' 		; b'00110000' olması lazım????
	MOVWF	PORTD
	CALL	LCD_KOMUT
	DECFSZ	GENEL,F
	GOTO	DEV1
	RETURN
;..........................................
LCD_KOMUT
	CALL	BF_TEST		; Busy flag test et
	BCF	RS		;  komut
	BCF	RW		;  yaz
	BSF	EN		; display aktif
	NOP
	BCF	EN		; veri dis gönderildi
	RETURN
;........................................
BF_TEST
	BSF	STATUS,5
	MOVLW	h'FF'
	MOVWF	TRISD
	BCF	STATUS,5
	BSF	RW		; lcd oku
	BCF	RS		; veri
BF_TEST_ET
	BSF	EN		; display aktif
	NOP
	BCF	EN		;lcd veri alındı
	MOVF	PORTD,W
	ANDLW	b'10000000'
	BTFSS	STATUS,2
	GOTO	BF_TEST		;test devam

	BSF	STATUS,5
	MOVLW	h'00'
	MOVWF	TRISD		; portb->high giris		
	BCF	STATUS,5
	MOVLW	h'FF'
	MOVWF	GENEL		; cıkıs ıcın bek suresı
DEV2
	DECFSZ	GENEL,F	
	GOTO	DEV2
	RETURN
;...........................................
LCDBIT_SET
	MOVLW	b'00100000'
	MOVWF	PORTD
	CALL	LCD_KOMUT
	MOVLW	b'00100000'
	MOVWF	PORTD
	CALL	LCD_KOMUT
	MOVLW	b'10000000'
	MOVWF	PORTD	
	CALL	LCD_KOMUT
	RETURN
;.........................................
DISPLAY_ON
	MOVLW	d'0'
	MOVWF	PORTD
	CALL	LCD_KOMUT
	MOVLW	b'11100000'
	MOVWF	PORTD
	CALL	LCD_KOMUT
	RETURN
;.......................................
KURSOR_KUR
	MOVLW	d'0'
	MOVWF	PORTD
	CALL	LCD_KOMUT
	MOVLW	b'01100000'
	MOVWF	PORTD
	CALL	LCD_KOMUT
	RETURN
;.......................................
MESAJ
VERI_DEV
	CALL	BF_TEST		; bf mesgulmu
	BSF	RS		; veri
	BCF	RW		;  yaz
	MOVF	VERI_AD,W	; W <--VERISA=0
	CALL	MESAJ1
	IORLW	d'0'
	BZ	SON
	MOVWF	VERI
	MOVF	VERI,W
	MOVWF	PORTD		; ust 4 bıt cıkısta
	BSF	EN
	NOP
	BCF	EN		; ust 4 bit gönderildi
	CALL	BF_TEST
	SWAPF	VERI,F
	MOVF	VERI,W
	MOVWF	PORTD		; alt 4 bıt cıkısta
	BSF	EN
	NOP
	BCF	EN		; alt 4 bit gönderildi
	INCF	VERI_AD,F	;  veri adresi 1 arttır.
	GOTO	VERI_DEV	; verı gon devam et
SON
	RETURN
;.......................................
MESAJ1
	ADDWF	PC,F
msj1 	dt	"MERHABA DUNYA",0
	MOVF	PC,W
	RETURN
POWER_UP_GECIK
	MOVLW	d'176'
	MOVWF	SAY1
DON
	MOVLW	d'255'
	MOVWF	SAY0
	DECFSZ	SAY0
	GOTO	DON
	DECFSZ	SAY1
	GOTO	POWER_UP_GECIK
	RETURN
	END

      
Arkadaşlar burada datahattı olarak: Portd,3......Portd,0 kullanıyorum


 Problemim şu Bu proğram  4 bit LCD display sürme ama bir türlü çalışmıyor.Aynı zamanda bu proğram hakan karakaş ın ileri pıc 16F84 uygulamaları adlı kitaptakinin hemen hemen aynısı yardım eden arkadaşlara şimdiden teşekkürler

Veli B.

Kod üzerinde busy flag kontrolü var.Bağlantılarda Lcdnin R/W bacağını bağlıyor musun?
DSN dosyasını bir yere upload edersen iyi olur.

arslan74

Merhaba,
Senin programın hatası şu,

Sen ilk önce programını 4 bit moda göre ayarlaman gerek. Senin programında bunu göremedim. Sen direkt dataları göndermeye calışmıssın. Ama böyle calışmaz, ilk önce İlk ayarları girmelisin.

Sana örnek kod yolluyorum.
;**************************************************************
;*  	Bacak bağlantıları 16F877
;*	----------------------------------	
;*	PORTA: 	0 - Data4
;*		1 - Data5
;*		2 - Data6
;*		3 - Data7
;*	PORTB: 	0 - LCD Display RS
;*		1 - LCD Display E
;*	
;************************************************************

#define LCD_RS		PORTC,5

#define LCD_E		PORTC,4

; -----------------------------------
; SEND INITIALISATION DATA TO DISPLAY
; -----------------------------------


	movlw	99h			; 25mS powerup delay @ 10MHz
	movwf	DelayH		; LCD data sheet says 15mS
	clrf	DelayL

PUPD
	decfsz	DelayL,F
	goto	PUPD
	decfsz	DelayH,F
	goto	PUPD

;
; -----------------------------------
; SEND INITIALISATION DATA TO DISPLAY
; -----------------------------------
;

;	SETUP FOR 4 BIT DATA
; ----------------------------------------------
	movlw b'00000010'	; function set 4 bits
	movwf PORTC	; send it
          bcf	LCD_RS		; (0)
	call	DELAY_40US
           bsf	LCD_E		; (1) Clock1 it in
     call	DELAY_40US
           bcf	LCD_E		; (0)
	call	DELAY_40US
; ----------------------------------------------

		movlw b'00101000'	; function set 4 bits, 2 lines, font set # 1
		call LCDins

        movlw b'00001100'	; display on, cursor off, blink off
        call LCDins

        movlw b'00000110'	; increment - no display shift
        call LCDins

CLR_LCD


Bu komut işleme programı.
;
; -------------------------------------------------
; OUTPUT 1 INSTRUCTION BYTE TO DISPLAY - 4 BIT MODE
; -------------------------------------------------
;

LCDins

    movwf	 temp	; temp save instruction
	SWAPF	 temp,W

	andlw 0x0F	; send high nibble first
	movwf PORTC	; send it

          bcf	LCD_RS		; (0)
			call	DELAY_40US
          bsf	LCD_E		; (1) Clock1 it in
		    call	DELAY_40US
          bcf	LCD_E		; (0)
			call	DELAY_40US


    movfw	 temp	; temp save instruction
	andlw 0x0F		; now send lower nibble
	movwf PORTC		; send it
 
          bsf	LCD_E		; (1) Clock1 it in
		    call	DELAY_40US
          bcf	LCD_E		; (1)
			call	DELAY_40US


RETURN


Buda bilgi işleme progamı.
;
; ------------------------------------------
; OUTPUT 1 DATA BYTE TO DISPLAY - 4 BIT MODE
; ------------------------------------------
;
LCDdata

	movwf temp	; temp save data

	swapf temp,W

	andlw 0x0F	; send high nibble first
	movwf PORTC
  
			bsf LCD_RS      ; (0) Write "data"
	call	DELAY_40US
			bsf	LCD_E		; (1) clock it in
	call	DELAY_40US
			bcf	LCD_E		; (1)
	call	DELAY_40US


	movfw temp	; temp save data

	andlw 0x0F	; now send lower nibble

	movwf PORTC

			bsf LCD_RS     ; (0) Write "data"
	call DELAY_40US
          bsf	LCD_E		; (1) clock it in
 	call	DELAY_40US
          bcf	LCD_E		; (1)
	call DELAY_40US

          return


Başarılar,

Hasan ARSLAN

bsivgin

ben bunu assemblyde makro olarak yazmıştım. Kullanımı çok kolay.
kullanılan I/O'lar aşağıdaki gibi. Toplam 3 register kullanır.

ENABLE PORTB,4
RS PORTB,5
RW PORTB,6
ENABLE PORTA,0
RS PORTA,1
RW PORTA,2


Yazılmış örnek program aşağıdaki gibi olmakta

#include p16f628.inc
#include register.inc .........;MAKROLARIN KULLANILDIGI REGISTERLER
#include mdelay0.5ms.inc ...;500 MIKROSANIYE GECIKME YAPAN MAKRO
#include mlcd.inc ................;LCD MAKROSU
ORG 00

GOTO START

ORG H'10'
START

lcd_hazirla........ ;LCD HAZIRLAMA KOMUTU
LCD_clear......... ,LCD TEM0ZLEME KOMUTU
IMLEC_POZ D'4'....... ;IMLEC POZ0SYONU AYARLAMA KOMUTU
CUMLE_YAZ "merhaba",7......... ;CUMLE YAZMA KOMUTU (CUMLENIN KARAKTER SAYISI VIRGULDEN SONRA YAZILIR)

IMLEC_POZ D'18'
KARAKTER_YAZ 'D'....... ;TEK BIR KARAKTER YAZMA KOMUTU
MSDELAY D'200' ...........; 200X500MIKROSANIYE 1MS GECIKME
KOMUT_YAZ H'06' .........;LCD'YE KOMUT YAZMA

#include ldelay0.5ms.inc ........; DELAY PROGRAMI
#include llcd.inc ....................;LCD PROGRAMI
goto $
end


burada makrolar sadece alt programı çağıdığı için klasik makro tekniğine göre hafızada daha az yer tutar. (klasik makrolarda makro sürekli kodları tekrarlar)


İsteyen arkadaşlara makroları yollayabilirim.


Saygılarımla
Bülent ŞIVGIN
www.diyot.com

aster

bsivgin, isterseniz vereceğiniz dosyaları yahoo guruplarımızdan birine yükleyin isteyen oradan alıp yararlansın
teşekkürler

Tom

Arkadaşlar çok teşekkür ederim çok makbule geçti.
   SELAMLAR...

bsivgin

arkadaşlar bahsettiğim makrolar hakkında bilgiyi aşağıdaki linkten indirebilirsiniz.


http://www.diyot.com/makro.html


saygılarımla
Bülent ŞIVGIN
www.diyot.com