4 Aralık 2011 Pazar

Pic16f877A Lcd Ekrana yazdırma Deneysetine uyumlu

list P=16F877A
include
__config H'3F39'
LCDVERI EQU 0X25
SAYAC_GECIK    EQU    0X26
SAYAC_GECIK2 EQU 0X27
SAYAC_LCD    EQU    H'0028'
SIFIR_GECICI    EQU H'0030'
ORG 0x000



CLRF PCLATH
goto ANAPROGRAM
ORG 0X004
kesme
    BTFSS INTCON,0 ;RB4-RB7 KESMESİ GELDİ İSE 1 ADIM ATLA
    GOTO KESMESONU
    BTFSC PORTB,4
    GOTO SUTUN1
    BTFSC PORTB,5
    GOTO SUTUN2
    BTFSC PORTB,6
    GOTO SUTUN3
    BTFSC PORTB,7
    GOTO SUTUN4
SUTUN1
        CLRF PORTB            ;olduğu bulunup yazdır alt programı ile yazdırıyor
        BSF PORTB,0
        BTFSC PORTB,4
        MOVLW A'1'
        BCF PORTB,0
        BSF PORTB,1
        BTFSC PORTB,4
        MOVLW A'4'
        BCF PORTB,1  
        BSF PORTB,2
        BTFSC PORTB,4
        MOVLW A'7'
        BCF PORTB,2
        BSF PORTB,3
        BTFSC PORTB,4
        MOVLW A'*'
        BCF PORTB,3
        BCF PORTB,4 ;1.SÜTUNU SIFIRLA
        GOTO YAZDIR
SUTUN2
        CLRF PORTB            ;olduğu bulunup yazdır alt programı ile yazdırıyor
        BSF PORTB,0
        BTFSC PORTB,5
        MOVLW A'2'
        BCF PORTB,0
        BSF PORTB,1
        BTFSC PORTB,5
        MOVLW A'5'
        BCF PORTB,1  
        BSF PORTB,2
        BTFSC PORTB,5
        MOVLW A'8'
        BCF PORTB,2
        BSF PORTB,3
        BTFSC PORTB,5
        MOVLW A'0'
        BCF PORTB,3
        BCF PORTB,5 ;2.SÜTUNU SIFIRLA
        GOTO YAZDIR
SUTUN3
        CLRF PORTB            ;olduğu bulunup yazdır alt programı ile yazdırıyor
        BSF PORTB,0
        BTFSC PORTB,6
        MOVLW A'3'
        BCF PORTB,0
        BSF PORTB,1
        BTFSC PORTB,6
        MOVLW A'6'
        BCF PORTB,1  
        BSF PORTB,2
        BTFSC PORTB,6
        MOVLW A'9'
        BCF PORTB,2
        BSF PORTB,3
        BTFSC PORTB,6
        MOVLW A','
        BCF PORTB,3
        BCF PORTB,6 ;3.SÜTUNU SIFIRLA
        GOTO YAZDIR
SUTUN4
        CLRF PORTB            ;olduğu bulunup yazdır alt programı ile yazdırıyor
        BSF PORTB,0
        BTFSC PORTB,7
        MOVLW A'A'
        BCF PORTB,0
        BSF PORTB,1
        BTFSC PORTB,7
        MOVLW A'B'
        BCF PORTB,1  
        BSF PORTB,2
        BTFSC PORTB,7
        MOVLW A'C'
        BCF PORTB,2
        BSF PORTB,3
        BTFSC PORTB,7
        MOVLW A'D'
        BCF PORTB,3
        BCF PORTB,7 ;4.SÜTUNU SIFIRLA
        GOTO YAZDIR

YAZDIR
    DECFSZ SAYAC_LCD,1        ;16 karakter olup olmadığını kontrol ediyor  
    INCF PCL            ;Olmamışsa PCL++ yapıp satırı sıfırlamayı atlıyor  
    CALL SATIR1_SIFIRLA        ;Olmuşsa Lcd'nin ilk satırını Sıfırlıyor
    CALL VERIYAZ
    MOVLW H'0F'                ;d portu yeniden ayarlanıyor
    MOVWF PORTB
    BCF INTCON,0 ; KESMEYİ CLEAR YAP (KAPAT)
KESMESONU
RETFIE
GECIKME:
    MOVLW    H'FF'
    MOVWF    SAYAC_GECIK
DON1:
    MOVLW    H'FF'
    MOVWF    SAYAC_GECIK2
DON2:
    DECFSZ    SAYAC_GECIK2,F
    GOTO    DON2
    DECFSZ    SAYAC_GECIK,F
    GOTO    DON1
    RETURN

SATIR2:
    MOVLW H'C0'            ;2.satıra geçmek için gerekli kod
    CALL KOMUTYAZ
    RETURN

SATIR1:
    MOVLW H'80'            ;1.satıra geçmek için gerekli kod
    CALL KOMUTYAZ
    RETURN  
