Merhaba ,
Yapmak istediğim DDS-VFO lara ait bir kaç proje var , ikisinde de asm kaynak kodları ve şema mevcut , Vfo da 2x16 lcd değil de 64x128 Glcd kullanmak istiyorum , yazıları daha büyük fontta yazdırmak , belki sağa sola sabit bir kaç grafik yerleştirmek vs ...
Projelerden birinde 2 adet birbiri ile de haberleşen 16f877 kullanılmış ancak 2x16 lcd ye kumanda eden picin başka işlevleri de var portlar dolu .
Diğer projede ise bir adet 16f84 kullanılmış , lcd , rotary encoder , key , dds modülle haberleşme vs ile ...
Böyle bir dönüşüm kolaymıdır , nasıl yapmak nerden başlamak gerekir.
İki 16f877 li projeye bir pic daha mı eklemek gerekir?
Bildiğin her şey kolay bilmediğin zor,
bu söz burayada çok uygun.
Asm ile lcd ve glcd kontrol eden kodları yazdıysanız
veya en azından hazır bir örneği inceleyip iyice anladıysanız
böyle bir projeyi yapabilirsiniz.
Portların dolu olması önemli değil çözülür.
Asm glcd örnekleri forumda vardı,
benim denediğimde vardı (paylaşmışta olabilrim hatırlamıyorum).
Ama C öğrenip çok daha kısa sürede
ve kolaylıkla yapabilirsiniz.
Merhaba , çözmeye çalıştığım asm yazılımında anlayamadığım eşitlemeler yapılmış , tırnak içinde nokta ve tırnak içinde tire karekterleri var bunlar ne iş görüyor , yazılımının bu bölümünde ne yapılmış ? Elimdeki kitaplarla çözemedim .
; Info for power-up display
MCODE_REV_0 equ '7' ; Current code version is 7.4
MCODE_REV_1 equ '.' ;
MCODE_REV_2 equ '4' ;
MCODE_REV_3 equ '6' ;
#ifdef AD9850
; changed from 30 to 62
MCODE_REV_4 equ '6' ;
MCODE_REV_5 equ '2' ;
#endif
#ifdef AD9851
MCODE_REV_4 equ '6' ;
MCODE_REV_5 equ '0' ;
#endif
#ifdef MULTBY2
MCODE_REV_6 equ 'x' ;
MCODE_REV_7 equ '2' ;
#else
#ifdef MULTBY4
MCODE_REV_6 equ 'x' ;
MCODE_REV_7 equ '4' ;
#else
MCODE_REV_6 equ ' ' ;
MCODE_REV_7 equ ' ' ;
#endif
#endif
İki nokta var burada;
biri equ diğeri #if #ifdef vs.
equ nun buradaki kullanımı
birşeyi başka bir şey ile ifade etme
sembol gibi düşünülebilir
tabi burada atanan ifade bir sabit.
Misal afaki bir örnek vereyim
led toggle yapan bir program yazdık
programda bekleme süresini belirleyen altprogramda
değişken olan sayaç değerlerine ilk yükleme değerlerini
movlw 04h;
movwf sayac1;
gibi atıyoruz,
bunun yerine, programın başında
bekle_sabit equ 04h
deyip
daha sonra bekleme rutininde
movlw bekle_sabit ; bu kısım yukarıdaki tanımlamadan ötürü movlw 04h ile aynı olur
movwf sayac1 ;
#ifdef ise şöyle
#ifdef karşısında birşey
....
#endif
eğer karşısındaki şey programda tanımlanmış ise
(#define karşısındaki şey seklinde)
endif e kadar olan kısmı derler.
bunlar preprocessor önişlemci komutları,
programın nasıl derleneceğini belirleyen komutlar.
Yani yukarıdaki programda
programın hangi kısmı ne zaman neye göre derlensin diye böylebir sistem yapılmış.
@Ramu hocam , çok teşekkür ederim. Ben de öyle düşünmüştüm ama tırnak içinde ( '.' ) nokta ve tırnak içinde ( '-' ) tire nasıl değer olarak atanır ? Şimdi düşünüyorum da LCD ye karakter yazdırmak için mi mesela 14.100 Mhz in noktasını mı tanımlıyor acaba ?
Evet.
Tırnak içinde yazılan değerin direk ascii karşılığını
derleyici kendi sayı değeri olarak çevirir,
misal
movlw 'A'
movlw 41h
movlw .65
hepsi aynıdır, hepside W register ına decimal 65 sayısını yükler,
wiev disassembly listing den kontrol edilebilir.
mesaj birleştirme:: 29 Nisan 2015, 19:02:27
Aslında nokta büyük ihtimalle
versiyon numarası için yazılmıştır verdiğin kısımda.
Ama mantık aynı.
Pic asambly de 35 adet işlemci komutu dışında kullanılabilen diğer komut vb .. nerden bulabilirim ? Elimde asambly öğretiyorum iddeasında olan iki üç kitap var ama sadece 35 komutu vermişler.
16f için sadece 35 komut var zaten.
İngilizce kaynak olur mu?
Hocam elimeki kitap da öyle yazıyor ama sonra "deyim" diyor " "org" mesela . Bana bu deyim meyim söylem möylem , asm programı yazılırken ne kullanılabiliyorsa hepsini içeren bir kaynak lazım ama zannedersem Türkçe olarak yok . E-book da olabilir . Bu deyim konusu da kafamı karıştırdı ya yeteri kadar. Eğer programı yazarken sizin atadığınız bir etiket değilse , programa veya pic e bir iş yaptırıyorsa bu deyim meyim olmaz resmen komut olur. Burda benim bilmediğim şey şu mu , komutlar var pic e iş yaptırıyor , komutlar var programa iş yaptırıyor , böyle mi yani ?
Not : aradıklarımın bir kısmını "http://robot.ee.hacettepe.edu.tr/Dosyalar/makaleler/Pic_Assembly_ve_Makrolar.pdf" adresinde buldum , mesela bendeki programda #define kullanılmıştı. Üniversitelerde o kadar hocamız var ,bir tanesi Allah rızası için doğru dürüst bir Pic Asambler kitabı yazsa olmaz mı ?
Şimdiki merakım şu programda hiç bir atama yapılmadan peş peşe 30 - 40 etiket yazılmış . Mesela ;
...
CBLOCK RAMSTART
ENC_HISTORY ; Last 4 samples of encoder state.
COUNT_0 ; Counter for delay routine.
COUNT_1 ; General counter variables.
COUNT_2 ; ** All variables from here to the end **
COUNT_3 ; of RAM are cleared at power up.
COUNT_4 ;
TEMP_1 ; Temporary storage.
TEMP_2 ; "
TEMP_3 ; "
ENC_COUNTER ; 1 to 38 = CW. -1 to -38 = CCW.
INT_COUNT ; 8 to 1. Decremented every 1.024 mS.
SW_B_CNT ; CAL switch pressed counter. (x 8mS)
SW_B_OLD ; State of old switch count.
SW_C_CNT ; TX switch pressed counter. (x 8mS)
SW_BC_CNT ; RIT switch pressed counter. (x 8mS)
SW_BC_OLD ; State of old switch count.
TIMEOUT_L ; 16 bit display timeout down counter,
TIMEOUT_H ; return to main display when = 0.
EEPROM_WRITE ; EEPROM write update down counter.
FLAGS ; 8 misc flags.
FLAG2 ; "
FREQUENCY:5 ; 40 bit frequency.
STEP_NUM ; LCD cursor pos & step size num.(0-7)
; (Do not separate frequency & STEP_SIZE)
STEP_RATE ;
DDS_OLD:5 ; 40 bit previous DDS freq.
ARG1_10 ; MSD. 11 byte ASCII buffer.
ARG1_9 ; MSD. \
ARG1_8 ; |
ARG1_7 ; |
ARG1_6 ; |
ARG1_5 ; | 80 bit maths buffer.
ARG1_4 ; |
ARG1_3 ; |
ARG1_2 ; |
ARG1_1 ; |
ARG1_0 ; LSD. /
ARG2_4 ; MSD. \
ARG2_3 ; |
ARG2_2 ; | 40 bit maths buffer.
ARG2_1 ; |
ARG2_0 ; LSD. /
ARG3_4 ; MSD. \
ARG3_3 ; |
ARG3_2 ; | 40 bit maths buffer.
ARG3_1 ; |
ARG3_0 ; LSD. /
ARG4_4 ; MSD. \
ARG4_3 ; |
ARG4_2 ; | 40 bit maths buffer.
ARG4_1 ; |
ARG4_0 ; LSD. /
ENDC
-- Bu atanmamış etiketler ne işe yarıyor ?
-- CBLOCK RAMSTART nedir bunlar ? biri komut diğeri etiket mi , atama mı ?
Eminim güzel kitaplar var ama
ben kitapdan öğrenmediğim için
kitap tavsiyesi veremiyorum.
Birde sadece pic için asm biliyorum
daha pc tarafında veya diğer mikrodenetleyici ve
microişlemciler için vs. kullanılanı var.
Pic için dediğiniz gibi oluyor,
mikrodenetleyicinin program hafızasına yazılacak olan
program için 35 adet (16f için) komut var,
bunun yanında kullandığımız ide (misal mplab) ve
kullandığımız derleyici (misal mpasm) için
komutlar (önişlemci komutları) deyimler var.
Asm yazarken dahi işleri kolaylaştırmak lazım
bu nedenle bu önişlemci komutları mevcut.
cblock -başlangıç adresi-
...
endc
burada cblock karşısına başlangıç adresi veriliyor,
misal equ tanımlamalarını 0x20 den başlatıyoruzya
cblock 20h diye yazıyoruz,
sonra equ ile tanımlayacaktık değişkenleri ama
artık cblock yazdık ardına tüm değişkenlerimizi yazıyoruz,
oda sırayla adreslere değişkenleri eşitliyor
örneğin
deg1 equ 20h
deg2 equ 21h
deg3 equ 22h
diyeceğimize
cblock 20h
deg1
deg2
deg3
endc
demek aynı işi yapar.
sizin kodda RAMSTART dediği
kullandığınız mcu kullanıcı(user) ram bölgesi nereden başlıyorsa
(misal 16f877 için 20h adresi)
bu değerin atanmış olduğu bir sabittir
bunuda kullanıcı kendi atamıştır %90.
bir yerde RAMSTART equ 20h veya
(doğrumu hatırlamıyorum #define RAMSTART 20h )
diye bir atama vardır programda.
Bunlarda mcu dan mcu ya kolay aktarılabilecek
veya kolay değişiklik yapılabilecek asm kodları yazmak için yöntem diyebiliriz.
Aslında ide-derleyici kullanmadan da asm kod yazabilirsiniz
http://danamlund.dk/pic_microcontroller_blinking_led_without_cheating.html (http://danamlund.dk/pic_microcontroller_blinking_led_without_cheating.html)
Ben genelde merak ettiğim şeyi nete yazıp aradım öğrendim
birde microchip in kaynaklarından faydalandım
http://ww1.microchip.com/downloads/en/DeviceDoc/33014L.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/33014L.pdf)
@Ramu hocam çok teşekkür ederim , bir kaç tane yazılım var aynı iş için bunları inceliyorum yukarıdaki kodlarda #define RAMStart yok ama yazarken gözümden kaçmış INCLUDE "DD_SYNTH.DAT" dosyası var. Basitleştirmek için ek dosyaları olmayan yazılımda yoğunlaşıyorum , bununla alakalı bir sorum var.
; * Assign names to IO pins. *
; ****************************************************************************
;
; B register bits:
;
DDS_clk equ 0x02 ; AD9850/AD9851 write clock
DDS_dat equ 0x03 ; AD9850/AD9851 serial data input
LCD_busy equ 0x03 ; LCD busy bit
LCD_e equ 0x04 ; 0=disable, 1=enable
LCD_rw equ 0x05 ; 0=write, 1=read
LCD_rs equ 0x06 ; 0=instruction, 1=data
DDS_load equ 0x07 ; Update pin on AD9850/AD9851
;
; A register bits:
;
speaker equ 0x02 ; Speaker (always exit with a low output)
pb_3 equ 0x02 ; PB also on this pin
pb_2 equ 0x03 ; Bandswitch Pushbutton,
pb_1 equ 0x04 ; Tuning-increment/Calibrate Pushbutton
;
Göreceğiniz gibi işlemcinin pinlerine bağlı elemanlar adreslenmiş ancak , burda hiç bank veya port değiştirilmeden mesela 0x02 adresine ad9850 dds clk bağlamış (yukarıda da picin şeması var ) dds clk RB2 pinine bağlı milkro işlemcinin. Sonra hiç bank port değiştirmeden hemen devamında 0x02 ye speaker bağlamış şemada bu RA2 pininde
hemen altındaki kodda da yine 0x02 adresine pb_3 bağlamış ...
yani 0x02 hem RB2 için adresleniyor hem RA2 burda program veya pic bu adresi nasıl karıştırmıyor ?
Target Controller - PIC16F628A in PIC-EL board
; __________
; PB_3-Speaker----RA2 |1 18| RA1---------ENCODER A
; PB_2-Bandswitch-RA3 |2 17| RA0---------ENCODER B
; PB_1-Tuning etc-RA4 |3 16| OSC1--------XTAL
; +5V-----------!MCLR |4 15| OSC2--------XTAL
; Ground----------Vss |5 14| VDD---------+5 V
; LCD D4----------RB0 |6 13| RB7---------DDS_LOAD
; LCD D5----------RB1 |7 12| RB6---------LCD_rs (LCD Pin 4)
; LCD D6/DDS_CLK--RB2 |8 11| RB5---------LCD_rw (LCD Pin 5)
; LCD D7/DDS_DATA-RB3 |9 10| RB4---------LCD_e (LCD Pin 6)
; ----------
Burada bir kelimeye veya sembol diyelim
rakam atanmış,
bu sayede misal
eğer
DDS_clk equ 0x02 ; AD9850/AD9851 write clock
yazılırsa;
("ad9850 clk RB2 pinine bağlı")
BSF PORTB,2
yerine
BSF PORTB,DDS_clk equ
diyebiliriz demek oluyor,
Farklı kelimelere aynı rakam değeri atanabilir,
bunda bir problem yoktur,
bu sayede
speaker equ 0x02 ; Speaker (always exit with a low output)
yazarsak;
BSF PORTA,2
yerine
BSF PORTA,speaker
yazılabilir.
Bu işlemlerin pic içinde işleyek programla hiçbir ilgisi yok,
hepsi derleyici için yapılıyor.
mesaj birleştirme:: 30 Nisan 2015, 15:12:11
Faydası ne?
Şimdi bu programda normalde
LCD_e equ 0x04 ; 0=disable, 1=enable
LCD_rw equ 0x05 ; 0=write, 1=read
yazılmış,
biz lcd_e pini ile
lcd_rw pinini yerlerini değiştirmek istiyoruz,
LCD_e equ 0x05 ; 0=disable, 1=enable
LCD_rw equ 0x04 ; 0=write, 1=read
şeklinde değiştirmemiz yeterli.
Aksi halde
lcd_e ve lcd_rw nin
bsf portx,5
vs. gibi kullanılan bütün
komutlarını tek tek oturup değiştirmek zorunda kalacaktık.
Yani şöyle anladım , burda genel adresleme yapılıyor , asıl komutlar yazılırken bank/port seçimi yapılacak o zaman program o port için bu adrese bakacak . Verdiğiniz linkleri inceliyorum , teşekkürler selam ve saygılar.
Ben teşekkür ederim,
sorunuz olursa çekinmeyin.
Birde bu projeyi yaptıktan sonra
birde C ile yapın aynı işi.
AD985x in datasheet inide incelemekte fayda var,
programı anlamanızı çok kolaylaştırır,
bir asm programın ne işi nasıl yaptığını anlamak çok zordur.
Hocam benim bu programı tamamiyle anlayıp böyle programlar yazmam imkansız. Yapmaya çalıştığım şey lcd ekranı (ve mecburen pic i) değiştirip 18f452 + glcd bağlamak . Düşündüğüm yol ise asm yazılımını pic-lcd değişikliğiyle mikroc içinde kullanmak .
Asm yi karıştırmayın,
sadece mikroc kullanın çok çok daha kolay olur.
Asm nin kodlarına dahi bakmanıza gerek yok,
program neler yapıyor ne iş görüyor bunu
programın çalışmasından dahi anlamak projeyi yapmanız için yeterli.
Ayrıca daha öncede söyledim pici de değiştirmeniz gerekmiyor.
MErhaba , ne kadar araştırdysam hep GLCD ye resim yazdırma programları var . Asm ile GLCD nin istediğimiz satırında değişik fontlarla yazı (karakter) yazdırabileceğimiz bir örnek uygulama arıyorum .
Şu konuda resim için olanla başlamıştım:
https://www.picproje.org/index.php/topic,28106.msg251351.html#msg251351 (https://www.picproje.org/index.php/topic,28106.msg251351.html#msg251351)
Alıntı yapılan: Mujdat117 - 21 Eylül 2011, 14:50:59
MERHABA 320X240 GLCD İLE ÇALIMADIM FAKAT 128X64 GLCD İLE ASM KODLARIYLA ÖRNEK YAPTIM HATTA BU SİTEDEDE YAYINLADI ARTI KONVERT PROGRAMI YAZDIM AŞAĞIDAKİ LİNKLERDEN ULAŞABLİRSİNİZ UMARIM FAYDASINI GÖRÜRSÜNÜZ.
https://www.picproje.org/index.php/topic,34714.0.html (https://www.picproje.org/index.php/topic,34714.0.html)
https://www.picproje.org/index.php/topic,34937.0.html (https://www.picproje.org/index.php/topic,34937.0.html)
VİDE GÖRÜNTÜLERİNİN OLDUĞU DİĞER LİNKLER
http://www.mcu-turkey.com/?p=14322 (http://www.mcu-turkey.com/?p=14322)
http://www.mcu-turkey.com/?p=15724 (http://www.mcu-turkey.com/?p=15724)
Sonra
http://www.microchip.com/forums/m457635-print.aspx (http://www.microchip.com/forums/m457635-print.aspx)
bu sitedeki kodu denedim, küçük fontunuda oluşturmuştum
ama font işi biraz zorlar.
Benim dedediğim hallerinden biri aşağıda:
https://www.mediafire.com/?2qg1ehprfh993gi (https://www.mediafire.com/?2qg1ehprfh993gi)
;===============================================================================
; GLCD Driver
;-------------------------------------------------------------------------------
;
;INTERNAL 4MHZ SELECTED
;
;----------------------------------
;HAZIRLAYAN R. MUHAMMET TULAY
;NOT!
;KODLAR EĞİTİM AMAÇLI HAZIRLANMIŞTIR
;KAYNAK:
;http://www.microchip.com/forums/m457635-print.aspx
;SİTESİNDE BULUNAN BITWISE NICKLI UYENIN YAZMIS OLDUGU, SPIKE NICKLI UYENIN
;YAYINLADIGI GLCD PROGRAMI KULLANILMIS GEREKLI DUZENLEMELER DEGISIKLIKLER EKLER
;TARAFIMCA YAPILMISTIR
;KULLANACAK KISILERE BASARILAR DILER VE TECRUBELERINI PAYLASMALARINI TEMENNİ EDERİM
;RaMu ucanel@outlook.com
;-----------------------------------
;NOTES...
;.........PORTA IS SET TO A2D ON POWER UP.......
;
;4MHZ XTAL 1U/SEC CLOCK
;CONNECTIONS TO DISPLAYTECH 64128C
;
;************LCD******************
;PIN CONNECTION
;1 +VE +4.5 - 5.5V DC
;2 VSS GROUND
;3 VO -3V DC
;4 DB0\
;5 DB1 \
;6 DB2 \ DATA <>
;7 DB3 \
;8 DB4 / RESET IND
;9 DB5 / ON/OFF IND
;10 DB6 /
;11 DB7/ BUSY IND
;12 CS1 CHIP SELECT 1
;13 CS2 CHIP SELECT 2
;14 RESET RESET
;15 R/W READ/WRITE
;16 D/I DATA/INSTRUCTION
;17 E ENABLE
;18 FG FRAME GROUND
;19 +LED BACKLIGHT\ +4.2 - 4.6 V DC (150mA)
;20 -LED BACKLIGHT
;
;***********PIC******************** ;degismis olabilir isis çizime bakınız
;PORTA LCD
;RA0 EN ENABLE
;RA1 CS1 CHIP SELECT 1
;RA2 CS2 CHIP SELECT 2
;RA3 D/I DATA/INSTRUCTION
;RA4 R/W READ/WRITE
;RA5 SPARE
;RA6 SPARE
;RA7 RESET DISPLAY RESET
;----------------------------------------
;PORTB LCD
;RB0 RB0\
;RB1 RB1 \
;RB2 RB2 \
;RB3 RB3 \ 8 BIT DATA LINE
;RB4 RB4 /
;RB5 RB5 /
;RB6 RB6 /
;RB7 RB7/
;
;-------------------------------------------------------------------------------
ERRORLEVEL -203,-205,-206,-302,-305
list p=16f877a ; kullanılan pic tanıt
#include <p16f877a.inc> ;
;===============================================================================
; Fuse Settings
;-------------------------------------------------------------------------------
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF & _DEBUG_OFF & _CPD_OFF; _WRT_ENABLE_OFF &
;-------------------------------------------------------------------------------
;===============================================================================
; Hardware Configuation ;ILGILI PINLERIN GIRIS CIKIS TANIMLAMALARI YAPILMALI
;-------------------------------------------------------------------------------
GLCD_RES_TRIS EQU TRISD ; /RES
GLCD_RES EQU .7
GLCD_CS1_TRIS EQU TRISD ; /CS1
GLCD_CS1 EQU .2
GLCD_CS2_TRIS EQU TRISD ; /CS2
GLCD_CS2 EQU .3
GLCD_R_W_TRIS EQU TRISD ; R/W
GLCD_R_W EQU .5
GLCD_D_I_TRIS EQU TRISD ; D/I
GLCD_D_I EQU .4
GLCD_EN_TRIS EQU TRISD ; EN
GLCD_EN EQU .6
GLCD_RES_PORT EQU PORTD
GLCD_CS1_PORT EQU PORTD
GLCD_CS2_PORT EQU PORTD
GLCD_R_W_PORT EQU PORTD
GLCD_D_I_PORT EQU PORTD
GLCD_EN_PORT EQU PORTD
GLCD_DATA_TRIS EQU TRISB ; D0-D7
GLCD_DATA_PORT EQU PORTB
;===============================================================================
; Data Areas
;-------------------------------------------------------------------------------
PAGE_NO EQU 20H ;PAGE NO STORE
ROW_NO EQU 21H ;ROW NO STORE
TEMP_L EQU 22H ;TEMP REGISTER
GLYPH EQU 23H
;==============================================================================
; Interrupt Handler
;------------------------------------------------------------------------------
;.Interrupt code h'004'
; retfie ; Just a place holder
;==============================================================================
; Power On Reset
;------------------------------------------------------------------------------
;.ResetVector code h'000'
ORG 00H
lgoto PowerOnReset
;------------------------------------------------------------------------------
PowerOnReset:
banksel ADCON1 ;SELECT BANK OF ADCON1
movlw h'06' ;SET ALL PINS
movwf ADCON1 ;AS DIGITAL I/P'S
BANKSEL GLCD_RES_TRIS ;YUKARIDA EQU
BCF GLCD_RES_TRIS,GLCD_RES ;ILE
BANKSEL GLCD_RES_PORT ;PORT
BCF GLCD_RES_PORT,GLCD_RES ;VE
BANKSEL GLCD_CS1_TRIS ;TRIS
BCF GLCD_CS1_TRIS,GLCD_CS1 ;OLARAK
BANKSEL GLCD_CS1_PORT ;ILGILI
BCF GLCD_CS1_PORT,GLCD_CS1 ;PORT
BANKSEL GLCD_CS2_TRIS ;VE
BCF GLCD_CS2_TRIS,GLCD_CS2 ;TRISLERE
BANKSEL GLCD_CS2_PORT ;ATANAN
BCF GLCD_CS2_PORT,GLCD_CS2 ;GLCD RESET
BANKSEL GLCD_R_W_TRIS ;GLCD CHIP SELECT1
BCF GLCD_R_W_TRIS,GLCD_R_W ;GLCD CHIP SELECT2
BANKSEL GLCD_R_W_PORT ;GLCD READ WRITE
BCF GLCD_R_W_PORT,GLCD_R_W ;GLCD D_I
BANKSEL GLCD_D_I_TRIS ;PINLERI
BCF GLCD_D_I_TRIS,GLCD_D_I ;BURADA
BANKSEL GLCD_D_I_PORT ;CIKIS
BCF GLCD_D_I_PORT,GLCD_D_I ;OLARAK
BANKSEL GLCD_EN_TRIS ;ATANIR
BCF GLCD_EN_TRIS,GLCD_EN ;VE
BANKSEL GLCD_EN_PORT ;TEK TEK
BCF GLCD_EN_PORT,GLCD_EN ;BCF ILE SIFIRLANIR
BANKSEL GLCD_DATA_TRIS ;EQU ILE DATA PORTU
CLRF GLCD_DATA_TRIS ;OLARAK SECILMIS PORT
BANKSEL GLCD_DATA_PORT ;CIKIS OLARAK
CLRF GLCD_DATA_PORT ;ATANIR, SIFIRLANIR
;-------------------------------------------------------------------------------
;glcd init ediliyor
call GLCDSetup ;DO LCD SETUP
call GLCDDisplayOn ;TURN DISPLAY ON
call GLCDDISPLAYSL ;SET DISPLAY START LINE ;? ? ?
;-------------------------------------------------------------------------------
;Giriş işlmleri yapıldı, glcd fonksiyonları (altprogramları) aş. şek. kullanılıyor:
;aşağıdada görüleceği gibi GLCDSelectLeft ve Right ile
;yazdırma konumu seçilmek zorunda
;left de 8 karakter yazıldıktan sonra
;right programcı tarafından seçilmek zorunda (Glcd CS1 CS2 olayı)
;programam ufak bir ekle buda otomatik hale getirilebilir.
call GLCDSelectLeft
clrw ;LOAD W WITH 0
call GLCDSetPage ;SET THE PAGE
clrw ;LOAD W WITH 0
call GLCDSetRow ;SET THE ROW
movlw 'H'
call CharOut
movlw 'e'
call CharOut
movlw 'l'
call CharOut
movlw 'l'
call CharOut
movlw 'o'
call CharOut
movlw 'M'
call CharOut
movlw 'e'
call CharOut
movlw 'l'
call CharOut
; movlw 'l'
; call CharOut
;movlw 'o'
;call CharOut
movlw .1 ;YAZMAYA 1. SATIRDAN BASLA (0. SATIR ILK SATIRDIR)
call GLCDSetPage
;clrw
MOVLW 18H ;SATIRIN 18H SUTUNUNDAN YAZMAYA BASLA (TOPLAM 64 SUTUN VAR)
call GLCDSetRow
movlw 'R'
call CharOut ;TABLODAN R HARFININ 8 BYTE DATASINI ALIR YAZAR
movlw 'a'
call CharOut
movlw 'M'
call CharOut
movlw 'u'
call CharOut
; goto $
;------------------------------------------------------------------------------
; Diaplay the entire font to test the LCD
call GLCDSelectLeft
movlw .2
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'20'
call CharOut
movlw h'21'
call CharOut
movlw h'22'
call CharOut
movlw h'23'
call CharOut
movlw h'24'
call CharOut
movlw h'25'
call CharOut
movlw h'26'
call CharOut
movlw h'27'
call CharOut
call GLCDSelectRight
movlw .2
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'28'
call CharOut
movlw h'29'
call CharOut
movlw h'2a'
call CharOut
movlw h'2b'
call CharOut
movlw h'2c'
call CharOut
movlw h'2d'
call CharOut
movlw h'2e'
call CharOut
movlw h'2f'
call CharOut
call GLCDSelectLeft
movlw .3
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'30'
call CharOut
movlw h'31'
call CharOut
movlw h'32'
call CharOut
movlw h'33'
call CharOut
movlw h'34'
call CharOut
movlw h'35'
call CharOut
movlw h'36'
call CharOut
movlw h'37'
call CharOut
call GLCDSelectRight
movlw .3
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'38'
call CharOut
movlw h'39'
call CharOut
movlw h'3a'
call CharOut
movlw h'3b'
call CharOut
movlw h'3c'
call CharOut
movlw h'3d'
call CharOut
movlw h'3e'
call CharOut
movlw h'3f'
call CharOut
call GLCDSelectLeft
movlw .4
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'40'
call CharOut
movlw h'41'
call CharOut
movlw h'42'
call CharOut
movlw h'43'
call CharOut
movlw h'44'
call CharOut
movlw h'45'
call CharOut
movlw h'46'
call CharOut
movlw h'47'
call CharOut
call GLCDSelectRight
movlw .4
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'48'
call CharOut
movlw h'49'
call CharOut
movlw h'4a'
call CharOut
movlw h'4b'
call CharOut
movlw h'4c'
call CharOut
movlw h'4d'
call CharOut
movlw h'4e'
call CharOut
movlw h'4f'
call CharOut
call GLCDSelectLeft
movlw .5
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'50'
call CharOut
movlw h'51'
call CharOut
movlw h'52'
call CharOut
movlw h'53'
call CharOut
movlw h'54'
call CharOut
movlw h'55'
call CharOut
movlw h'56'
call CharOut
movlw h'57'
call CharOut
call GLCDSelectRight
movlw .5
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'58'
call CharOut
movlw h'59'
call CharOut
movlw h'5a'
call CharOut
movlw h'5b'
call CharOut
movlw h'5c'
call CharOut
movlw h'5d'
call CharOut
movlw h'5e'
call CharOut
movlw h'5f'
call CharOut
call GLCDSelectLeft
movlw .6
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'60'
call CharOut
movlw h'61'
call CharOut
movlw h'62'
call CharOut
movlw h'63'
call CharOut
movlw h'64'
call CharOut
movlw h'65'
call CharOut
movlw h'66'
call CharOut
movlw h'67'
call CharOut
call GLCDSelectRight
movlw .6
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'68'
call CharOut
movlw h'69'
call CharOut
movlw h'6a'
call CharOut
movlw h'6b'
call CharOut
movlw h'6c'
call CharOut
movlw h'6d'
call CharOut
movlw h'6e'
call CharOut
movlw h'6f'
call CharOut
call GLCDSelectLeft
movlw .7
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'70'
call CharOut
movlw h'71'
call CharOut
movlw h'72'
call CharOut
movlw h'73'
call CharOut
movlw h'74'
call CharOut
movlw h'75'
call CharOut
movlw h'76'
call CharOut
movlw h'77'
call CharOut
call GLCDSelectRight
movlw .7
call GLCDSetPage
clrw
call GLCDSetRow
movlw h'78'
call CharOut
movlw h'79'
call CharOut
movlw h'7a'
call CharOut
movlw h'7b'
call CharOut
movlw h'7c'
call CharOut
movlw h'7d'
call CharOut
movlw h'7e'
call CharOut
movlw h'7f'
call CharOut
goto $ ; Then loop forever
;===============================================================================
; Graphical LCD Control Subroutines ;GLCD ALTPROGRAMLAR
;-------------------------------------------------------------------------------
; Initialises the I/O pins used to communicate with the graphics LCD module and
; tells it to reset.
GLCDSetup:
;banksel GLCD_RES_TRIS ;BUNLAR PROG. BASINDA HALLEDILDI
;bcf GLCD_RES_TRIS,GLCD_RES ;SET DIRECTION OF RESET PIN O/P
;banksel GLCD_RES_PORT
;bcf GLCD_RES_PORT,GLCD_RES ;SET PORT O/P LOW (starts reset)
;banksel GLCD_RES_TRIS
;bcf GLCD_CS1_TRIS,GLCD_CS1 ;SET DIRECTION OF CS1 PIN O/P
;bcf GLCD_CS2_TRIS,GLCD_CS2 ;SET DIRECTION OF CS2 PIN O/P
;bcf GLCD_EN_TRIS,GLCD_EN ;SET DIRECTION OF E PIN O/P
;bcf GLCD_R_W_TRIS,GLCD_R_W ;SET DIRECTION OF RW PIN O/P
;bcf GLCD_D_I_TRIS,GLCD_D_I ;SET DIRECTION OF DI PIN O/P
banksel GLCD_EN_PORT
bcf GLCD_EN_PORT,GLCD_EN ;SET E LOW
;BANKSEL LCD_RES_PORT ;GEREKSİZ EKLERDEN
bsf GLCD_RES_PORT,GLCD_RES ;RELEASE FROM RESET
call GLCDSelectLeft
goto GLCDWait ; and wait until ready
;-------------------------------------------------------------------------------
; Instruct all the controller chips to turn their displays on.
GLCDDisplayOn:
movlw b'00111111'
goto GLCDCtrlAll
;-------------------------------------------------------------------------------
; Instruct all the controller chips to turn their displays off.
GLCDDisplayOff:
movlw B'00111110'
goto GLCDCtrlAll
;-------------------------------------------------------------------------------
;SETS DISPLAY DATA RAM (ADDRESS 00) TO TOP OF PAGE
GLCDDISPLAYSL:
movlw B'11000000'
call GLCDSelectLeft
goto GLCDSendCtrl
;-------------------------------------------------------------------------------
; Sends a command byte to all the display controllers.
GLCDCtrlAll:
bsf GLCD_CS1_PORT,GLCD_CS1
bsf GLCD_CS2_PORT,GLCD_CS2
;-------------------------------------------------------------------------------
; Sends the command byte in WREG to the currently selected controller chip
GLCDSendCtrl:
bcf GLCD_D_I_PORT,GLCD_D_I ; Set D/I = LO for commands
goto DoOutput ;SEND COMMAND
;-------------------------------------------------------------------------------
; Sends the data byte in WREG to the currently selected controller chip
GLCDSendData:
bsf GLCD_D_I_PORT,GLCD_D_I ; Set D/I = HI for data
DoOutput bcf GLCD_R_W_PORT,GLCD_R_W ; Set R/W = LO for output
banksel GLCD_DATA_TRIS ;SELECT TRISB BANK
clrf GLCD_DATA_TRIS ;SET TRISB TO OUTPUTS
banksel GLCD_DATA_PORT ;SELECT PORTB BANK
movwf GLCD_DATA_PORT ; .. and latch byte
nop
bsf GLCD_EN_PORT,GLCD_EN ; Then strobe EN
nop
bcf GLCD_EN_PORT,GLCD_EN
btfss GLCD_D_I_PORT,GLCD_D_I ; SEE IF SENDING DATA
goto GLCDWait
incf ROW_NO,W ; Bump ROW tracker
andlw B'00111111' ; .. and wrap round
movwf ROW_NO
;-------------------------------------------------------------------------------
; Reads the status byte from the currently selected controller and waits
; for it to become zero. (note roll thro from above)
GLCDWait:
call GLCDReadBusy ;READ STATUS BYTE
btfsc TEMP_L,7 ;LOOK AT BUSY PIN
goto GLCDWait ;(BSY)
return ;(CLEAR)
;-------------------------------------------------------------------------------
; Reads the status byte from the active controller chip.
GLCDReadBusy:
bcf GLCD_D_I_PORT,GLCD_D_I ; Set D/I = LO for command
goto DoInput
;-------------------------------------------------------------------------------
;READS A DATA BYTE ( IN TEMP REG ) FROM THE ACTIVE CONTROLLER CHIP
GLCDReadData:
bsf GLCD_D_I_PORT,GLCD_D_I ; Set D/I = HI for data
DoInput bsf GLCD_R_W_PORT,GLCD_R_W ; Set R/W = HI for input
banksel GLCD_DATA_TRIS ;SET BANK TO TRISB
movlw h'ff' ;MAKE I/P'S
movwf GLCD_DATA_TRIS ;DO IT
banksel GLCD_DATA_PORT ;SET BANK TO PORTB
nop
bsf GLCD_EN_PORT,GLCD_EN ; Strobe EN ON
nop
movf GLCD_DATA_PORT,W ;READ BYTE FROM DISPLAY IN W
movwf TEMP_L ;PUT W IN TEMP REG
bcf GLCD_EN_PORT,GLCD_EN ;EN OFF
banksel GLCD_DATA_TRIS ;SET BANK TO TRISB
clrf GLCD_DATA_TRIS ;MAKE O/P'S
banksel GLCD_DATA_PORT
return
;-------------------------------------------------------------------------------
; Sets the chip select lines so the left hand side of the screen is enabled
GLCDSelectLeft:
bsf GLCD_CS1_PORT,GLCD_CS1
bcf GLCD_CS2_PORT,GLCD_CS2
return
;-------------------------------------------------------------------------------
; Sets the chip select lines so the right hand side of the screen is enabled
GLCDSelectRight:
bcf GLCD_CS1_PORT,GLCD_CS1
bsf GLCD_CS2_PORT,GLCD_CS2
return
;-------------------------------------------------------------------------------
; Generates and sends a command to set the selected page
GLCDSetPage:
andlw B'00000111'
movwf PAGE_NO
iorlw B'10111000'
goto GLCDSendCtrl
;-------------------------------------------------------------------------------
; Generates and sends a command to set the selected row
GLCDSetRow
andlw b'00111111'
movwf ROW_NO
iorlw b'01000000'
goto GLCDSendCtrl
;===============================================================================
; Character Font Display
;-------------------------------------------------------------------------------
; Draw the 8x8 glyph for the character in WREG
CharOut:
andlw h'7f' ; Ensure character in supported range
addlw -h'20'
movwf GLYPH ; Multiply by 8 to get table offset
clrf PCLATH
bcf STATUS,C
rlf GLYPH,F
rlf GLYPH,F
rlf PCLATH,F
rlf GLYPH,F
rlf PCLATH,F
movlw high GlyphData ; Add to table address to get target
addwf PCLATH,F
movlw low GlyphData
addwf GLYPH,F
btfsc STATUS,C
incf PCLATH,F
call ShowGlyphData ; Repeat for each pixel column
call ShowGlyphData
call ShowGlyphData
call ShowGlyphData
call ShowGlyphData
call ShowGlyphData
call ShowGlyphData
ShowGlyphData:
call GetGlyphData ; Get next byte of glyph data
call GLCDSendData ; .. and display
incf GLYPH,F ; Then bump data address one place
btfsc STATUS,Z
incf PCLATH,F
return
; Recovers a byte of glyph data from the table. (dt createS RETLW instructions)
GetGlyphData:
movf GLYPH,W ; Do a computed jump
movwf PCL
GlyphData:
dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
dt 0x00,0x00,0x00,0x5F,0x5F,0x00,0x00,0x00
dt 0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00
dt 0x24,0x7E,0x7E,0x24,0x7E,0x7E,0x24,0x00
dt 0x00,0x24,0x2E,0x6B,0x6B,0x3A,0x12,0x00
dt 0x00,0x66,0x36,0x18,0x0C,0x66,0x62,0x00
dt 0x30,0x7A,0x4F,0x5D,0x37,0x72,0x50,0x00
dt 0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00
dt 0x00,0x00,0x00,0x3E,0x7F,0x63,0x41,0x00
dt 0x00,0x41,0x63,0x7F,0x3E,0x00,0x00,0x00
dt 0x08,0x2A,0x3E,0x1C,0x1C,0x3E,0x2A,0x08
dt 0x00,0x08,0x08,0x3E,0x3E,0x08,0x08,0x00
dt 0x00,0x80,0xE0,0x60,0x00,0x00,0x00,0x00
dt 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00
dt 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00
dt 0x00,0x60,0x30,0x18,0x0C,0x06,0x03,0x00
dt 0x00,0x3E,0x7F,0x49,0x45,0x7F,0x3E,0x00
dt 0x00,0x40,0x42,0x7F,0x7F,0x40,0x40,0x00
dt 0x00,0x42,0x63,0x71,0x59,0x4F,0x46,0x00
dt 0x00,0x21,0x61,0x45,0x4F,0x7B,0x31,0x00
dt 0x00,0x18,0x1C,0x16,0x7F,0x7F,0x10,0x00
dt 0x00,0x27,0x67,0x45,0x45,0x7D,0x39,0x00
dt 0x00,0x3E,0x7F,0x49,0x49,0x79,0x30,0x00
dt 0x00,0x01,0x71,0x79,0x0D,0x07,0x03,0x00
dt 0x00,0x36,0x7F,0x49,0x49,0x7F,0x36,0x00
dt 0x00,0x06,0x4F,0x49,0x69,0x3F,0x1E,0x00
dt 0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00
dt 0x00,0x00,0x40,0x76,0x36,0x00,0x00,0x00
dt 0x00,0x00,0x08,0x1C,0x36,0x63,0x41,0x00
dt 0x00,0x24,0x24,0x24,0x24,0x24,0x24,0x00
dt 0x00,0x41,0x63,0x36,0x1C,0x08,0x00,0x00
dt 0x00,0x02,0x03,0x51,0x59,0x0F,0x06,0x00
dt 0x00,0x3E,0x7F,0x41,0x5D,0x57,0x5E,0x00
dt 0x00,0x7C,0x7E,0x13,0x13,0x7E,0x7C,0x00
dt 0x00,0x7F,0x7F,0x49,0x49,0x7F,0x36,0x00
dt 0x00,0x3E,0x7F,0x41,0x41,0x63,0x22,0x00
dt 0x00,0x7F,0x7F,0x41,0x63,0x3E,0x1C,0x00
dt 0x00,0x7F,0x7F,0x49,0x49,0x49,0x41,0x00
dt 0x00,0x7F,0x7F,0x09,0x09,0x09,0x01,0x00
dt 0x00,0x3E,0x7F,0x41,0x49,0x79,0x79,0x00
dt 0x00,0x7F,0x7F,0x08,0x08,0x7F,0x7F,0x00
dt 0x00,0x00,0x41,0x7F,0x7F,0x41,0x00,0x00
dt 0x00,0x20,0x60,0x40,0x40,0x7F,0x3F,0x00
dt 0x00,0x7F,0x7F,0x1C,0x36,0x63,0x41,0x00
dt 0x00,0x7F,0x7F,0x40,0x40,0x40,0x40,0x00
dt 0x7F,0x7F,0x06,0x0C,0x06,0x7F,0x7F,0x00
dt 0x00,0x7F,0x7F,0x0E,0x1C,0x7F,0x7F,0x00
dt 0x00,0x3E,0x7F,0x41,0x41,0x7F,0x3E,0x00
dt 0x00,0x7F,0x7F,0x09,0x09,0x0F,0x06,0x00
dt 0x00,0x3E,0x7F,0x51,0x21,0x7F,0x5E,0x00
dt 0x00,0x7F,0x7F,0x09,0x19,0x7F,0x66,0x00
dt 0x00,0x26,0x6F,0x49,0x49,0x7B,0x32,0x00
dt 0x00,0x01,0x01,0x7F,0x7F,0x01,0x01,0x00
dt 0x00,0x3F,0x7F,0x40,0x40,0x7F,0x7F,0x00
dt 0x00,0x1F,0x3F,0x60,0x60,0x3F,0x1F,0x00
dt 0x7F,0x7F,0x30,0x18,0x30,0x7F,0x7F,0x00
dt 0x00,0x63,0x77,0x1C,0x1C,0x77,0x63,0x00
dt 0x00,0x07,0x0F,0x78,0x78,0x0F,0x07,0x00
dt 0x00,0x61,0x71,0x59,0x4D,0x47,0x43,0x00
dt 0x00,0x00,0x00,0x7F,0x7F,0x41,0x41,0x00
dt 0x00,0x03,0x06,0x0C,0x18,0x30,0x60,0x00
dt 0x00,0x41,0x41,0x7F,0x7F,0x00,0x00,0x00
dt 0x08,0x0C,0x06,0x03,0x06,0x0C,0x08,0x00
dt 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00
dt 0x02,0x06,0x0C,0x08,0x00,0x00,0x00,0x00
dt 0x00,0x20,0x74,0x54,0x54,0x7C,0x78,0x00
dt 0x00,0x7F,0x7F,0x44,0x44,0x7C,0x38,0x00
dt 0x00,0x38,0x7C,0x44,0x44,0x44,0x00,0x00
dt 0x00,0x38,0x7C,0x44,0x44,0x7F,0x7F,0x00
dt 0x00,0x38,0x7C,0x54,0x54,0x5C,0x18,0x00
dt 0x00,0x04,0x7E,0x7F,0x05,0x05,0x00,0x00
dt 0x00,0x98,0xBC,0xA4,0xA4,0xFC,0x7C,0x00
dt 0x00,0x7F,0x7F,0x04,0x04,0x7C,0x78,0x00
dt 0x00,0x00,0x44,0x7D,0x7D,0x40,0x00,0x00
dt 0x00,0x80,0x80,0xFD,0x7D,0x00,0x00,0x00
dt 0x00,0x7F,0x7F,0x10,0x38,0x6C,0x44,0x00
dt 0x00,0x00,0x41,0x7F,0x7F,0x40,0x00,0x00
dt 0x7C,0x7C,0x0C,0x18,0x0C,0x7C,0x78,0x00
dt 0x00,0x7C,0x7C,0x04,0x04,0x7C,0x78,0x00
dt 0x00,0x38,0x7C,0x44,0x44,0x7C,0x38,0x00
dt 0x00,0xFC,0xFC,0x44,0x44,0x7C,0x38,0x00
dt 0x00,0x38,0x7C,0x44,0x44,0xFC,0xFC,0x00
dt 0x00,0x7C,0x7C,0x04,0x04,0x0C,0x08,0x00
dt 0x00,0x48,0x5C,0x54,0x54,0x74,0x24,0x00
dt 0x00,0x04,0x04,0x3E,0x7E,0x44,0x44,0x00
dt 0x00,0x3C,0x7C,0x40,0x40,0x7C,0x7C,0x00
dt 0x00,0x1C,0x3C,0x60,0x60,0x3C,0x1C,0x00
dt 0x1C,0x7C,0x60,0x30,0x60,0x7C,0x1C,0x00
dt 0x00,0x44,0x6C,0x38,0x38,0x6C,0x44,0x00
dt 0x00,0x9C,0xBC,0xA0,0xA0,0xFC,0x7C,0x00
dt 0x00,0x44,0x64,0x74,0x5C,0x4C,0x44,0x00
dt 0x00,0x00,0x08,0x3E,0x77,0x41,0x41,0x00
dt 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00
dt 0x00,0x41,0x41,0x77,0x3E,0x08,0x00,0x00
dt 0x0C,0x06,0x06,0x0C,0x18,0x18,0x0C,0x00
dt 0x00,0x60,0x78,0x5E,0x46,0x58,0x60,0x00
end
(https://lh5.googleusercontent.com/-9370HuKi75c/VUcWdGWyGBI/AAAAAAAABbU/wSg2l_KLRGA/w486-h384-no/glcd_asm_RaMu.PNG)
Hocam çok teşekkür ederim. Son iki projenizi indirdim inceleyeceğim.