Haberler:

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

Ana Menü

16F84 ile LCD 2x16 sorusu.

Başlatan oguzerdal, 22 Mayıs 2023, 01:38:33

oguzerdal

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

mehmet

Hadi gözün aydın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

oguzerdal

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 .

mehmet

Çalışan kodu buraya da ekle ki,
başkalarına yarım olsun.

Bir de kodları "kod tagı" içine
alırsan iyi olur.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

oguzerdal

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