KOMUTYAZ:                
    MOVWF LCDVERI             ;Komutu geçici değişkene al.
    SWAPF LCDVERI, W          ;En değerli 4 bit’i gönder.
    CALL LCDKOMUTGONDER
    MOVF LCDVERI, W        ;En değersiz 4 bit’i gönder.
    CALL LCDKOMUTGONDER      
    RETURN
LCDKOMUTGONDER:                   
    ANDLW    0x0F            ;En değersiz 4 bit W'de,
    MOVWF PORTD            ;PortB'ye transfer ediliyor.
    BANKSEL PORTD          
    BSF    PORTD,5            ;Lcd ye düşen kenar üretmek için
    CALL GECIKME
    BCF    PORTD,5            ;LCD için düşen kenar üretiyorz
    RETURN

VERIYAZ:                ;LCD'ye karakter göndermek için
    MOVWF LCDVERI            ;Komutu geçici değişkene al.
    SWAPF LCDVERI, W        ;En değerli 4 bit’i gönder.
    CALL LCDVERIGONDER
    MOVF LCDVERI, W        ;En değersiz 4 bit’i gönder.
    CALL LCDVERIGONDER
    RETURN
LCDVERIGONDER:                   
    ANDLW 0x0F            ;En değersiz 4 bit W'de
    MOVWF PORTD            ;PortB'e transfer ediliyor.
    BANKSEL PORTD          
    BSF PORTD,4            ;Karakter Yazılacağı belirtiliyor
    BSF    PORTD,5         ;LCD'için 1 yapılır
    CALL GECIKME
    BCF    PORTD,5            ;LCD için düşen kenar üretiyorz
    RETURN
TEMIZLE:
    MOVLW    H'02'
    CALL KOMUTYAZ
    MOVLW    H'0C'
    CALL    KOMUTYAZ
    MOVLW    H'01'
    CALL    KOMUTYAZ
    MOVLW    H'28'
    CALL    KOMUTYAZ
    MOVLW    H'0F'
    CALL    KOMUTYAZ
    MOVLW    H'06'
    CALL    KOMUTYAZ  
    RETURN

ALT:
    MOVLW    A'A'
    CALL    VERIYAZ  
    MOVLW    A'B'
    CALL    VERIYAZ  
    MOVLW    A'D'
    CALL    VERIYAZ  
    MOVLW    A'U'
    CALL    VERIYAZ  
    MOVLW    A'L'
    CALL    VERIYAZ  
    MOVLW    A'L'
    CALL    VERIYAZ  
    MOVLW    A'A'
    CALL    VERIYAZ  
    MOVLW    A'H'
    CALL    VERIYAZ  
    MOVLW    A' '
    CALL    VERIYAZ  
    MOVLW    A'E'
    CALL    VERIYAZ  
    MOVLW    A'R'
    CALL    VERIYAZ  
    RETURN
SATIR1_SIFIRLA:
    MOVWF SIFIR_GECICI        ;Yazılacak olan Karakter tutuluyor
    MOVLW H'02'            ;1.Satır 1.Sutuna gel Komutu
    CALL KOMUTYAZ
    MOVLW D'16'            ;Sayaç silme işlemi için kuruluyor
    MOVWF SAYAC_LCD
SATIR1_DEVAM:
    MOVLW A' '            ;Boşluk yazılıyor(16 Defa)
    CALL VERIYAZ
    DECFSZ SAYAC_LCD,1
    GOTO SATIR1_DEVAM
    MOVLW H'02'            ;1.Satır 1.Sutuna gel
    CALL KOMUTYAZ      
    MOVLW D'16'            ;Sayaç Kuruluyor
    MOVWF SAYAC_LCD      
    MOVFW SIFIR_GECICI        ;Yazdırılacak karakter W'e geri yazılıyor
    RETURN
ANAPROGRAM
    BSF STATUS,RP0 ;BANK 1 E GEÇİLDİ
    MOVLW B'00000000' ;D PORTU ÇIKIŞ OLARAK AYARLANDI
    MOVWF TRISD
    MOVLW B'11110000' ;B PORTU GİRİŞ-ÇIKIŞ OLARAK AYARLANDI
    MOVWF TRISB
    MOVLW B'10011000'
    MOVWF INTCON
    MOVLW B'10000000'
    MOVWF OPTION_REG
    BCF STATUS,RP0 ;BANK 0 A GEÇTİK
    MOVLW B'00001111'
    MOVWF PORTB
    MOVLW D'17'            ;Lcd de 16 karakterden sonra başa dönmesi için
    MOVWF SAYAC_LCD            ;gerekli olan sayac'ın değeri atandı

    CALL TEMIZLE
    CALL SATIR2            ;Lcd 2. Satıra Geçiyor
    CALL ALT            ;2. Satıra isim yazdırılıyor
    CALL SATIR1            ;1. Satıra geri dönüyor
    DONGU
    GOTO DONGU
END

Hiç yorum yok:

Yorum Gönder