TEŞEKKÜR: Klavyeden gelen kodu çözmede, büyük bir dikkatle
osilaskop verilerini ölçüp biçen, zaman zaman da yorgun
elektronikçiyi ilginç fikirleriyle uyaran Gültekin ÇAKAR'a
(TA5COZ) teşekkür ediyorum.
UYGULAMA ÖZELLİKLERİ
- Bu uygulama, bilgisayar yada başka bir sistemden bağımsız
olarak çalışır. Bilgi, bir PC/AT klavye aracılığıyla girilir.
- Yazılabilecek ve gösterilebilecek metin, (büyük İngilizce
alfabetik karakterler, 0...9 nümerik karakterler, nokta ve boşluk)
toplam 35 karakterden oluşur.
- Klavyeden girilen ilk karakter hemen görüntülenir. İkinci
karakter girildiğinde, ilk geçiş hatalı olabilir. Ama ikinci geçiş
mutlaka düzgün olacaktır. Her yeni karakter girmenizde göstergenin
bir "afallama" dönemi geçirmesinin nedenleri makale içinde
açıklanacaktır.
- Klavyeden girilen karakterlere ait kodlar PIC'in EEPROM'una
kaydedilir. Dolayısıyla metni çok uzun süre PIC içinde
saklayabilirsiniz.
- Kaydedilecek karakter sayısı, ya da metin uzunluğu, boşluk
dahil olmak üzere 63'tür. EEPROM'un H'00' adresi ise toplam
karakter sayısını saklamaktadır.
- Sütun sayısı her ne kadar 24 olarak verildiyse de, kolaylıkla
arttırılabilir. PIC16F84A'nın RAM alanında bu iş için yeteri kadar
boşluk vardır.
- Bu uygulama için indirilebilecek dosyalar, bir liste halinde
sayfanın sonundadır.
İŞE BAŞLAMA ZAMANI
Gültekin'in kamerasından aldığımız video ve resimler bizi tatmin
etmedi. Bu nedenle Photoshop, Ulead Gif Animator gibi
yazılımlar yardımıyla yukardaki küçük animasyonu hazırlamak zorunda
kaldık. Animasyonda toplam 60 kare kullanılması gerektiğinden, dosya
boyutunu küçültebilmek için animasyonu kırpmak zorunda kaldık.
Dosyanın orijinal boyutunu merak edenlere açıklayalım: 3.164.273
bayt...
150
dpi çözünürlüklü resim için tıklayınız.
Yukardaki şema Eagle v4.03 ile çizildi. Eğer şema
dosyasını açmak isterseniz, mutlaka sözü edilen sürümü kurmalısınız.
Önce uygulamanın pahalı ve karmaşık bir yapısı olan LED display
üzerinde duralım. Burada her ne kadar 8x 8 gösterge görünüyorsa da,
uygulamada 7 satır kullanıldı. Çünkü proje 5x7 matrix display için
tasarlanmıştı. 5x7 ortak katot herhangi bir gösterge
kullanabilirsiniz.
Soldaki resim tarayıcıdan alındı. Bizim kullandığımız display
FYM-23881BS-11'i 1/1 oranında gösteriyor.
Boyut yaklaşık olarak 6x6 cm.
Her LED 5 mA gibi düşük bir akımla doyurucu bir ışık verebilir.
Fiatı ise yaklaşık 4 USD.
Ortak katot bir display'i yakmak için satırlardan lojik 1,
sütunlardan lojik 0 göndermeniz gerekir. Ortak anot bir display
kullanmak içinse satırlardan lojik "0" sütunlardan lojik "1".
Ortak anot bir display kullanmanız gerekiyorsa, iki yol
izleyebilirsiniz. Donanımda yada yazılımda değişiklik yapmak.
Donanım değişikliği, display'in yanması için gereken lojik durumları
sağlamaktan geçer. Bizce mantıklı olan budur. Yazılımla da
benzer bir çalışma koşulu sağlanabilir. PIC Assembly komutları
arasından COMF komutu bu amaçla kullanılabilir.
Bu gösterge, Eagle'ın lbr dizini altına kopyalanması
gereken ccf.lbr dosyasına eklendi. Bu dosyayı ccf.zip adıyla
sayfa sonundaki bağlantıdan indirip kullanabilirsiniz.
FYM-23881BS-11 baskı
devrede böyle yer alacak.
C1...C8 (Column1...8) sütun yada kolonları, R1...R8 (Row1...8)
ise satırları gösteriyor.
Satır ve sütunlar neredeyse rastgele bir biçimde yerleştirilmiş.
Yukardaki satırlarda bu göstergenin karmaşık yapısından söz ederken
bu durum anlatılmak istenmişti.
Ancak yapılan Internet araştırmasında incelenen tüm dot matrix
display'lerin aynı yapıda olduğu görüldü.
Eğer kendiniz bir gösterge yapmak istiyorsanız, bu işin oldukça
çetin geçeceğini söyleyebiliriz.
Maliyetin hazır bir display'den daha fazla olduğunu ve
profesyonel bir görünüm elde edemeyeceğinizi düşünüyorsanız bu işten
vazgeçebilirsiniz. Elde bir gösterge yapmanın bir yararı olabilir;
Bir LED hasar gördüğünde onu değiştirebilirsiniz.
DONANIMBazı elektronikçiler bir uygulamayı önce şema
olarak görmeyi tercih eder. Bu, hiç te yabana atılacak bir yaklaşım
değildir. Çünkü şema, bir projeyle ilgili tüm ayrıntıları
açıklayabilir.
Bizim hazırladığımız şemanın sayma ve sürme devrelerinde 7 adet
TTL tümdevre kullanıldı. Bu sayı 4'e hatta 3'e indirilebilir. Ancak
devrenin tasarlanması aşamasında, çıkabilecek sorunlar gözönüne
alınarak çizim yapıldı. Daha sonra da bir sadeleştirmeye gidilmedi.
Akımdan da tasarruf amacıyla C-MOS tümdevreler de rahatlıkla
kullanılabilir.
IC4, IC5, IC6 (74160) BCD sayıcıları sırayla sayma yapar. IC4'ün
BCD çıkışları B'0000' iken IC1'in (7442) Q0 çıkışı aktiftir.
7442'nin Q0 çıkışı, PNP TR1 transistörünü sürer. 74160 için
aşağıdaki tabloyu inceleyiniz.
|
74160 BCD SAYICI İÇİN DOĞRULUK
TABLOSU |
|
Adım |
CLR |
ENT |
CLK |
QD |
QC |
QB |
QA |
AÇIKLAMA |
|
0 |
x |
x |
0 |
0 |
0 |
0 |
RESET |
|
1 |
0 |
x |
QD |
QC |
QB |
QA |
Sayma yok. |
| 1 |
1 |
1 |
|
0 |
0 |
0 |
1 |
|
| 2 |
1 |
1 |
|
0 |
0 |
1 |
0 |
|
| 3 |
1 |
1 |
|
0 |
0 |
1 |
1 |
|
| 4 |
1 |
1 |
|
0 |
1 |
0 |
0 |
|
| 5 |
1 |
1 |
|
0 |
1 |
0 |
1 |
|
| 6 |
1 |
1 |
|
0 |
1 |
1 |
0 |
|
| 7 |
1 |
1 |
|
0 |
1 |
1 |
1 |
|
| 8 |
1 |
1 |
|
1 |
0 |
0 |
0 |
|
| 9 |
1 |
1 |
|
1 |
0 |
0 |
1 |
|
7442 tümdevresinin aktif olan çıkışı lojik 0, diğer 9 çıkış ise
lojik 1'dir. Bu durum, ortak katotlu bir göstergeyi sürmede kolaylık
sağlar.
| 7442 ONLU KOD ÇÖZÜCÜ İÇİN DOĞRULUK
TABLOSU |
|
ONLUK |
GİRİŞLER |
ÇIKIŞLAR |
| D |
C |
B |
A |
Q9 |
Q8 |
Q7 |
Q6 |
Q5 |
Q4 |
Q3 |
Q2 |
Q1 |
Q0 |
| 0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
| 1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
| 2 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
| 3 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
| 4 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
| 5 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
| 6 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
| 7 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
| 8 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
| 9 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
7442'nin Q0 çıkışı, başka bir görev daha yapar. Bu görev,
kendinden sonraki sayıcıyı sıfırlamaktır. IC4 BCD sayıcısı 1 adım
ilerlediğinde, IC1'in Q1 çıkışı lojik 0 olur. Bu durum, IC1'in Q9
çıkışının aktif olmasına kadar sürer. Bu aşamaya gelindiğinde
sayıcıların çalışma koşullarında değişiklik olur.
IC1'in Q9 çıkışı lojik 0 olunca, IC4 tümdevresi ENT girişinin "0"
olması nedeniyle saymasını durdurur. Aynı "0" işareti ise IC7A
(7402) NOR kapısının açılmasına ve saatin her düşen kenarıyla "1"
üretmesine yol açar. Aşağıdaki tabloya bakınız.
| 7402 NOR (VEYA) KAPISI |
| GİRİŞ |
ÇIKIŞ |
| A |
B |
Q |
| 0 |
0 |
1 |
| 0 |
1 |
0 |
| 1 |
0 |
0 |
| 1 |
1 |
0 |
Üretilen bu işaret zincirin ikinci halkasındaki IC5'in bir adım
ilerlemesine neden olur.
IC2'nin Q0 çıkışının atlandığına dikkat ettiniz mi? Eğer bunu
sağlamazsanız aynı bilgi, farklı iki sütunda gösterilir ve bu durum
karmaşaya yol açar.
IC2 saymasını, Q9 çıkışına kadar olağan biçimde sürdürür. Bu
noktada, IC1'in akıbetine uğrayarak saymasına ara vermek zorunda
kalır. IC7C kapısı denetimi ele alarak zincirin son halkasındaki IC6
için saat darbeleri üretmeye başlar.
IC3 onlu sayıcısının Q8 çıkışı "0" olduğunda tüm sayıcılar
başlangıca döndürülür. Aynı sıfırlama noktası, PIC16F84A tarafından
da zaman zaman kullanılmaktadır.
ÖzetTarama yöntemini kullanan bu uygulamada, sırayla
lojik "0" olan 24 çıkış kullanılmaktadır. Onlu sayıcıların Q9
çıkışları, sayıcıları "park ettirmek" amacıyla, Q0 çıkışları
(ilk onlu sayıcı hariç) ise sonraki sayıcıyı sıfırladığından ve 1
adımlık bir zıplama gerektiğinden kullanılamamaktadır.
Proteus, SnagIt ve Ulead Gif Animator yardımıyla anlattıklarımızı
resimleyelim.
Bu animasyonda 25 sütunun sürülmesi sırasında, 7442 onlu
sayıcısının çıkışlarının lojik seviyelerini adım adım
izleyebilirsiniz.
"Neden 24 değil de 25 sütun var?" diyebilirsiniz. Bunun
nedeni, ilk göstergenin elde yapılması ve 25 sütundan oluşması.
Bu devre, D27 LED'i yandığında kendini sıfırlar. Aslında D27'nin
yandığını göremeyiz. Çünkü tarama çok hızlı bir şekilde gerçekleşir.
Eğer tarama frakansı çok yüksek olursa, tüm LED'lerin aynı anda
yandığı izlenimi ediniriz. Tarama sisteminin mantığı da bu yanılgı
üzerine kurulmuştur.
Yukardaki display 25 sütun ve 1 satırdan oluşur. Eğer anlamlı bir
görüntü elde etmek istiyorsak, daha fazla satır kullanmalıyız.
Bu gösterge, bizim aradığımız özellikleri sağlayacak gibi
görünüyor. Ama hala anlamlı bir karakter oluşturmak için gerekli
bilgiyi alamadınız. Çünkü, bu bilgiyi tarama kısmı değil,
mikrodenetleyici üretir. Tarama bölümü yalnızca sütunları sırayla
aktif etmek ve ara sıra da RESET yapmakla görevlidir.
Yukardaki animasyonlarda satırlardan sabit olarak lojik "1"
gönderildi. Eğer satırlardan her seferinde, karakterin bir sütununda
bulunan veriyi CLOCK'la eşzamanlı olarak gönderirsek satır verisini
de elde etmiş oluruz.
Şimdi bir L karakterinin nasıl oluşturulacağına bakalım.
L karakteri 4 temel adımda görüntülenir.
Kırmızı LED'ler yerine "1" yazdığınızda, PIC tarafından
gönderilecek binary veri ortaya çıkar.
1. adım: İlk sütun seçilerek satırlardan B'1111111' ikili
sayısı gönderilir. Bu işlemle L'nin 4. sütunu, display'in ilk
sütununda gösterilmiş olur. Gösterme süresi 1.583 mS kadardır. Veri
bir adım sola ötelenir.
2. adım: Display'in 2. sütunu seçilerek L'nin 3. sütunu
satır bilgisi olarak (B'0000001') gönderilir. Veri bir adım sola
ötelenir.
3. adım: Display'in 3. sütunu seçilerek L'nin 2. sütunu
satır bilgisi olarak (B'0000001') gönderilir. Veri bir adım sola
ötelenir.
4. adım: Display'in 4. sütunu seçilerek L'nin 1. sütunu
satır bilgisi olarak (B'0000001') gönderilir. Eğer gösterilecek
başka bir karakter varsa ötelemeye devam edilir. Gösterilecek
karakter yalnız L ise, ya işlemler tekrarlanır, ya da bizim
yaptığımız gibi gösterge boyunca kayma işlemi sürer.
GÖSTERİLECEK KARAKTERLERİN KODLARIMicrosoft Excel'le hazırlanmış, 2
sayfadan oluşan tabloyu indirmek için sayfa sonuna gidiniz. Bu
tabloda Türkçe karakterlere ait kodlar da var. PIC'i tıka basa
doldurduğumuzdan bu karakterleri kullanamadık. Ve aynı sayfalarda
son olarak çevrim tablolarıyla ilgili kod satırlarını da
bulabilirsiniz.
Gültekin'in kamerasından uygulamayla ilgili bir
görünüm.
Üç adet display, sürücü transistörler ve onlu sayıcılar aynı kart
üzerinde bulunuyor. 74160'lar ve 7402 ise board'a yerleştirildi.
Resmin altında PIC16F84A'nın bulunduğu deneme kartının bir
kenarını görüyorsunuz.
Bu fotoğrafa bakarken bir not düşelim:
Programlama kartıyla bilgisayar arasındaki kabloyu 1 metreden
kısa tutmaya bakın. Bu kablonu uzun olması denediğimiz 2 programlama
yazılımında da "0000' adresiyle ilgili hata mesajı almamıza
neden oldu. Ekranlı kablo kullandığımızda ise hata mesajı veren
yazılımlar yeniden kuzu kuzu yazmaya başladı.
KLAVYEDEN 2 TÜR VERİ ALINIR
|
|
Bir PC/AT Klavye ve 5 PIN'lik bir fişin
ÖNDEN görünümü.
Klavye de 5 Volt ile beslenir. Ancak 75 mA'e kadar akım
tüketebilir. Bir 7805 gerilim regülatörü, donanımın tamamını
beslemek için yeterlidir.
Tek başına DATA pin'ini kullanarak klavyeden gelen
verinin okuması yapılabilir. Bu yöntemin bir kusuru, bir
sonraki verinin alınması için geçen zamanı bilmek ve bu zaman
kadar PIC'i bekletmektir. |
İşte bir grafik ve herşeyi açıklıyor. Ne yazık ki bu bilgiye,
osilaskop başında epey ter döktükten sonra ulaştık.
Mikrodenetleyicinin RB7 pin'i CLOCK'ı, RA4 pin'i ise DATA'yı
okuma görevini üstlenir.
Klavyede bir tuşa basılmadığı sürece RB7 lojik "1"de bekler.
Klavyede herhangi bir tuşa basmak, otomatik olarak kesme alt
programını çalıştırır. Çünkü PIC, PORTB'deki lojik değişikliklere
duyarlıdır. CLOCK'ın ilk düşen kenarı değerlendirilmez (Start
bit'i). 2. düşen kenarla birlikte, ilk DATA RA4 aracılığıyla alınır.
CLOCK'ın 9. düşen kenarıyla son DATA alındıktan sonra, 10. ve 11.
darbeler pas geçilir. 2...9. adımlarda alınan DATA'lar paralel
veriye dönüştürüldüklerinde, ortaya çıkan şey tuş kodudur.
PROGRAM KODUProgram kodunu verdikten sonra, bazı ayrıntılar
üzerinde duracağız. Program kodunu indirmek için aşağıdaki metni
kopyalama yoluna gitmeyiniz. Bu, derlemede sorunlara yol açabilir.
matrix.asm ve matrix.hex dosyaları sayfa sonundaki
bağlantıdan indirilebilir. ;------------------------------------------------------------------------------------; ; 5x7 LED matrix ; ; Klavyeden girilen karakterler, önce paralel veriye dönüştürülür. Veri eğer, ; ; gösterilebilecek bir karakterse, PIC'in EEPROM'una TUŞ KODU olarak kaydedilir. ; ; Program EEOKU bölümüne geçtiğinde, EEPROM'a kaydedilmiş kodları sırasıyla okur. ; ; Okunan kod, çevrim tablosu tarafından karaktere dönüştürülür. Elde edilen yeni ; ; veri, LED display'lere gönderilir. 7 KASIM 2003 CUMA ; ;------------------------------------------------------------------------------------; LIST P=16F84A INCLUDE <P16F84A.INC> __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC ;------------------------------------------------------------------------------------; ; Register tanımlamaları ; ;------------------------------------------------------------------------------------; TEMP EQU H'0F' ; Geçici register. VERI EQU H'11' ; Seri verinin paralel olarak saklandığı file. BIT_N EQU H'12' ; Klavyeden alınan bit sayısı. CHAR_SUTUN EQU H'13' ; Karakterin sütun sayısı. EEREAD_N EQU H'14' ; EEPROM'dan okunacak maximum sütun sayısı. EEWRITE_N EQU H'15' ; EEPROM'a kaydedilen maximum sütun sayısı. LINE EQU H'16' ; Çevrim tablosunda ulaşılacak satır no. TIMER_H1 EQU H'1A' ; Timer HIGH1. TIMER_H2 EQU H'1B' ; Timer HIGH2. TIMA EQU H'1C' ; TimerA TIMB EQU H'1D' ; TimerB W_TEMP EQU H'1E' ; W'nin saklandığı geçici register. STATUS_TEMP EQU H'1F' ; STATUS'ın saklandığı geçici register. SUTUN1 EQU H'21' ; Sütun 1 bilgisinin saklandığı register. SUTUN2 EQU H'22' ; Sütun 2 bilgisinin saklandığı register. SUTUN3 EQU H'23' ; Sütun 3 bilgisinin saklandığı register. SUTUN4 EQU H'24' ; Sütun 4 bilgisinin saklandığı register. SUTUN5 EQU H'25' ; Sütun 5 bilgisinin saklandığı register. SUTUN6 EQU H'26' ; Sütun 6 bilgisinin saklandığı register. SUTUN7 EQU H'27' ; Sütun 7 bilgisinin saklandığı register. SUTUN8 EQU H'28' ; Sütun 8 bilgisinin saklandığı register. SUTUN9 EQU H'29' ; Sütun 9 bilgisinin saklandığı register. SUTUN10 EQU H'2A' ; Sütun 10 bilgisinin saklandığı register. SUTUN11 EQU H'2B' ; Sütun 11 bilgisinin saklandığı register. SUTUN12 EQU H'2C' ; Sütun 12 bilgisinin saklandığı register. SUTUN13 EQU H'2D' ; Sütun 13 bilgisinin saklandığı register. SUTUN14 EQU H'2E' ; Sütun 14 bilgisinin saklandığı register. SUTUN15 EQU H'2F' ; Sütun 15 bilgisinin saklandığı register. SUTUN16 EQU H'30' ; Sütun 16 bilgisinin saklandığı register. SUTUN17 EQU H'31' ; Sütun 17 bilgisinin saklandığı register. SUTUN18 EQU H'32' ; Sütun 18 bilgisinin saklandığı register. SUTUN19 EQU H'33' ; Sütun 19 bilgisinin saklandığı register. SUTUN20 EQU H'34' ; Sütun 20 bilgisinin saklandığı register. SUTUN21 EQU H'35' ; Sütun 21 bilgisinin saklandığı register. SUTUN22 EQU H'36' ; Sütun 22 bilgisinin saklandığı register. SUTUN23 EQU H'37' ; Sütun 23 bilgisinin saklandığı register. SUTUN24 EQU H'38' ; Sütun 24 bilgisinin saklandığı register. ;------------------------------------------------------------------------------------; ORG H'0000' ; RESET adresi. GOTO MAIN ; Ana programa. ORG H'0004' ; Kesme adresi. GOTO KLYOKU ; Kesme alt programına. ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; YUKLE ; PORTA ve PORTB'nin başlangıç ayarları. ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; BSF STATUS,RP0 ; BANK1'e geç. MOVLW B'00011000' ; W'ye H'10' yükle. MOVWF PORTA ; Çıkışlar: RA0=CLOCK, RA1=RESET, RA2=PRESET ; Girişler: RA3=SCAN_END, RA4=Klavye DATA MOVLW B'10000000' ; W'ye H'7F' yükle. MOVWF PORTB ; RB7 giriş (Klavye CLOCK), diğerleri çıkış. BCF STATUS,RP0 ; BANK0'a dön. CLRF PORTB ; PORTB'yi temizle. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; KLYTIMER ; Bu alt program, besleme gerilimin uygulanmasıyla birlikte, ; ; klavyeden gelen tanıtım bilgilerinin bitmesi için birkaç ; ; saniyelik bir gecikme sağlar. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; MOVLW D'5' ; W'ye 5 yükle. MOVWF TEMP ; TEMP'e gönder. BEKLE CALL TIMER_HIGH ; Gecikme alt programını çağır. DECFSZ TEMP,F ; TEMP-1, 0 mı? GOTO BEKLE ; Hayır, TEMP'i eksiltmeye devam et. RETURN ; Alt programdan çık. ;------------------------------------------------------------------------------------; MAIN ; Ana program. ;------------------------------------------------------------------------------------; CALL YUKLE ; Portların başlangıç ayarlarını yap. CALL KLYTIMER ; Klavyeden gelen parazitleri söndür. CLRF VERI ; VERI'yi temizle. CLRF EEREAD_N ; EEREAD_N'i temizle. CLRF EEWRITE_N ; EEWRITE_N'i temizle. CLRF EEADR ; EEADR'yi temizle. CLRF PORTB ; PORTB'yi temizle. MOVLW B'10001000' ; W'ye B'10001000' yükle. MOVWF INTCON ; Genel kesme izni, PORTB kesmesi aktif. ;------------------------------------------------------------------------------------; START CLRF PORTB ; PORTB'yi temizle. BSF PORTA,0 ; CLOCK hazır. (Düşen kenarla tetiklenir.) BCF PORTA,1 ; RESET=0 BSF PORTA,1 ; RESET=1, sayıcılar saymaya hazır. CALL SUTUN_TEMIZLE ; Sütun1...Sütun24'ü temizle. KAYIT_SAYISI? MOVLW 0 ; W'ye 0 yaz. MOVWF EEADR ; Veri sayısını okumak üzere EEADR'ye gönder. CALL OKU ; Kayıt sayısını öğren ve dön. MOVF EEDATA,W ; Kayıt sayısını W'ye yaz. BTFSC STATUS,Z ; Kayıt sayısı 0'dan farklı mı? GOTO START ; Hayır, kayıtlı sütun sayısı "0" DATA?255 MOVF EEDATA,W ; EEDATA'yı W'ye yaz. SUBLW D'255' ; 255-W BTFSC STATUS,Z ; DATA, 255'ten farklı mı? GOTO START ; Hayır 255, yeniden başla. MOVF EEDATA,W ; EEDATA'yı W'ye yaz. MOVWF EEREAD_N ; EEREAD_N register'a gönder. MOVWF EEWRITE_N ; EEWRITE_N register'a gönder. KAYIT_VARMI? MOVF EEREAD_N,W ; Okunacak karakter sayısını W'ye yaz. SUBLW H'FF' ; 255-EEREAD_N BTFSC STATUS,Z ; Okunacak bir kayıt var mı? GOTO START ; Hayır, tüm kayıt silinmiş. SONRAKI INCF EEADR,F ; EEADR+1 CALL OKU ; EEPROM'a kayıtlı veriyi al ve dön. MOVF EEDATA,W ; EEDATA'yı W'ye yaz. MOVWF VERI ; EEDATA'yı VERI'ye gönder. SUBLW D'113' ; 113-VERI (Delete tuşunu kodu) BTFSC STATUS,Z ; Basılan tuş DELETE'in dışında mı? GOTO START ; Hayır, basılan tuş DELETE. CALL ANALIZ ; Evet, tuşu analiz et, PORTB'den gönder. DECFSZ EEREAD_N,F ; Kayıtlı son veri okundu mu? GOTO BIR_SUTUN_BOS ; Hayır, karakter arası 1 sütun boş bırak. MOVLW D'41' ; Evet. MOVWF VERI ; W'ye boşluk karakterinin kodunu yaz. CALL BOSLUK1 ; Her CALL BOSLUK1... CALL BOSLUK1 ; ...komutuyla çağrılan... CALL BOSLUK1 ; ...alt programda 3 sütunluk... CALL BOSLUK1 ; ...boşluk bırakılır... CALL BOSLUK1 ; ...Bu, toplam olarak... CALL BOSLUK1 ; ...30 sütunluk boşluğa denk gelir.... CALL BOSLUK1 ; ...24 sütun kaydırıldığında display... CALL BOSLUK1 ; ...söner. Bu noktadan itibaren 6 sütun... CALL BOSLUK1 ; ...kayma süresi kadar daha, ekran... CALL BOSLUK1 ; ...sönük kalacaktır. GOTO START ; Ve tüm işlemleri yeniden yap. BIR_SUTUN_BOS MOVLW H'00' ; W'ye 0 yükle. MOVWF SUTUN1 ; SUTUN1'e gönder. MOVWF PORTB ; PORTB'den gönder. CALL GOSTER ; Sütun bilgilerini göster. CALL SHIFT ; 1 adım sola ötele. GOTO SONRAKI ; Hayır, sonraki sütun bilgisini oku. ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; SUTUN_TEMIZLE ; Sütun verisini temizle. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; CLRF SUTUN1 CLRF SUTUN2 CLRF SUTUN3 CLRF SUTUN4 CLRF SUTUN5 CLRF SUTUN6 CLRF SUTUN7 CLRF SUTUN8 CLRF SUTUN9 CLRF SUTUN10 CLRF SUTUN11 CLRF SUTUN12 CLRF SUTUN13 CLRF SUTUN14 CLRF SUTUN15 CLRF SUTUN16 CLRF SUTUN17 CLRF SUTUN18 CLRF SUTUN19 CLRF SUTUN10 CLRF SUTUN21 CLRF SUTUN22 CLRF SUTUN23 CLRF SUTUN24 RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; OKU ; EEPROM'daki veriyi oku. ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; BSF STATUS,RP0 ; BANK1'e geç. BSF EECON1,RD ; Girilen adresle ilgili veriyi oku. BCF STATUS,RP0 ; BANK0'a dön. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; SHIFT ; Sütunları 1 adım sola ötele. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; MOVF SUTUN23,W ; 23. sütunu W'ye yaz. MOVWF SUTUN24 ; 24. sütuna gönder. MOVF SUTUN22,W ; 22. sütunu W'ye yaz. MOVWF SUTUN23 ; 23. sütuna gönder. MOVF SUTUN21,W ; 21. sütunu W'ye yaz. MOVWF SUTUN22 ; 22. sütuna gönder. MOVF SUTUN20,W ; 20. sütunu W'ye yaz. MOVWF SUTUN21 ; 21. sütuna gönder. MOVF SUTUN19,W ; 19. sütunu W'ye yaz. MOVWF SUTUN20 ; 20. sütuna gönder. MOVF SUTUN18,W ; 18. sütunu W'ye yaz. MOVWF SUTUN19 ; 19. sütuna gönder. MOVF SUTUN17,W ; 17. sütunu W'ye yaz. MOVWF SUTUN18 ; 18. sütuna gönder. MOVF SUTUN16,W ; 16. sütunu W'ye yaz. MOVWF SUTUN17 ; 17. sütuna gönder. MOVF SUTUN15,W ; 15. sütunu W'ye yaz. MOVWF SUTUN16 ; 16. sütuna gönder. MOVF SUTUN14,W ; 14. sütunu W'ye yaz. MOVWF SUTUN15 ; 15. sütuna gönder. MOVF SUTUN13,W ; 13. sütunu W'ye yaz. MOVWF SUTUN14 ; 14. sütuna gönder. MOVF SUTUN12,W ; 12. sütunu W'ye yaz. MOVWF SUTUN13 ; 13. sütuna gönder. MOVF SUTUN11,W ; 11. sütunu W'ye yaz. MOVWF SUTUN12 ; 12. sütuna gönder. MOVF SUTUN10,W ; 10. sütunu W'ye yaz. MOVWF SUTUN11 ; 11. sütuna gönder. MOVF SUTUN9,W ; 9. sütunu W'ye yaz. MOVWF SUTUN10 ; 10. sütuna gönder. MOVF SUTUN8,W ; 8. sütunu W'ye yaz. MOVWF SUTUN9 ; 9. sütuna gönder. MOVF SUTUN7,W ; 7. sütunu W'ye yaz. MOVWF SUTUN8 ; 8. sütuna gönder. MOVF SUTUN6,W ; 6. sütunu W'ye yaz. MOVWF SUTUN7 ; 7. sütuna gönder. MOVF SUTUN5,W ; 5. sütunu W'ye yaz. MOVWF SUTUN6 ; 6. sütuna gönder. MOVF SUTUN4,W ; 4. sütunu W'ye yaz. MOVWF SUTUN5 ; 5. sütuna gönder. MOVF SUTUN3,W ; 3. sütunu W'ye yaz. MOVWF SUTUN4 ; 4. sütuna gönder. MOVF SUTUN2,W ; 2. sütunu W'ye yaz. MOVWF SUTUN3 ; 3. sütuna gönder. MOVF SUTUN1,W ; 1. sütunu W'ye yaz. MOVWF SUTUN2 ; 2. sütuna gönder. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; GOSTER ; Tablodan alınan sütun bilgisini PORTB'den gönderme. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; MOVF SUTUN1,W ; 1. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN2,W ; 2. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN3,W ; 3. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN4,W ; 4. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN5,W ; 5. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN6,W ; 6. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN7,W ; 7. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN8,W ; 8. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN9,W ; 9. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN10,W ; 10. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN11,W ; 11. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN12,W ; 12. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN13,W ; 13. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN14,W ; 14. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN15,W ; 15. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN16,W ; 16. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN17,W ; 17. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN18,W ; 18. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN19,W ; 19. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN20,W ; 20. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN21,W ; 21. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN22,W ; 22. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN23,W ; 23. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. MOVF SUTUN24,W ; 24. sütunu W'ye yaz. CALL GOSTER_ALT ; Diğer işlemler için alt programı çağır. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; GOSTER_ALT ; Bu alt program, sütun verisini PORTB'den gönderir. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; MOVWF PORTB ; Sütun bilgisini PORTB'den gönder. CALL TIMA_B ; Gecikme alt programını çağır. BCF PORTA,0 ; CLOCK düşen kenar. BSF PORTA,0 ; CLOCK yükselen kenar. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; TIMA_B ; PORTB'den LED'lere gönderilen bilgiyi gösterme süresi. (1,583 mS) ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; MOVLW D'20' ; W'ye 20 yaz. MOVWF TIMA ; TIMA register'a gönder. PAUSE2 MOVLW D'25' ; W'ye 25 yaz. MOVWF TIMB ; TIMB register' gönder. PAUSE1 DECFSZ TIMB,F ; TIMB-1, 0'a ulaştı mı? GOTO PAUSE1 ; Hayır. DECFSZ TIMA,F ; TIMA-1, 0'a ulaştı mı? GOTO PAUSE2 ; Hayır. RETURN ; Evet, alt programdan çık. ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; TIMER_HIGH ; Bu alt program yaklaşık 0.2 saniyelik bir gecikme sağlar. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; MOVLW D'255' ; W'ye 255 yaz. MOVWF TIMER_H1 ; TIMER_H1 register'a gönder. DONGU1 MOVLW D'255' ; W'ye 255 yaz. MOVWF TIMER_H2 ; TIMER_H2 register'a gönder. DONGU2 DECFSZ TIMER_H2,F ; TIMER_H2-1, 0 mı? GOTO DONGU2 ; Hayır. DECFSZ TIMER_H1,F ; TIMER_H1-1, 0 mı? GOTO DONGU1 ; Hayır. RETURN ; Evet, alt programdan çık.
;××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××; KLYOKU ; Klavyeden gönderilen seri bilgiyi, paralel veriye dönüştürür. ; ;××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××; BCF INTCON,GIE ; Tüm kesme işlemleri geçersiz. BCF INTCON,RBIE ; PORTB'den gelecek kesmeler geçersiz. BCF INTCON,RBIF ; PORTB kesme bayrağını sıfırla.
MOVWF W_TEMP ; W'yi W_TEMP'e gönder. SWAPF STATUS,W ; Alt ve üst 4-bit'i takas et. MOVWF STATUS_TEMP ; STATUS'ı STATUS_TEMP'e gönder. ;××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××; CLRF PORTB ; PORTB'yi temizle. BASLA CLRF VERI ; VERI'yi, yeni bilgi için temizle. CALL KLY_KONTROL ; Bit1 : START bit, değerlendirilmeyecek. MOVLW D'8' ; W'ye 8 yükle. MOVWF BIT_N ; BIT_N register'a gönder. BIT_KAYDIR RRF VERI,F ; VERI içindeki bilgiyi, 1-bit sağa ötele. CALL KLY_KONTROL ; CLOCK ve DATA sinyallerini değerlendir. IORWF VERI,F ; W ve VERI'ye OR işlevi uygula. IORLW B'01111111' ; W ve B'01111111'ye OR işlevi uygula. ANDWF VERI,F ; Maskele. DECFSZ BIT_N,F ; BIT_N-1, 0 mı? GOTO BIT_KAYDIR ; Hayır. CALL KLY_KONTROL ; Bit10 : EŞLİK bit'i, değerlendirilmeyecek. CALL KLY_KONTROL ; Bit11 : STOP bit'i, değerlendirilmeyecek. CALL KLY_KONTROL ; Klavyeden... CALL KLY_KONTROL ; ...parmağın... CALL KLY_KONTROL ; ...kaldırılması... CALL KLY_KONTROL ; ...sırasında... CALL KLY_KONTROL ; ...oluşan... CALL KLY_KONTROL ; ...ikinci... CALL KLY_KONTROL ; ...interrrupt'ın... CALL KLY_KONTROL ; ...önlenmesi. CALL KLY_KONTROL ; Aksi halde... CALL KLY_KONTROL ; ...her karakter... CALL KLY_KONTROL ; ...çift olarak gözükecektir. GOTO KLY_MAIN ; Seri veri, paralel veriye dönüştürüldü. KLY_KONTROL BTFSC PORTB,7 ; CLOCK 0 mı? GOTO $ - 1 ; Hayır, 0 olmasını bekle. BTFSS PORTB,7 ; CLOCK, 1 mi? GOTO $ - 1 ; Hayır, 1 olmasını bekle. BTFSS PORTA,4 ; DATA 1 mi? RETLW B'00000000' ; Hayır, 0 ile dön. RETLW B'10000000' ; Evet, 1 ile dön. ;××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××; KLY_MAIN ; Bu alt program, klavyeden gelen seri bilgiyi okur. ; ;××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××; DELETE? MOVF VERI,W ; VERI'yi W'ye yaz. SUBLW D'113' ; 113-VERI BTFSS STATUS,Z ; DELETE tuşuna basıldı mı? GOTO HATAKONTROL ; Hayır, devam et. MOVLW H'00' ; W'ye 0 yaz. MOVWF EEADR ; Adres bilgisi olarak EEADR'ye gönder. MOVWF EEDATA ; Veri olarak EEDATA'ya gönder. CALL EEYAZ ; 0. adrese 0 yaz. (Kayıt sayısını temizle.) CALL SUTUN_TEMIZLE ; Sütun bilgisini temizle. CLRF EEREAD_N ; Okunacak kayıt sayısı 0 CLRF EEWRITE_N ; EEPROM'a kayıt sayısı 0 GOTO KLYCIK ; Silme işlemi tamamlandı. HATAKONTROL MOVF VERI,W ; VERI'yi W'ye yaz. SUBLW B'11110000' ; HATAKODU-VERI BTFSC STATUS,Z ; Klavye kodu hatasız mı? GOTO KLYCIK ; Hatalı, alt programdan çık. SKIP MOVF VERI,W ; VERI'yi W'ye yaz. ANDLW B'01111111' ; 7. bit'i maskele. MOVWF VERI ; Maskelenen bilgiyi yeniden VERI'ye gönder. VERI_KAYDET MOVF VERI,W ; VERI'yi W'ye yaz. MOVWF EEDATA ; EEDATA'ya gönder. MOVF EEWRITE_N,W ; EEWRITE_N'i W'ye yaz. MOVWF EEADR ; EEADR'ye adres bilgisi olarak gönder. INCF EEADR,F ; EEADR+1 INCF EEWRITE_N,F ; Yazılan kayıt sayısını 1 arttır. CALL EEYAZ ; EEPROM'a yaz. KAYIT_SAYISI MOVLW 0 ; Kayıt sayısının tutulduğu adres. KAYDET MOVWF EEADR ; EEPROM'un ilk adresi. MOVF EEWRITE_N,W ; Kayıtlı bellek sayısını W'ye yaz. MOVWF EEDATA ; EEDATA' ya gönder. CALL EEYAZ ; VERI'yi EEPROM'a kaydet. KLYCIK SWAPF STATUS_TEMP,W ; STATUS_TEMP'i W'ye yaz. MOVWF STATUS ; STATUS'ı ilk konumuna getir. SWAPF W_TEMP,F ; W_TEMP'e swap işlemi uygula. SWAPF W_TEMP,W ; W'yi ilk konumuna getir. BCF INTCON,RBIF ; PORTB kesme bayrağını sıfırla. BSF INTCON,GIE ; Yeni kesmeler kabul edilir. BSF INTCON,RBIE ; PORTB'den gelecek kesmeler geçerli. RETFIE ; Alt programından çık. ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; EEYAZ ; VERI'yi EEPROM'a kaydetme alt programı. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; BSF STATUS,RP0 ; BANK1'e geç. BCF INTCON,GIE ; GIE pasif. BSF EECON1,WREN ; Yazma işlemine izin ver. MOVLW H'55' ; EEPROM... MOVWF EECON2 ; ...için... MOVLW H'AA' ; ...standard... MOVWF EECON2 ; ...işlemler. BSF EECON1,WR ; Yazma işlemini başlat. SIFIRDATUT BTFSC EECON1,WR ; Yazma işlemi bitti mi? GOTO SIFIRDATUT ; Hayır, bekle. BSF EECON1,WREN ; Evet, Write Enable'ı lojik "1" yap. BCF EECON1,EEIF ; EEIF'i temizle. BCF STATUS,RP0 ; BANK0'a dön. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; ANALIZ ; EEDATA register'ından alınan bilginin değerlendirilmesi. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; BIR_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'22' ; 22-EEDATA BTFSS STATUS,Z ; Basılan tuş "1" mi? GOTO IKI_1 ; Hayır. MOVLW D'3' ; W'ye 3 yaz. MOVWF LINE ; LINE register'a gönder. MOVLW D'3' ; Sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. BIR_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO BIR_2 ; Hayır, diğer sütunları oku. RETURN IKI_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'30' ; 30-EEDATA BTFSS STATUS,Z ; Basılan tuş "2" mi? GOTO UC_1 ; Hayır. MOVLW D'8' ; W'ye 8 yaz. CALL COMMON1 ; Ortak işlemler1. IKI_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO IKI_2 ; Hayır, diğer sütunları oku. RETURN UC_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'38' ; 38-EEDATA BTFSS STATUS,Z ; Basılan tuş "3" mü? GOTO DORT_1 ; Hayır. MOVLW D'13' ; W'ye 13 yaz. CALL COMMON1 ; Ortak işlemler1. UC_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO UC_2 ; Hayır, diğer sütunları oku. RETURN DORT_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'37' ; 37-EEDATA BTFSS STATUS,Z ; Basılan tuş "4" mü? GOTO BES_1 ; Hayır. MOVLW D'18' ; W'ye 18 yaz. CALL COMMON1 ; Ortak işlemler1. DORT_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO DORT_2 ; Hayır, diğer sütunları oku. RETURN BES_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'46' ; 46-EEDATA BTFSS STATUS,Z ; Basılan tuş "5" mi? GOTO ALTI_1 ; Hayır. MOVLW D'23' ; W'ye 23 yaz. CALL COMMON1 ; Ortak işlemler1. BES_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO BES_2 ; Hayır, diğer sütunları oku. RETURN ALTI_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'54' ; 54-EEDATA BTFSS STATUS,Z ; Basılan tuş "6" mı? GOTO YEDI_1 ; Hayır. MOVLW D'28' ; W'ye 28 yaz. CALL COMMON1 ; Ortak işlemler1. ALTI_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO ALTI_2 ; Hayır, diğer sütunları oku. RETURN YEDI_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'61' ; 61-EEDATA BTFSS STATUS,Z ; Basılan tuş "7" mi? GOTO SEKIZ_1 ; Hayır. MOVLW D'33' ; W'ye 33 yaz. CALL COMMON1 ; Ortak işlemler1. YEDI_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO YEDI_2 ; Hayır, diğer sütunları oku. RETURN SEKIZ_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'62' ; 32-EEDATA BTFSS STATUS,Z ; Basılan tuş "8" mi? GOTO DOKUZ_1 ; Hayır. MOVLW D'38' ; W'ye 38 yaz. CALL COMMON1 ; Ortak işlemler1. SEKIZ_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO SEKIZ_2 ; Hayır, diğer sütunları oku. RETURN DOKUZ_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'70' ; 70-EEDATA BTFSS STATUS,Z ; Basılan tuş "9" mu? GOTO SIFIR_1 ; Hayır. MOVLW D'43' ; W'ye 43 yaz. CALL COMMON1 ; Ortak işlemler1. DOKUZ_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO DOKUZ_2 ; Hayır, diğer sütunları oku. RETURN SIFIR_1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'69' ; 69-EEDATA BTFSS STATUS,Z ; Basılan tuş "0" mı? GOTO A1 ; Hayır. MOVLW D'48' ; W'ye 48 yaz. CALL COMMON1 ; Ortak işlemler1. SIFIR_2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO SIFIR_2 ; Hayır, diğer sütunları oku. RETURN A1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'28' ; 28-EEDATA BTFSS STATUS,Z ; Basılan tuş "A" mı? GOTO B1 ; Hayır. MOVLW D'53' ; W'ye 53 yaz. CALL COMMON1 ; Ortak işlemler1. A2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO A2 ; Hayır, diğer sütunları oku. RETURN B1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'50' ; 50-EEDATA BTFSS STATUS,Z ; Basılan tuş "B" mi? GOTO C1 ; Hayır. MOVLW D'58' ; W'ye 58 yaz. CALL COMMON1 ; Ortak işlemler1. B2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO B2 ; Hayır, diğer sütunları gönder. RETURN C1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'33' ; 33-EEDATA BTFSS STATUS,Z ; Basılan tuş "C" mi? GOTO D1 ; Hayır. MOVLW D'63' ; W'ye 63 yaz. CALL COMMON1 ; Ortak işlemler1. C2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO C2 ; Hayır, diğer sütunları gönder. RETURN D1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'35' ; 35-EEDATA BTFSS STATUS,Z ; Basılan tuş "D" mi? GOTO E1 ; Hayır. MOVLW D'68' ; W'ye 73 yaz. CALL COMMON1 ; Ortak işlemler1. D2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO D2 ; Hayır, diğer sütunları gönder. RETURN E1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'36' ; 36-EEDATA BTFSS STATUS,Z ; Basılan tuş "E" mi? GOTO F1 ; Hayır. MOVLW D'72' ; W'ye 77 yaz. CALL COMMON4 ; Ortak işlemler4. E2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO E2 ; Hayır, diğer sütunları gönder. RETURN F1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'43' ; 43-EEDATA BTFSS STATUS,Z ; Basılan tuş "F" mi? GOTO G1 ; Hayır. MOVLW D'76' ; W'ye 81 yaz. CALL COMMON4 ; Ortak işlemler4. F2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO F2 ; Hayır, diğer sütunları oku. RETURN G1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'52' ; 52-EEDATA BTFSS STATUS,Z ; Basılan tuş "G" mi? GOTO H1 ; Hayır. MOVLW D'81' ; W'ye 86 yaz. CALL COMMON1 ; Ortak işlemler1. G2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO G2 ; Hayır, diğer sütunları oku. RETURN H1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'51' ; 51-EEDATA BTFSS STATUS,Z ; Basılan tuş "H" mi? GOTO I1 ; Hayır. MOVLW D'86' ; W'ye 96 yaz. CALL COMMON1 ; Ortak işlemler1. H2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO H2 ; Hayır, diğer sütunları oku. RETURN I1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'67' ; 67-EEDATA BTFSS STATUS,Z ; Basılan tuş "I mı? GOTO J1 ; Hayır. MOVLW D'87' ; W'ye 97 yaz. MOVWF LINE ; LINE register'a gönder. MOVLW D'1' ; I'nın sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. I2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO I2 ; Hayır, diğer sütunları gönder. RETURN J1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'59' ; 59-EEDATA BTFSS STATUS,Z ; Basılan tuş "J mi? GOTO K1 ; Hayır. MOVLW D'91' ; W'ye 102 yaz. CALL COMMON4 ; Ortak işlemler4. J2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO J2 ; Hayır, diğer sütunları gönder. RETURN K1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'66' ; 66-EEDATA BTFSS STATUS,Z ; Basılan tuş "K" mı? GOTO L1 ; Hayır. MOVLW D'96' ; W'ye 107 yaz. CALL COMMON1 ; Ortak işlemler1. K2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO K2 ; Hayır, diğer sütunları gönder. RETURN L1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'75' ; 75-EEDATA BTFSS STATUS,Z ; Basılan tuş "L" mi? GOTO M1 ; Hayır. MOVLW D'100' ; W'ye 111 yaz. CALL COMMON4 ; Ortak işlemler4. L2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO L2 ; Hayır, diğer sütunları gönder. RETURN M1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'58' ; 58-EEDATA BTFSS STATUS,Z ; Basılan tuş "M" mi? GOTO N1 ; Hayır. MOVLW D'107' ; W'ye 118 yaz. MOVWF LINE ; LINE register'a gönder. MOVLW D'7' ; M'nin sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. M2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO M2 ; Hayır, diğer sütunları gönder. RETURN N1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'49' ; 49-EEDATA BTFSS STATUS,Z ; Basılan tuş "M" mi? GOTO O1 ; Hayır. MOVLW D'112' ; W'ye 123 yaz. CALL COMMON1 ; Ortak işlemler1. N2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO N2 ; Hayır, diğer sütunları gönder. RETURN O1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'68' ; 68-EEDATA BTFSS STATUS,Z ; Basılan tuş "O" mu? GOTO P1 ; Hayır. MOVLW D'117' ; W'ye 128 yaz. CALL COMMON1 ; Ortak işlemler1. O2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO O2 ; Hayır, diğer sütunları gönder. RETURN P1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'77' ; 77-EEDATA BTFSS STATUS,Z ; Basılan tuş "P" mi? GOTO Q1 ; Hayır. MOVLW D'122' ; W'ye 138 yaz. CALL COMMON1 ; Ortak işlemler1. P2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO P2 ; Hayır, diğer sütunları gönder. RETURN Q1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'21' ; 21-EEDATA BTFSS STATUS,Z ; Basılan tuş "Q" mu? GOTO R1 ; Hayır. MOVLW D'127' ; W'ye 143 yaz. CALL COMMON1 ; Ortak işlemler1. Q2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO Q2 ; Hayır, diğer sütunları oku. RETURN R1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'45' ; 45-EEDATA BTFSS STATUS,Z ; Basılan tuş "R" mi? GOTO S1 ; Hayır. MOVLW D'132' ; W'ye 148 yaz. CALL COMMON1 ; Ortak işlemler1. R2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO R2 ; Hayır, diğer sütunları gönder. RETURN S1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'27' ; 27-EEDATA BTFSS STATUS,Z ; Basılan tuş "S" mi? GOTO T1 ; Hayır. MOVLW D'137' ; W'ye 153 yaz. CALL COMMON1 ; Ortak işlemler1. S2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO S2 ; Hayır, diğer sütunları gönder. RETURN T1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'44' ; 44-EEDATA BTFSS STATUS,Z ; Basılan tuş "T" mi? GOTO U1 ; Hayır. MOVLW D'142' ; W'ye 163 yaz. CALL COMMON1 ; Ortak işlemler1. T2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO T2 ; Hayır, diğer sütunları gönder. RETURN U1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'60' ; 60-EEDATA BTFSS STATUS,Z ; Basılan tuş "U" mu? GOTO V1 ; Hayır. MOVLW D'147' ; W'ye 168 yaz. CALL COMMON1 ; Ortak işlemler1. U2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO U2 ; Hayır, diğer sütunları gönder. RETURN V1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'42' ; 42-EEDATA BTFSS STATUS,Z ; Basılan tuş "V" mi? GOTO W1 ; Hayır. MOVLW D'152' ; W'ye 178 yaz. CALL COMMON1 ; Ortak işlemler1. V2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO V2 ; Hayır, diğer sütunları gönder. RETURN W1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'29' ; 29-EEDATA BTFSS STATUS,Z ; Basılan tuş "W" mu? GOTO X1 ; Hayır. MOVLW D'159' ; W'ye 185 yaz. MOVWF LINE ; LINE register'a gönder. MOVLW D'7' ; Sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. W2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO W2 ; Hayır, diğer sütunları oku. RETURN X1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'34' ; 34-EEDATA BTFSS STATUS,Z ; Basılan tuş "X" mi? GOTO Y1 ; Hayır. MOVLW D'164' ; W'ye 190 yaz. CALL COMMON1 ; Ortak işlemler1. X2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO X2 ; Hayır, diğer sütunları oku. RETURN Y1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'53' ; 53-EEDATA BTFSS STATUS,Z ; Basılan tuş "Y" mi? GOTO Z1 ; Hayır. MOVLW D'169' ; W'ye 195 yaz. CALL COMMON1 ; Ortak işlemler1. Y2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO Y2 ; Hayır, diğer sütunları gönder. RETURN Z1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'26' ; 67-EEDATA BTFSS STATUS,Z ; Basılan tuş "Z" mi? GOTO NOKTA1 ; Hayır. MOVLW D'174' ; W'ye 200 yaz. CALL COMMON1 ; Ortak işlemler1. Z2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO Z2 ; Hayır, diğer sütunları gönder. RETURN NOKTA1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'74' ; 74-EEDATA BTFSS STATUS,Z ; Basılan tuş "NOKTA" mı? GOTO BOSLUK1 ; Hayır. MOVLW D'175' ; W'ye 201 yaz. MOVWF LINE ; LINE register'a gönder. MOVLW D'1' ; NOKTA'nın sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. NOKTA2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO NOKTA2 ; Hayır, diğer sütunları gönder. RETURN BOSLUK1 MOVF VERI,W ; Karakter'e ait kodu W'ye yaz. SUBLW D'41' ; 41-EEDATA BTFSS STATUS,Z ; Basılan tuş "SPACE" mi? RETURN ; Hayır. CUMLE_SONU MOVLW D'178' ; W'ye 204 yaz. MOVWF LINE ; LINE register'a gönder. MOVLW D'3' ; BOSLUK'un sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. BOSLUK2 MOVLW B'00000011' ; W'ye 3 yaz. CALL COMMON2 ; Ortak işlemler2. DECFSZ CHAR_SUTUN,F ; Karakterin sütun sayısı-1, 0 mı? GOTO BOSLUK2 ; Hayır, diğer sütunları gönder. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; ; Karakterlerle ilgili yapılacak ortak işlemler, bu alt programda toplandı. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; COMMON1 MOVWF LINE ; LINE register'a gönder. MOVLW D'5' ; Sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. RETURN COMMON2 MOVWF PCLATH ; Tabloya ulaşmak için üst bayt olarak yaz. MOVF LINE,W ; Line'ı W'ye yaz. CALL TABLE ; Çevrim tablosunu çağır. CLRF PCLATH ; Üst bayt'ı sıfırla. MOVWF SUTUN1 ; Tablo bilgisini SUTUN'a gönder. CALL GOSTER ; Sütun bilgisini LED göstergeye aktar. CALL SHIFT ; Sütunları 1 adım sola ötele. DECF LINE,F ; LINE-1 RETURN COMMON4 MOVWF LINE ; LINE register'a gönder. MOVLW D'4' ; Sütun sayısını W'ye yaz. MOVWF CHAR_SUTUN ; CHAR_SUTUN register'a gönder. RETURN ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; TABLE ; Klavyeden basılan her tuş KLYOKU alt programında 8-bit'lik paralel KOD'a ; ; dönüştürülür. Her karakterin sütun sayısı farklı olduğundan, karakterin ; ; sütun özellikleri aşağıda yer alan TABLE adlı alt programa yerleştirildi. ; ; Örneğin "I" karakterini oluşturmak için, 3 kez çevrim tablosundan okuma ; ; yapılır. "W" ya da "M" karakterini oluşturmak için ise 7 kez. ; ;«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»; ADDWF PCL,F ; Program sayıcı+Tabloda ulaşılacak satır. RETLW H'00' ; 0 _1 RETLW H'7F' ; 1 RETLW H'20' ; 2 RETLW H'10' ; 3 _2 RETLW H'31' ; 4 RETLW H'49' ; 5 RETLW H'49' ; 6 RETLW H'49' ; 7 RETLW H'27' ; 8 _3 RETLW H'36' ; 9 RETLW H'49' ; 10 RETLW H'49' ; 11 RETLW H'41' ; 12 RETLW H'22' ; 13 _4 RETLW H'04' ; 14 RETLW H'7F' ; 15 RETLW H'24' ; 16 RETLW H'14' ; 17 RETLW H'0C' ; 18 _5 RETLW H'46' ; 19 RETLW H'49' ; 20 RETLW H'49' ; 21 RETLW H'49' ; 22 RETLW H'7A' ; 23 _6 RETLW H'26' ; 24 RETLW H'49' ; 25 RETLW H'49' ; 26 RETLW H'49' ; 27 RETLW H'3E' ; 28 _7 RETLW H'60' ; 29 RETLW H'50' ; 30 RETLW H'48' ; 31 RETLW H'47' ; 32 RETLW H'40' ; 33 _8 RETLW H'36' ; 34 RETLW H'49' ; 35 RETLW H'49' ; 36 RETLW H'49' ; 37 RETLW H'36' ; 38 _9 RETLW H'3E' ; 39 RETLW H'49' ; 40 RETLW H'49' ; 41 RETLW H'49' ; 42 RETLW H'32' ; 43 _0 RETLW H'3E' ; 44 RETLW H'41' ; 45 RETLW H'41' ; 46 RETLW H'41' ; 47 RETLW H'3E' ; 48 _A RETLW H'3F' ; 49 RETLW H'48' ; 50 RETLW H'48' ; 51 RETLW H'48' ; 52 RETLW H'3F' ; 53 _B RETLW H'36' ; 54 RETLW H'49' ; 55 RETLW H'49' ; 56 RETLW H'49' ; 57 RETLW H'7F' ; 58 _C RETLW H'22' ; 59 RETLW H'41' ; 60 RETLW H'41' ; 61 RETLW H'41' ; 62 RETLW H'3E' ; 63 _D RETLW H'3E' ; 64 RETLW H'41' ; 65 RETLW H'41' ; 66 RETLW H'41' ; 67 RETLW H'7F' ; 68 _E RETLW H'41' ; 69 RETLW H'49' ; 70 RETLW H'49' ; 71 RETLW H'7F' ; 72 _F RETLW H'40' ; 73 RETLW H'48' ; 74 RETLW H'48' ; 75 RETLW H'7F' ; 76 _G RETLW H'2E' ; 77 RETLW H'49' ; 78 RETLW H'49' ; 79 RETLW H'41' ; 80 RETLW H'3E' ; 81 _H RETLW H'7F' ; 82 RETLW H'08' ; 83 RETLW H'08' ; 84 RETLW H'08' ; 85 RETLW H'7F' ; 86 _I RETLW H'7F' ; 87 _J RETLW H'7E' ; 88 RETLW H'01' ; 89 RETLW H'01' ; 90 RETLW H'02' ; 91 _K RETLW H'43' ; 92 RETLW H'24' ; 93 RETLW H'18' ; 94 RETLW H'08' ; 95 RETLW H'7F' ; 96 _L RETLW H'01' ; 97 RETLW H'01' ; 98 RETLW H'01' ; 99 RETLW H'7F' ; 100 _M RETLW H'3F' ; 101 RETLW H'40' ; 102 RETLW H'40' ; 103 RETLW H'3F' ; 104 RETLW H'40' ; 105 RETLW H'40' ; 106 RETLW H'3F' ; 107 _N RETLW H'7F' ; 108 RETLW H'02' ; 109 RETLW H'1C' ; 110 RETLW H'20' ; 111 RETLW H'7F' ; 112 _O RETLW H'3E' ; 113 RETLW H'41' ; 114 RETLW H'41' ; 115 RETLW H'41' ; 116 RETLW H'3E' ; 117 _P RETLW H'30' ; 118 RETLW H'48' ; 119 RETLW H'48' ; 120 RETLW H'48' ; 121 RETLW H'3F' ; 122 _Q RETLW H'3F' ; 123 RETLW H'43' ; 124 RETLW H'45' ; 125 RETLW H'41' ; 126 RETLW H'3E' ; 127 _R RETLW H'31' ; 128 RETLW H'4A' ; 129 RETLW H'4C' ; 130 RETLW H'48' ; 131 RETLW H'7F' ; 132 _S RETLW H'26' ; 133 RETLW H'49' ; 134 RETLW H'49' ; 135 RETLW H'49' ; 136 RETLW H'32' ; 137 _T RETLW H'40' ; 138 RETLW H'40' ; 139 RETLW H'7F' ; 140 RETLW H'40' ; 141 RETLW H'40' ; 142 _U RETLW H'7E' ; 143 RETLW H'01' ; 144 RETLW H'01' ; 145 RETLW H'01' ; 146 RETLW H'7E' ; 147 _V RETLW H'78' ; 148 RETLW H'06' ; 149 RETLW H'01' ; 150 RETLW H'06' ; 151 RETLW H'78' ; 152 _W RETLW H'7E' ; 153 RETLW H'01' ; 154 RETLW H'01' ; 155 RETLW H'7E' ; 156 RETLW H'01' ; 157 RETLW H'01' ; 158 RETLW H'7E' ; 159 _X RETLW H'41' ; 160 RETLW H'22' ; 161 RETLW H'1C' ; 162 RETLW H'22' ; 163 RETLW H'41' ; 164 _Y RETLW H'40' ; 165 RETLW H'20' ; 166 RETLW H'1F' ; 167 RETLW H'20' ; 168 RETLW H'40' ; 169 _Z RETLW H'61' ; 170 RETLW H'51' ; 171 RETLW H'49' ; 172 RETLW H'45' ; 173 RETLW H'43' ; 174 _NOKTA RETLW H'01' ; 175 _BOSLUK RETLW H'00' ; 176 RETLW H'00' ; 177 RETLW H'00' ; 178 ;------------------------------------------------------------------------------------; END
NOTLAR
- Son bir kontrolden sonra klavyeyi takınız.
- Besleme gerilimi uygulayınız. Sistemin çektiği akım 300
mA'den küçük olmalıdır.
- Besleme gerilimi uygulandığında, PIC16F84A birkaç saniye
süreyle hiçbir işlem yapmadan bekler. Bunun nedeni, klavyeden
gelen tanıtım bilgilerinin PIC'in EEPROM'una yazmasını
engellemektir. Aynı nedenle, besleme gerilimi uygulanmış iken
klavyeyi takıp çıkarmamaya özen gösteriniz.
- Şu karakterleri girebilirsiniz:
1234567890ABCDEFGHIJKLMNOPQRSTUVWYXZ, nokta ve
boşluk
- Girilen metni silmek için NumPad'deki DEL tuşunu
kullanmalısınız. Bu tuşa bastıktan sonra, ekrandaki eski metin
bilgisi sola doğru akıp kaybolana kadar bekleyiniz.
- İlk gösterilebilecek karakteri giriniz. Karakter, göstergenin
sağ tarafında belirecek ve sol doğru kayacaktır. Kayma, karakter
sol kenardan kaybolana kadar sürer. Eğer yeni bir karakter
girmezseniz, bu işlem sürekli olarak tekrarlanır. İkinci karakter,
otomatik olarak ilkinin sağında yer alır. İlk geçiş, daha önce
sözü edildiği gibi hatalı olabilir. Ancak sonraki geçişte
göstergenin girilen karakterleri doğru olarak görüntüleyeceğinden
emin olabilirsiniz.
- Karakterler arasındaki 1 sütunluk boşluk, yazılım tarafından
sağlanır. Sözcükler arasındaki boşluğu ise kullanıcı belirler. 1
kez space tuşuna bastığınızda, 3 sütunluk boşluk vermiş
olursunuz. Bu da EEPROM'da, diğer karakterler gibi 1 bayt'lık alan
kaplar.
- Cümle sonundaki boşluk ise 10 boşluktan oluşur. Bu, 30
sütunluk boşluğa denk gelir. Cümle sonu boşluklar, PIC'in
EEPROM'unda yer kaplamazlar.
- EEPROM'a kayıt için ek bir işlem yapmanız gerekmiyor. Siz her
yeni karakteri girdiğinizde, EEPROM'un H'00' adresindeki sayı 1
arttırılır. Bu sayı en çok D'63' olabilir.
- Herhangi bir tuşa basma sırasında PORTB kesmesi oluşur.
Gösterge parlamalarının (taramanın durduğu an) önüne geçmek için
her tuşa basma anında PORTB temizlenir. Tuşa basma sırasında,
göstergenin kısa kısa sönmesinin nedeni budur.
- Satırlarda, seri akım sınırlama dirençlerini, tüm sorunları
çözmeden küçültmeyiniz. Biraz daha parlaklık istiyorsanız,
taramanın normal yapıldığından emin olunuz. Herhangi bir tuşa
bastığınızda, display'in kısa bir süre için olsa bile donmamasını
sağlamalısınız. Aksi halde LED'ler hasar görebilir.
Gültekin'nin kamerasından son bir fotoğraf daha
alalım: Emekli, işi "kotarmaya" çalışıyor.
Resim kenarını bir notla dolduralım. Bilindiği gibi PORTB
kesmesi, INTCON register aracılıyla kurulur. Interrupt alt
programının çalışması için klavye üzerinde bir tuşa basmanız
yeterlidir. Klavyeden alınan seri bilgiler daha sonra
karşılaştırmalarda kullanılmak üzere, paralel olarak VERI adlı
kaydediciye yazılır. Klavyede bir tuşa bastığınızda, bir kesme
oluşur. Çünkü RB7 lojik "0"a çekilmiştir. Yazılım, bastığınız tuşu
değerlendirir. Örneğin A tuşuna basmışsanız, EEPROM'un H'00'
adresine 1, H'01' adresine ise A'nın kodu (D'28') yazılır. Siz henüz
parmağınızı tuştan çekmeden tüm işlemler bitirilir. Sonuçta A
karakteri display'e aktarılır. Ancak burada, PORTB kesmesinin
kötü bir yanıyla karşı karşıya kalırız.Parmağınızı tuştan
çektiğinizde, ikinci bir kesme oluşur. Bir önlem almazsanız, display
iki tane A karakterini gösterir. Karakteri teke düşürmek için,
değerlendirilmeye konulmayan bir okuma işlemi daha yaptırılır.
FrontPage, "28.8 üzerinde 223 saniye" mesajını veriyor.
Umarım bilgiye ulaşmanın, ekmeğe ulaşmak kadar zor olduğu
ülkemizde, PIC'le ilgili bazı sorunlarınızın ipuçlarını
bulabilmişsinizdir.
| İNDİRİLEBİLECEK DOSYALAR |
| AÇIKLAMA |
DOSYA |
BOYUT |
|
| TA5COZ metninin görüntülendiği ilk
animasyon |
anim1.zip |
77,392 KB |
|
| Eagle için hazırlanmış kütüphane
dosyası |
ccf.zip |
36,566 KB |
|
| 1 satır, 25 sütunluk tarama
animasyonu |
scan_anim1.zip |
31,096 KB |
|
| 7 satır, 24 sütunluk tarama
animasyonu |
scan_anim2.zip |
17,104 KB |
|
| Excel'le hazırlanmış, karakter
kodları |
code.zip |
41,082 KB |
|
| Programın asm dosyası |
matrix_asm.zip |
7,347 KB |
|
| Programın hex dosyası |
matrix_hex.zip |
1,968 KB |
|
| Mikrodenetleyici tanımlama dosyası |
P16F84A.zip |
1,171 KB |
|
| Bu makaledeki tüm dosyalar |
all.zip |
527,540 KB |
|
Ali YETİŞ (TA5CCF) Kasım
2003-KADİRLİ |