Intel 8086 Mikroişlemci Assembler ile porttan tuş okuma ve led tarama uygulaması
|
Şimdi baştan itibaren yorumlayalım, adım adım yapacağımız işleri belirleyelim. (algoritmayı yapılandıralım) Port koşullama. Basılan tuşları okuma. Misal basılan tuşları almış olalım, 1000-1003 adreslerine kaydetmiş olalım. Niye direk ledleri yakmıyoruz da kaydediyoruz? Aşağıda cevabı… Şimdi ledleri nasıl yakabileceğimizi düşünelim. Diyelim ilk başta S3′e basıldı. Yani S3′ün altındaki ledlerin 4ü de yanacak. Bu nasıl olabilir? A4-A5-A6-A7 ve B4 ‘e 1 göndermeliyiz değil mi? Sonra S1′e basılmış olsun. S1′de 3 led yanacak. A4-A5-A6 ve B4′e 1 göndereceğiz, A7 0 olacak. Ama bir öncekinde A7 de 1di. Aynı anda nasıl olacak bu iş? Demekki olamayacak. Led takımını tarayarak yapacağız bunu. Hızlı bir şekilde önce S3ün ledleri, sonra s1in ledleri taranacak sırasına göre. Ve insan gözü sürekli yanıyor görecek onu. İşte sürekli taramamız gerektiği için de basılan tuşları biryerde saklamalıyız. Anlık olmayacak bir iş bu. Aynalama ve öteleme Dertli bir kısım var, B0daki S0 düğmesinin ledi B4′te. Yani Port B verisi 00000010 ise bizim Led yakarken 01000000 göndermemiz lazım. Yani 4 bitlik bir aynalama yapmak ve sonra da 4 bit sola ötelemek lazım. Burası biraz karışık gelebilir, açalım; Örnek olarak yapacağımız işlem şu işi yapmalı; 00000100 > 00100000 00001000 > 00010000 Bunu yapmak için son 4 biti alalım. 00000100. Sonra 4 bu biti kendi içinde aynalayalım. 00000010 olsun. Onu da 4 bit sola öteleyelim. 00100000 olmuş olacak. Aynı tuşa birden fazla basılmadığını ve her tuşa basıldığını kabul ediyorum. O zaman geçelim kodlamaya gençler.
//port a çıkış //port b 0-1-2-3 giriş 4-5-6-7 çıkış // 4 tuşa basılıyor, 4lük bir döngüde tuşları alayım. Her tuş için aynalama öteleme işlerini yapayım ve kaydedeyim, sonra yeni tuşa geçeyim. (Merak etmeyin insan ikinci tuşa o işlemlerden bitmeden basamaz. Öyle bir insan yok.)
//Şimdi tuş bırakıldı ve ihtiyacımız olan veri (basılan tuş bilgisi) BL’de bizi bekliyor. // Şimdi açıklamada anlattığımız aynalama ve öteleme işlemlerini yapalım. Verimiz BL’de. BL’nin son 4 bitini aynalamayı tek tek yapıyorum. 1. bit 4′e, 2.bit 3′e gibi. Bitlerin yerlerini değiştirip AL’de tutuyorum ve AL’nin üzerine yazıyorum hep. Çünkü biliyorum ki bunlardan sadece bir tanesi 1. BL= 00000100 ise, önce 1. bit AL’nin 4. bitine gelmiş oluyor (00000000), sonra BL’nin 2. biti AL’nin 3. bitine, sonra BL’nin 3. biti AL’nin 2. bitine (00000010 oldu). Ve her seferinde AL’ye OR ile alıyorum veriyi, ki 00000010 elde ettikten sonra gelen veri 0 olursa da 2. bitteki 1′i bozmasın diye. Bu 8 bitten sadece bir tanesi 1 olduğu için OR ile alınca 1 olan veri korunmuş olacak. (Burası hala karışık geliyor olabilir. Kağıt üzerinde adım adım yazıp örneklerseniz anlayabilirsiniz. )
//1. bit 4′e //2.bit 3′e //3. bit 2′ye //4. bit 1′e // Şimdi AL’nin son 4 biti BL’nin son 4 bitinin aynalanmışı. Yani BL= 00000100 ise AL= 00000010 oldu. Şimdi öteleyelim ve 00100000 elde edelim.
// Şimdi 1003′te ilk basılan 1000′de son basılan var. (Aynalanmış, ötelenmiş şekilde.) Bu veriyi B portuna verdiğimizde S2′nin B2′den gelen verisi B5′e direk verilmiş olacak. Yani 1000′den itibaren kaydettiğimiz 4 veriyi ard arda sırayla B portuna basarak led tarama işini halletmiş olacağız.
// 2. basılana 3 led yanacak // 3. basılana 2 led yanacak // 4. basılana 1 led yanacak
Geçmiş olsun. Not: Ufak tefek hatalar olabilir. Ama genel olarak doğrudur. Oğuzhan Hoca‘nın da kontrolünden geçmiştir. |
English Articles
Emrah Üstün
