ASM Kodlarıyla Grafik LCD’ye Resim Yüklenmesi
ASM kodlarıyla Grafik LCD'ye resim yüklenmesi |
Bu yazımda Pic16f877 mikro denetleyicisi kullanılarak asm kodlarıyla Grafik lcd 'ye resim yüklenmesi konusunda bildiklerimi paylaşacağım. Kullanabileceğiniz GLCD'ler kısaca ks0108 sürücü entegresine sahip herhangibi bir markanın glcd desi olablir benim elimde
powertıp pg-12864d(128×64) ve NANYA LMC97S005C(128×64) tip glcdler vardı iklisindede görüntü aldım. dediğim gibi ks0108 entegresine sahip herhangibi bir glcde sürebilirsiniz yeterki pin bağlantılarını düzgün yapın. koduları yanında nasıl çalıştıklarını ve ne iş yaptıklarını gösterir açıklamalar mevcut.
kısaca Glcd lerin nasıl çalıştığını açıklamaya çalışayım ve kodları inceleyelim
öncelikle pinleri ve kısaca ne işe yaradıklarını açıklamakla başlayalım
1Nolu Pin (VDD): güç kaynağından +5V bağlanacağı pin
2 Nolu Pin(VSS): güç kaynağından GND bağlanacağı pin
3 Nolu Pin(V0): 10k tirimpot 'un 1 nolu bacağı (VEE bacağı olan glcd lerde Vee bacağına)Gnd ye bağlanır. 3 nolu bacağı +5v bağlanırr ve ortadaki out bacağı ise glcd nin 3 nolu bacağına bağlanarak ekran kontrası ayarlamada kullanılır.
4-11 Nolu Pin(D0-D7): glcdye veri/komut bu pinler üzerinden gönderilir.
14 Nolu Pin(RST): Glcd resetlemek için kullanılır.(ekranı siler)
15 Nolu Pin(R/W): Okuma(1)/Yazma(0) pini yani glcden veri okunacaksa bu pin 1(5v) yapılır ve glcde den okuma işlemi yapılabilir. Bu pin 0(0v) iken glcdye yazma modunda kuulanılır ve veri/komut gönderimi yapılabilir.
16 Nolu Pin(D/I): Veri/Komut pini glcdye gönderilen data nın verisi 'mi(karekter yada resim verisi) yoksa komut 'mu (glcd yi aç veya satır komutu) olduğunu oldugu bu pinin durumunagöre belirlenir. pinin değeri 0(0v) iken glcd komut kaydedicisi modundadır. pinin değeri 1 (5v) iken glcd veri kaydedicisi modunda oldugun gösterir.
17 Nolu Pin(E): glcdye gönderilen datanın glcd tarafından işlenmesini sağlar. 1 durumundan 0 'a çekildiğinde D0-D8 pinlerindeki veriyi glcde tarafından işleme alınır.
18 Nolu Pin(VEE): bu pin glcd nin -volut pinidir. glcdye gelen akımın – olarak bu bacaktan çıkış alınır. bu pin 10kohm luk bir potla glcd nın V0 pinine baplanarak kullanılabilir veya boş bırakılır.
19-20 Nolu Pin(Led A ve Led K): glcd nin zemin aydınlatması için kullanılan pinidir Anot ucu +5v bağlanır ve Katot pini -Gnd ucuna bağlanarak led çalıştırılır.
12-13 Nolu Pin(CS1 ve CS2): 128×64 Glcd ler aslında 64×64 boyutlarında 2 sayfadan (yani 2 adet ks0108 entegre ile sürülür) oluşur. Cs1 ve Cs2 pinleri hangi parçanın (entegrenin) aktif edileceğini seçmeye yarayan pinlerdir.
üsteki resimdende anlaşılacağı üzere Cs1:1 Cs2:0 iken sol taraftaki ekran seçilmiş olur.
Cs1:0 Cs2:1 durumunda iken sağ taraftaki ekran seçilir. her bir sutuna veri gönderildiğinde 8 bitlik satır bilgiside gönderilmiş olur yani buna göre 64 dots /8 bit=8 satır yani herbir parça ekran 8 satırdan oluştuğunu gösterir.
[codesyntax lang="asm" lines="normal"]
;========================================================================
;glcd nin ilk (sol) tarafıundaki entegre seçer
;CSA=1
;CSB=0
;glcd nin ikinci (sağ) tarafıundaki entegre seçer
;CSA=0
;CSB=1
; kısacası 0 olan seçili entegre oluyo
; RW=glcd okuma / yAZMA MODUNU AKTİF YAPAN PİN
; RW=0 (SIFIR) İSE GLCDYE YAZMA MODUNDA OLDUGUNU GÖSTERİR
; RW=1 (BİR) İSE GLCD DEN OKUMA MODUNDA OLDUGUNU GÖSTERİR.
; OKUMA PAYARKEN İLK OKUNAN DEĞER DİKKATE ALINMAZ 2. DEĞER GEÇERLİDİR. ARDIŞIK OKUMALARDA SADECE İLK OKUNAN ES GEÇİLİR.
;*********** komut gönderme*******************
; DI=bacağı 0 (sıfır) ise komut gönderme modundadır.
; DI=bacağı 1 (bir) ise veri gönderme modundadır.
; E=bacağı 1 (bir) den 0 (sıfır) a geçtiğinde komut/veri glcdye yazılır
; RW=0 GLCD YAZMA MODUNDA OLMALIDIR.
;************************************************************
; 128*64 glcd komutları (ks0108)entegreli lcd komutları
; 62=glcd kapalı
; 63 =glcd aç
; 64 =y kordinatı (0 sütun) adresi(seçili olan çipin cs1/cs2 aderlenmesinde kullanılır)
; 127 =y kordinatı (63 sütun) adrersi (seçili olan çipin cs1/cs2 aderlenmesinde kullanılır)
; 184 =xkordinatı (0 satır) adresi(seçili olan çipin cs1/cs2 aderlenmesinde kullanılır)
; 255 =xkordinatı (63 satır) adresi(seçili olan çipin cs1/cs2 aderlenmesinde kullanılır)
;============================================================
list p=16f877a ; kullanılan pic tanıt
#include <p16f877a.inc> ;
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF & _DEBUG_OFF & _CPD_OFF; _WRT_ENABLE_OFF &
;============================================================
CBLOCK 0x20
kolon_ınd ;equ 20h;
tablo_ınd ;equ 21h;
LCD_CS ;equ 25h;
LCD_PAGE ;equ 26h;
LCD_ADR ;equ 27h;
LCD_DATA ;equ 28h;
COUNTER1 ;equ 29h;
COUNTER2 ;equ 2Ah;
COUNTER3 ;equ 2Bh;
TEMP ;equ 2Ch;
satır ;equ 0x22
ENDC
;********** SOL EKRANI SEÇMEYE YARAYAN MAKRO*********
CSA MACRO
BSF CS1
BCF CS2
ENDM
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
;***********SAĞ EKRANI SEÇMEYE YARAYAN MAKRO**********
CSB MACRO
BCF CS1
BSF CS2
ENDM
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#define RST PORTC,0 ;
#define E PORTC,1 ;
#define DI PORTC,2 ;
#define CS1 PORTC,5 ;
#define CS2 PORTC,6 ;
#define RDWR PORTC,7 ;
;============================================================
ORG 0X0000 ; başlangıç vektörü
; clrf PCLATH ; pc sayacının ;yüksek bitini sıfırla
goto main ; ana programa ;dallan
;
;
;
;
;
;
main
;port tanımlamaları yapılıyor.
banksel TRISC;
clrf TRISC
clrf TRISD
clrf TRISE
movlw b'11111111'
movwf TRISB
movlw b'00111111'
movwf TRISA
movlw b'10001001'
movwf ADCON1
banksel PORTC; bcf STATUS, RP0
;**********kurulum bitti******************
movlw b'01000000'
movwf ADCON0
;*********glcd kurulumu*******************
CSA ;1. entegre aktif
bcf DI ; komut yazma moduna ;geç
call LCD_ON ; glcd ;aç bcf RDWR ; glcd yazma modunda
bcf RST ; glcd hafızasını ;sıfırla
call Pause ;bekle
bsf RST ; glcd ;sıfırlama işlemini etkinleştir.
call Pause ;bekle
bcf DI ; komut yazma moduna ;geç
;************************************************************; grefik lcdler 128 sutun ve 64 satır noktadan oluşur
;satırları taraken bir seferde 8 it gönderilir yani grafik ;lcdler 64/8 =8 satırdan oluşur
;buda demek oluyoruki her bir satırda 128 bitlik veri ;göndercek kod düzenlemek gerkir bunu yaparkende
; her 64 bitte bir çipseti değiştirmek gerekli aşağıdaki kod ;bu işi yapar.
scan ;
CSA ;1. entegre aktif
call LCD_ON ;
movlw b'10111000' ; 184 komutu 0 ;sütüna giden komut
movwf LCD_PAGE ;
call LCDPage ; kordinatı glcdye ;işle
movlw b'01000000' ; 64 KOMUTU 0 ;SATIR BAŞI
movwf LCD_ADR ;
movf LCD_ADR, w ;
call Adress ;
CSB; 2. entegre AKTİF
call LCD_ON ; call LCD_ON ; glcd aç
movlw b'10111000' ; 184 komutu 0 ;sütüna giden komut
movwf LCD_PAGE ;
call LCDPage ; kordinatı glcdye ;işle
movlw b'01000000' ; 64 KOMUTU 0 ;SATIR BAŞI
movwf LCD_ADR
movf LCD_ADR, w ;
call Adress ;
MOVLW .8 ;grafik lcd 8 satırdan oluşur
MOVWF satır
movlw .2
movwf tablo_ınd
bir_artır
;
call SendDataTOGLCD ;glcd veri gönder
incf LCD_PAGE,f ;
CSA;
movfw LCD_PAGE;, w
call LCDPage
movfw LCD_ADR;, w ;
call Adress
CSB;
movfw LCD_PAGE;, w
call LCDPage
movfw LCD_ADR;, w ;
call Adress
decfsz satır
GOTO bir_artır
son
; sleep
goto son
LCDPage
bsf E
;nop
movf LCD_PAGE, w
movwf PORTD
;nop
bcf E
return
LCD_ON;glcd nin aktif olan entegresini komut/veri yazmak ;için kullanıma açar
bsf E
;nop
movlw b'00111111' ; 63 komutu (lcd aç)
movwf PORTD
;nop
bcf E
return
Adress;
bsf E
;nop
movwf PORTD
;nop
bcf E
return
ByteToLCD
bsf DI
;nop
bsf E
;nop
movwf PORTD
;nop
bcf E
;nop
bcf DI
;
return
Pause
movlw .25
movwf COUNTER1
P2
movlw .255
movwf COUNTER2
P3
decfsz COUNTER2, f
goto P3
decfsz COUNTER1, f
goto P2
return
SendDataTOGLCD;karekter bilgisini lcd ye gönderiri
CSA; 1. entegre aktif
movlw .64
movwf COUNTER1
SC1 ;1. entegre yazdır
call TabSim
call ByteToLCD
incfsz kolon_ınd, f
goto $+2
incf tablo_ınd,f
decfsz COUNTER1, f
goto SC1
CSB; 2. entegre aktif
movlw .64
movwf COUNTER1
SC2 ;2. entegreyi yazdır
call TabSim
call ByteToLCD
incfsz kolon_ınd, f
goto $+2
incf tablo_ınd,f
decfsz COUNTER1, f
goto SC2
return
;************************************************************; glcd gösterilecek resmin verileri bu alanda tablodan alınır
;************************************************************;
org 0x01Fc
TabSim ;tablo bilgilerini gir 2 parçadan oluşacak ayarla
movfw tablo_ınd
movwf PCLATH
tabloya_git
movfw kolon_ınd
addwf PCL, f
; ekranda benim hazırladığım 2 adet kod var.
;hangisini göstermek isterseniz onu kullanabilir veya kendi ;resim dosyanızı oluşturup
;inc uantısıyla kaydettikten sonra aşağıdaki gibi include ;deyiminden sonra
;ekleyebilirisniz. görmek istediğiniz resmi seçtikten sonra ;diğer resmin tanılama satyırının önüne ";" sembolünü
;koymaıy unutmayın: kolay gelsin.
include sunger bob(128 x 64).inc
;include kelebek.inc
end
[/codesyntax]
yanda standar glcd ve mcu bağlantısı görülmekte bizim kullanacağımız 16f877 mikrodenetleyicinin bağlantıları sırasıyla şöyle yapılmalı
Mcu portD=glcd D0-D7
Mcu portC.0=glcd RST
Mcu portC.1=glcd E
Mcu portC.2=glcd DI
Mcu portC.7=glcd RW
Mcu portC.5=glcd CS1
Mcu portC.6=glcd CS2
glcd bağlantıların yapmadan önce kullancağınız glcd nin datasheetini inceleyin bağlantılarını ona göre yaparsanız aşağıdaki gibi görüntü elde edersiniz.
uygulama ile ilgili tüm dosya resim, gerekli convert programlarını ve dökümanları burdan indirebilirsiniz