Arkadaşlar bu soruyu çözen var mı? Bir okul deney sorusu. 4 bit LCD yazı yazdırma.B0-B3----> D4-D7 ye bağlı. Çalışmıyor. Buton1 e basınca yazıyor Buton2'ye basınca siliyor. Zamanında uğraşmışsınızdır.Ustalar yardım lütfen.
LIST P=16F84A
INCLUDE "P16F84A.INC"
__CONFIG _WDT_OFF & _XT_OSC & _PWRTE_ON & _CP_OFF
ERRORLEVEL -224
ERRORLEVEL -302
;DEFINE INFORMATION
#DEFINE RS PORTB,4
#DEFINE E PORTB,5
#DEFINE BTN1 PORTA,0
#DEFINE BTN2 PORTA,1
;**********************MACRO****************
ESTROBE MACRO ; STROBE THE "E" BIT
BSF E
BCF E
ENDM
CBLOCK H'0C'
TEMP ;Geçici değişken
CNTMSEC ; Zaman döngü değişkeni
ENDC
ORG 0
GOTO MAIN
;***************************************
;Mesaj Ciktilari icin Bilgiler
;***************************************
SHOMSG ; Mesaj goster
ADDWF PCL,F
M0 DT "AD SOYAD: AHMET YILMAZ",0
M1 DT "NO: 571",0
;*************************************
; INITIALIZE THE PORTS
;***************************************
INIT
CLRF PORTA
CLRF PORTB
MOVLW B'00010011'
TRIS PORTA
MOVLW B'11000000'
TRIS PORTB
RETURN
;*****************************************
; INITIALIZE THE LCD
;*****************************************
INITLCD
MOVLW D'60'
CALL NMSEC ; WAIT 40 MSECS BEFORE RESET ;
BCF RS ;SEND AN 8 BIT INSTRUCTION
MOVLW 0X003 ; RESET COMMAND
CALL NYBBLEOUT ; SEND THE NYBBLE
CALL DLAY5 ; WAIT 5 MSECS BEFORE SENDING AGAIN
ESTROBE
CALL DLAY160 ;WAIT 160 microSECS BEFORE SENDING 2ND TIME
ESTROBE
CALL DLAY160 ;WAIT 160 microSECS BEFORE SENDING 3RD TIME
BCF RS ; SEND AN 8 BIT INSTRUCTION
MOVLW 0X02A ; SET 4 BIT MODE
CALL NYBBLEOUT
CALL DLAY160
MOVLW 0X02C ; 4 BIT, 2 LINE, 5X7 FONT
CALL SENDINS
MOVLW 0X010 ; DISPLAY SHIFT OFF
CALL SENDINS
MOVLW 0X001 ; CLEAR THE DISPLAY RAM
CALL SENDINS
CALL DLAY5 ; NOTE, CAN TAKE UP TO 4.1 MSECS
MOVLW 0X006 ; INCREMENT CURSOR
CALL SENDINS
MOVLW 0X00C ; DISPLAY ON CURSOR OFF
CALL SENDINS
RETURN
CLRDISP
MOVLW 0X001 ; CLEAR THE DISPLAY RAM
CALL SENDINS
CALL DLAY5 ; NOTE, CAN TAKE UP TO 4.1 MSECS
RETURN
;******************************************************
; SEND THE CHARACTER IN W OUT TO THE LCD
;************************************************
SENDASCII
ADDLW '0' ; SEND NBR AS ASCII CHARACTER
SENDCHAR ; SEND THE CHARACTER TO THE LCD
MOVWF TEMP ; SAVE THE TEMPORARY VALUE
SWAPF TEMP,W ; SEND THE HIGH NYBBLE
BSF RS ; RS = 1
CALL NYBBLEOUT
MOVF TEMP,W ; SEND THE LOW NYBBLE
BSF RS
CALL NYBBLEOUT
RETURN
;******************************************
; SEND AN INSTRUCTION IN W OUT TO THE LCD
;*********************************************
SENDINS ; SEND THE INSTRUCTION TO THE LCD
MOVWF TEMP ; SAVE THE TEMPORARY VALUE
SWAPF TEMP,W ; SEND THE HIGH NYBBLE
BCF RS ; RS = 0
CALL NYBBLEOUT
MOVF TEMP,W ; SEND THE LOW NYBBLE
BCF RS
CALL NYBBLEOUT
RETURN
;********************************************
; SEND THE NIBBLE IN W OUT TO THE LCD
;**********************************************
NYBBLEOUT ; SEND A NYBBLE TO THE LCD
MOVWF PORTB
ESTROBE ;STROBE OUT THE LCD DATA
CALL DLAY160 ; DELAY FOR 160 MSEC
RETURN
;*************************************
; OUTPUT THE MESSAGE ON THE LCD
;**************************************
OUTMESSAGE
MOVWF FSR ; POINT AT FIRST LETTER
OUTLOOP
MOVF FSR, W ; GET POINTER INTO W
INCF FSR, F ; SET UP FOR NEXT LETTER
CALL SHOMSG ; GET CHARACTER TO OUTPUT
IORLW 0 ; AT THE END OF THE MESSAGE?
BTFSC STATUS,Z ; SKIP IF NOT AT END
RETURN ;YES - EQUAL TO ZERO
CALL SENDCHAR ;OUTPUT THE ASCII CHARACTER
GOTO OUTLOOP ; GET THE NEXT CHARACTER
;**************************************************
; TIME DELAY ROUTINES
;*****************************************
DLAY160
MOVLW D'60' ; 160 USEC DELAY ENTRY POINT
MICRO4
ADDLW H'FF' ; SUBTRACT 1 FROM 'W'
BTFSS STATUS,Z ; SKIP WHEN YOU REACH ZERO
GOTO MICRO4 ;MORE LOOPS
RETURN
DLAY5
MOVLW D'20' ; 5 MSEC DELAY ENTRY POINT
GOTO NMSEC
MSEC250 ; A SUBROUTINE TO DELAY 250 MSEC
MOVLW D'250'
; ***N MILLISECOND DELAY ROUTINE ***
NMSEC
MOVWF CNTMSEC ; DELAY FOR N (IN W) MILLISEC
MSECLOOP
MOVLW D'248' ; 1 USEC FOR LOAD
CALL MICRO4 ; THIS INSTRUCTION IS 995 USEC
NOP ; 1 USEC
DECFSZ CNTMSEC,F ; 1 USEC, (2 IF SKIP TAKEN)
GOTO MSECLOOP ; 2 USEC HERE 995+5 = 1 MSEC
RETURN
;**************************************
; ANA PROGRAM BLOĞU
;******************************************
MAIN
CALL INIT ; Program ayarları yükleniyor.
CALL INITLCD ; LCD ayarları yükleniyor.
REPEAT
BTFSS BTN1 ; 1nci buton basıldı mı?
CALL CLRDISP ; Ekranı sil.
BTFSS BTN2 ;2nci buton basıldı mı?
GOTO WRITE ; Ekrana mesajı yaz.
GOTO REPEAT ;Butonları kontrole devam et.
WRITE ; Mesaj yazılıyor...
MOVLW H'80' ;İlk satır ilk sütun ayarlandı.
CALL SENDINS ; Konuma pozisyon al.
MOVLW M0 ; İlk satır mesajını ayarla.
CALL OUTMESSAGE ;İlk satır mesajını yaz.
MOVLW H'C0' ; İkinci satır ilk sütunu ayarlandı.
CALL SENDINS ; Konuma pozisyon al.
MOVLW M1 ; İkinci satır mesajını al.
CALL OUTMESSAGE ;İkinci satır mesajını yaz.
GOTO REPEAT ; Mesaj yazıldı. Buton kontrolüne devam
END
Hadi gözün aydın.
sağolun Mehmet bey, Etepic'den pek cevap gelmeyince buraya yazmıştım. Günlerdir çalışıyordum, ben de INIT kısmından şüphe ediyordum ama denemediğim şey kalmayınca programda bir şeyler olduğu belliydi.Şimdi daha bilinçli çalışacağım. Teşekkürler .
Çalışan kodu buraya da ekle ki,
başkalarına yarım olsun.
Bir de kodları "kod tagı" içine
alırsan iyi olur.
Kodu dosya olarak koyamadım. Sadece değişecek kısmı koyuyorum. Başka da bir değişiklik yok.
; SEND THE NIBBLE IN W OUT TO THE LCD
;**********************************************
NYBBLEOUT ; SEND A NYBBLE TO THE LCD
BTFSS RS
GOTO D
IORLW 0x10
GOTO A
D: ANDLW 0xEF
A: MOVWF PORTB
ESTROBE ;STROBE OUT THE LCD DATA
CALL DLAY160 ; DELAY FOR 160 MSEC
RETURN