Şimdi Ara

16f628 ile LCD sürmek için assembly kodu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
11
Cevap
0
Favori
7.928
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • LCD kullanmak için genelde daha kolay oluyor diye ccs,pic basic kullanılıyor.Ben assembly dilini kullanıyorum.Örnek oluşturması açısından assembly koduna ihtiyacım var.Biraz zor oluyor anladığım kadarıyla bunu asm de yapmak.Ama ben asm de yapmak istiyorum,yardımlarınızı bekliyorum.



  • aslına bakarsan o kadar da zor değil nette elektronikhobi.com da böyle bi örnek var ayrıca altaş yayınlarının pic16f84 uygulamaları kitabında da lcd sürme hakkinda kapsamlı bilgiler var. kolay gelsin
  • Madem picbasicpro ile kolay oluyor ozaman sende demosunu indir ve basit bir porogram yaz sonra derle hex dosyasını icprog ile aç orada hex asm ye dönüştürülüyor böylece sağlıklı çalışan bir asm porogram elde edceksin sonra değerlerle oynayarak lcd ye istediğini yazarsın




  • 16f84 için bir asm programı buldum çalışıyor fakat bunu 16f628a ya uyarlamak istedim ama LCD çalışmadı simülasyonda.Problem nerede anlayamadım?
    LIST P=16F84 include <p16f84.inc> kısmını LIST P=16F628A include <p16f628A.inc> yapıyorum ama çıkış vermiyor.
    Program şöyle;

    LIST P=16F628A
    include <p16f628A.inc>

    LCD_DATA EQU PORTB
    LCD_DATA_TRIS EQU TRISB
    LCD_CTRL EQU PORTA
    LCD_LINE0 EQU 0x000
    LCD_LINE1 EQU 0x040
    LCD_LINE2 EQU 0x014
    LCD_LINE3 EQU 0x054

    ; PORTA bitleri
    LCD_E EQU 2 ; LCD Enable kontrol hattı
    LCD_RW EQU 1 ; LCD Okuma/Yazma kontrol hattı
    LCD_RS EQU 0 ; LCD Saklayıcı seçim kontrol hattı

    ; misc.
    LCD_TEMP EQU 0x020 ; LCD alt programlarında kullanıyoruz
    TABLE_INDEX EQU 0x021 ; Tablo satırlarını tutmak için
    COUNT EQU 0x022 ; Sayaç için
    DELAY equ 0x023 ; DELAYxxx gecikme fonksiyonu için
    X_DELAY equ 0x024 ; X_DELAYxxx gecikme fonksiyonu için


    ;*****************************************************************************
    ; Program başlangıç
    ;*****************************************************************************
    START
    CLRF STATUS ; Do initialization, Select bank 0
    CLRF PORTA ; Tüm portların çıkışları düşük yap
    CLRF PORTB

    BSF STATUS, RP0 ; Bank 1 seç
    MOVLW 0x0F8 ; RA2-0 çıkış, RA4-3 giriş
    MOVWF TRISA
    MOVLW 0x000 ; RB7-0 çıkış
    MOVWF TRISB
    BSF OPTION_REG, NOT_RBPU
    ; PORTB pull-upları temizle

    BCF STATUS, RP0 ; Bank 0 seç

    CALL LCDINIT ; Initialize LCDisplay


    ;*****************************************************************************
    ; Satırları LCD ye yaz
    ;*****************************************************************************
    MOVLW 0x030 ; ASCII '0'
    MOVWF COUNT
    MOVLW LCD_LINE0 ; 1. Satırın adresini W ye yükle
    CALL LCDSDDA ; Kürsörü W deki satıra ve sol başa al
    CALL TABLE_MSG ; Mesajı göster (LUTFEN)

    MOVLW LCD_LINE1 ; 2. Satırın adresini W ye yükle
    CALL LCDSDDA ; Kürsörü W deki satıra ve sol başa al
    CALL TABLE_MSG2 ; Mesajı göster (BEKLEYIN)

    ;*****************************************************************************
    ; Program burada bitiyor
    ;*****************************************************************************
    LOOP
    GOTO LOOP ; Kısır döngüye giriliyor

    ;*****************************************************************************
    ; Send a message using a table to output a message
    ;*****************************************************************************
    TABLE_MSG
    MOVLW 0 ; Mesaj tablosu indexi için W=0 yapılıyor
    DISP_MSG
    MOVWF TABLE_INDEX ; TABLE_INDEX değişkenine W değeri atanıyor
    CALL MSG1
    ANDLW 0x0FF ; Mesajın sonu geldimi?
    BTFSC STATUS, Z ; (geldi ise 0 döndür (Z=zero)
    GOTO TABLE_MSG_END
    CALL LCDPUTCHAR ; Karekteri göster
    MOVF TABLE_INDEX, W ; Tablodan bir sonraki karekteri al
    ADDLW 1
    GOTO DISP_MSG
    TABLE_MSG_END RETURN

    TABLE_MSG2
    MOVLW 0 ; Mesaj tablosu indexi için W=0 yapılıyor
    DISP_MSG2
    MOVWF TABLE_INDEX ; TABLE_INDEX değişkenine W değeri atanıyor
    CALL MSG2
    ANDLW 0x0FF ; Mesajın sonu geldimi?
    BTFSC STATUS, Z ; (geldi ise 0 döndür (Z=zero)
    GOTO TABLE_MSG2_END
    CALL LCDPUTCHAR ; Karekteri göster
    MOVF TABLE_INDEX, W ; Tablodan bir sonraki karekteri al
    ADDLW 1
    GOTO DISP_MSG2
    TABLE_MSG2_END RETURN




    ;*****************************************************************************
    ; LCD Modül alt rutinleri
    ;*****************************************************************************
    ;
    ;=============================================================================
    ; LCDINIT
    ; LCD açılış rutini
    ; İsteğe göre değiştirilebilir(örneğin kürsör açık/kapalı vb.)
    ; Tablo 2 den komutlara bakınız.
    ;=============================================================================
    LCDINIT
    ; Meşgul bayrağı henüz geçerli değil
    CLRF LCD_CTRL ; PORTA çıkışlarının tümü düşük.
    ; power-up gecikmesi
    MOVLW 0x01E
    CALL X_DELAY500 ; 30 * 0.5mS = 15mS
    ; Meşgul bayrağı artık geçerli
    MOVLW 0x038 ; 8-bit-arayüz, 2-satır
    CALL LCDPUTCMD
    MOVLW 0x000 ; disp. kapat, kürs. kapat, blink kapat
    CALL LCDDMODE
    CALL LCDCLEAR
    MOVLW 0x004 ; disp.aç, kürs.kapat
    CALL LCDDMODE
    MOVLW 0x002 ; otomatik artış (shift-cursor)
    CALL LCDEMODE
    RETURN
    ;=============================================================================
    ; LCDBUSY
    ; Meşgul bayrağının busy-flag pasif olduğunu
    ;=============================================================================
    LCDBUSY
    BSF STATUS,RP0 ; Bank 1 seç
    MOVLW 0x0FF ; PORTB giriş için ayarla
    MOVWF LCD_DATA_TRIS
    BCF STATUS, RP0 ; Bank 0 seç
    BCF LCD_CTRL, LCD_RS; Komut saklıyıcısı seç
    BSF LCD_CTRL, LCD_RW; Meşgul bayrağını okumaya ayarla
    BSF LCD_CTRL, LCD_E ; LCD E hattı yüksek yap
    MOVF LCD_DATA, W ; Meşgul bayrağını oku
    BCF LCD_CTRL, LCD_E ; LCD E hattı düşük
    ANDLW 0x80 ; Meşgul bayrağını kontrol et, Yüksek = Meşgul
    BTFSS STATUS, Z
    GOTO LCDBUSY
    LCDNOTBUSY BCF LCD_CTRL, LCD_RW
    BSF STATUS, RP0 ; Bank 1 seç
    MOVLW 0x000
    MOVWF LCD_DATA_TRIS ; PORTB çıkış
    BCF STATUS, RP0 ; Bank 0 seç
    RETURN
    ;=============================================================================
    ; LCDCLEAR
    ; Paneli temizle ve kürsörü başa al (sol-üst köşe).
    ;
    ;=============================================================================
    LCDCLEAR
    MOVLW 0x001
    CALL LCDPUTCMD
    RETURN
    ;=============================================================================
    ; LCDEMODE
    ; Sets entry mode of display.
    ; Required entry mode must be set in W
    ; b0 : 0 = no display shift 1 = display shift
    ; b1 : 0 = auto-decrement 1 = auto-increment
    ; b2-7 : don't care
    ; OK
    ;=============================================================================
    LCDEMODE
    ANDLW 0x003 ; Strip upper bits
    IORLW 0x004 ; Function set
    CALL LCDPUTCMD
    RETURN
    ;=============================================================================
    ; LCDDMODE
    ; Sets display control.
    ; Required display mode must be set in W
    ; b0 : 0 = cursor blink off 1 = cursor blink on
    ; b1 : 0 = cursor off 1 = cursor on
    ; b2 : 0 = display off 1 = display on (display data remains in DDRAM)
    ; b3-7 : don't care
    ; OK
    ;=============================================================================
    LCDDMODE
    ANDLW 0x007 ; Strip upper bits
    IORLW 0x008 ; Function set
    CALL LCDPUTCMD
    RETURN
    ;=============================================================================
    ; LCDSDDA
    ; Sets the Display-Data-RAM address. DDRAM data is read/written after
    ; this setting.
    ; Required DDRAM address must be set in W
    ; b0-6 : required DDRAM address
    ; b7 : don't care
    ; OK
    ;=============================================================================
    LCDSDDA
    IORLW 0x080 ; Function set
    CALL LCDPUTCMD
    RETURN
    ;=============================================================================
    ; LCDPUTCHAR
    ; Sends character to LCD
    ; Required character must be in W
    ; OK
    ;=============================================================================
    LCDPUTCHAR
    MOVWF LCD_TEMP ; W deki karekteri geçici değişkene at
    CALL LCDBUSY ; LCD hazır olana kadar bekle
    BCF LCD_CTRL, LCD_RW; LCD okuma moduna al
    BSF LCD_CTRL, LCD_RS; Veri saklayıcısı seç
    BSF LCD_CTRL, LCD_E ; LCD E-hattı Yüksek
    MOVF LCD_TEMP, W ; Geçici değişkeni tekrar W ye aktar
    MOVWF LCD_DATA ; LCD ye veriyi gönder
    BCF LCD_CTRL, LCD_E ; LCD E-hattı düşük
    RETURN
    ;=============================================================================
    ; LCDPUTCMD
    ; W deki komutu LCD ye gönderir
    ;=============================================================================
    LCDPUTCMD
    MOVWF LCD_TEMP ; W deki komutu geçici değişkene at
    CALL LCDBUSY ; LCD hazır olana kadar bekle
    BCF LCD_CTRL, LCD_RW; LCD okuma moduna al
    BCF LCD_CTRL, LCD_RS; Komut saklayıcısı seç
    BSF LCD_CTRL, LCD_E ; LCD E-hattı yüksek
    MOVF LCD_TEMP, W ; Geçici değişkeni tekrar W ye yükle
    MOVWF LCD_DATA ; LCD ye komudu gönder
    BCF LCD_CTRL, LCD_E ; LCD E-hattı düşük
    RETURN
    ;*****************************************************************************
    ;Gecikme rutinleri
    ;*****************************************************************************
    DELAY500 MOVLW D'165' ; +1 1 cycle
    MOVWF DELAY ; +2 1 cycle
    DELAY500_LOOP DECFSZ DELAY, F ; step 1 1 cycle
    GOTO DELAY500_LOOP ; step 2 2 cycles
    DELAY500_END RETURN ; +3 2 cycles

    X_DELAY500 MOVWF X_DELAY ; +1 1 cycle
    X_DELAY500_LOOP CALL DELAY500 ; step1 wait 500uSec
    DECFSZ X_DELAY, F ; step2 1 cycle
    GOTO X_DELAY500_LOOP ; step3 2 cycles
    X_DELAY500_END RETURN ; +2 2 cycles

    ;=============================================================================
    ; Gösterilecek Mesajlar
    ;=============================================================================
    MSG1
    addwf PCL ,F ;W de belirtilen karektere atla
    retlw 'L'
    retlw 'U'
    retlw 'T'
    retlw 'F'
    retlw 'E'
    retlw 'N'
    MSG1_END
    retlw 0
    MSG2
    addwf PCL ,F ;W de belirtilen karektere atla
    retlw 'B'
    retlw 'E'
    retlw 'K'
    retlw 'L'
    retlw 'E'
    retlw 'Y'
    retlw 'I'
    retlw 'N'
    retlw 'I'
    retlw 'Z'


    MSG2_END
    retlw 0
    END ; Program Sonu




  • arkadaşlar pic16f628 ile lcd ye "MERHABA" yazan örnek bir program ve şeması aşagıda



    CLRF 0x32
    GOTO Label_0001
    Label_000E MOVWF 0x27
    BCF PORTB , 01
    BCF PORTB , 00
    BCF PORTB , 00
    BSF STATUS , RP0
    BCF TRISB , 01
    BCF TRISB , 00
    BCF TRISB , 00
    MOVLW 0xF0
    ANDWF TRISA , f
    BCF STATUS , RP0
    MOVF 0x27 , W
    BTFSC 0x32 , 01
    GOTO Label_0002
    MOVLW 0x3A
    MOVWF 0x21
    MOVLW 0x98
    CALL Label_0003
    MOVLW 0x33
    MOVWF 0x26
    CALL Label_0004
    MOVLW 0x13
    MOVWF 0x21
    MOVLW 0x88
    CALL Label_0003
    CALL Label_0004
    MOVLW 0x64
    CALL Label_0005
    CALL Label_0004
    MOVLW 0x64
    CALL Label_0005
    MOVLW 0x22
    MOVWF 0x26
    CALL Label_0004
    MOVLW 0x28
    CALL Label_0006
    MOVLW 0x0C
    CALL Label_0006
    MOVLW 0x06
    CALL Label_0006
    BSF 0x32 , 01
    MOVF 0x27 , W
    GOTO Label_0002
    Label_0006 BSF 0x32 , 00
    Label_0002 MOVWF 0x26
    BTFSS 0x32 , 00
    GOTO Label_0007
    BCF PORTB , 00
    SUBLW 0x03
    BTFSS STATUS , C
    GOTO Label_0008
    CALL Label_0008
    MOVLW 0x07
    MOVWF 0x21
    MOVLW 0xD0
    CALL Label_0003
    BSF STATUS , C
    RETURN
    Label_0007 BSF 0x32 , 00
    SUBLW 0xFE
    BTFSC STATUS , Z
    GOTO Label_0009
    BSF PORTB , 00
    Label_0008 SWAPF 0x26 , f
    BTFSS 0x32 , 00
    Label_0004 BCF 0x32 , 00
    BSF PORTB , 01
    MOVLW 0xF0
    ANDWF PORTA , f
    MOVF 0x26 , W
    ANDLW 0x0F
    IORWF PORTA , f
    BCF PORTB , 01
    SWAPF 0x26 , f
    BTFSC 0x32 , 00
    GOTO Label_0004
    MOVLW 0x32
    CALL Label_0005
    BSF STATUS , C
    RETURN
    Label_0005 CLRF 0x21
    Label_0003 ADDLW 0xE8
    MOVWF 0x20
    COMF 0x21 , f
    MOVLW 0xFC
    BTFSS STATUS , C
    GOTO Label_000A
    Label_000B ADDWF 0x20 , f
    BTFSC STATUS , C
    GOTO Label_000B
    Label_000A ADDWF 0x20 , f
    CLRWDT
    INCFSZ 0x21 , f
    GOTO Label_000B
    BTFSC 0x20 , 00
    GOTO Label_000C
    Label_000C BTFSS 0x20 , 01
    GOTO Label_000D
    NOP
    GOTO Label_000D
    Label_000D RETURN
    Label_0009 BCF STATUS , IRP
    BCF STATUS , RP1
    BCF STATUS , RP0
    CLRWDT
    RETURN
    Label_0001 MOVLW 0xFE
    CALL Label_000E
    MOVLW 0x01
    CALL Label_000E
    MOVLW 0x4D
    CALL Label_000E
    MOVLW 0x45
    CALL Label_000E
    MOVLW 0x52
    CALL Label_000E
    MOVLW 0x48
    CALL Label_000E
    MOVLW 0x41
    CALL Label_000E
    MOVLW 0x42
    CALL Label_000E
    MOVLW 0x41
    CALL Label_000E
    Label_000F CLRWDT
    GOTO Label_000F
    Label_0010 SLEEP
    GOTO Label_0010
    END



     16f628 ile  LCD sürmek için assembly kodu




  • yukarıdaki asm nin son kısmında ki;

    CALL Label_000E
    MOVLW 0x01

    komutları lcd ye karakterleri yazdırıyor. mesela 0x01 M harfinin karşılıgıdır.

    bu şekilde sayılar degiştirilip yazı degiştirilebilinir
  • quote:

    Orjinalden alıntı: victim1

    yukarıdaki asm nin son kısmında ki;

    CALL Label_000E
    MOVLW 0x01

    komutları lcd ye karakterleri yazdırıyor. mesela 0x01 M harfinin karşılıgıdır.

    bu şekilde sayılar degiştirilip yazı degiştirilebilinir

    bu harflerin karşılığı tablo halinde var mı?
  • http://www.geocities.com/dinceraydin/lcd/index.html
    adresinde "Character Type LCD" başlığı altında aradığınızı bulabilirsiniz.
    assembly ile zor iş. Allah yardımcınız olsun...
  • alpinist16 kullanıcısına yanıt

    alpinist kardeşim, o 16f84 asm programını bana gönderirmisin lütfen??? ben daha işin başındayım..

  • ogzrdl O kullanıcısına yanıt

    :) 17 yıl oldu, pc format atmıştır çoktan

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.