Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: oguzerdal - 22 Mayıs 2023, 01:38:33

Başlık: 16F84 ile LCD 2x16 sorusu.
Gönderen: oguzerdal - 22 Mayıs 2023, 01:38:33
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
Başlık: Ynt: 16F84 ile LCD 2x16 sorusu.
Gönderen: mehmet - 22 Mayıs 2023, 15:32:59
Hadi gözün aydın.
Başlık: Ynt: 16F84 ile LCD 2x16 sorusu.
Gönderen: oguzerdal - 22 Mayıs 2023, 16:25:10
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 .
Başlık: Ynt: 16F84 ile LCD 2x16 sorusu.
Gönderen: mehmet - 22 Mayıs 2023, 18:02:14
Çalışan kodu buraya da ekle ki,
başkalarına yarım olsun.

Bir de kodları "kod tagı" içine
alırsan iyi olur.
Başlık: Ynt: 16F84 ile LCD 2x16 sorusu.
Gönderen: oguzerdal - 24 Mayıs 2023, 22:45:45
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