ADuC841 Mikrodenetleyicisi - 8051 MimarisiBlog YazılarGömülü Sistemler

Assembly ile ADuC841 – [4] Komut Kümesi – Kapsamlı Anlatım

8051 Assembly: Veri Transfer , Veri İşleme (matematiksel işlemler), Program Akışı Kontrol Komutları

Komut Kümesine Giriş

8051 mikrodenetleyicisinde 255 adet komut bulunur. Bu komutlar 1, 2 veya 3 byte uzunluğunda olabilir ve 1 ila 4 makine çevrimi arasında çalışır.

Komutlar 3 ana gruba ayrılır:

# Grup Açıklama
1 Veri Transfer Komutları Veriyi bir yerden alıp başka yere taşır
2 Veri İşleme Komutları Matematik ve mantık işlemleri yapar
3 Program Akışı Kontrol Komutları Programın akışını yönlendirir

Bölüm 2: Veri Transfer Komutları

Veri transfer komutları 3 alt gruba ayrılır.


2.1 Dahili Veri Hafıza Transfer Komutları

Genel yapı:

Adresleme modu kısaltmaları:

Kısaltma Anlamı
Dir Doğrudan adresleme
Ind Dolaylı adresleme
Reg Saklayıcı adresleme
Imm İvedi adresleme

Byte transfer komutları:

Komut İşlem Dir Ind Reg Imm
MOV A, kaynak A = kaynak ✓ ✓ ✓ ✓
MOV hedef, A hedef = A ✓ ✓ ✓ —
MOV hedef, kaynak hedef = kaynak ✓ ✓ ✓ ✓
MOV DPTR, #data16 DPTR = 16-bit sabit — — — ✓

Önemli Özellik: ACC’siz Transfer!

✅ MOV hedef, kaynak komutu iki dahili RAM veya SFR hücresi arasında ACC’ye gerek kalmadan veri taşır!


Carry Flag (C) ve Bit Transferi

Bit düzeyinde transferlerde veri mutlaka önce Carry Flag (C)’ye gider. C, PSW saklayıcısının 7. bitidir.

 

Örnek: P3.7 bitini okuyup 00h adresine yaz:

⚠️ Bit transferlerinde veri doğrudan bir bitten diğerine gidemez, mutlaka C üzerinden geçer!


2.2 Harici Veri Hafıza Transfer Komutları

Harici RAM’e erişmek için MOVX komutu kullanılır:

Komut Adres Genişliği İşlem
MOVX A, @Ri 8-bit Harici RAM’den oku
MOVX @Ri, A 8-bit Harici RAM’e yaz
MOVX A, @DPTR 16-bit Harici RAM’den oku
MOVX @DPTR, A 16-bit Harici RAM’e yaz

⚠️ Harici RAM erişimlerinde ACC her zaman kaynak veya hedef olmak zorundadır!

⚠️ RD ve WR sinyalleri yalnızca MOVX çalışırken aktif olur. Diğer zamanlarda bu pinler I/O hattı olarak kullanılabilir.


2.3 Look-up Tabloları (MOVC)

RAM enerjisi kesildiğinde veriler kaybolur. Kalıcı veriler Program Hafızasına (Flash) yazılır. Bunlara Look-up Table denir ve MOVC komutuyla okunur:

Komut İşlem
MOVC A, @A+DPTR Program Hafıza (A+DPTR) adresini oku
MOVC A, @A+PC Program Hafıza (A+PC) adresini oku

Kullanım örneği:

⚠️ Look-up Table’lar sadece okunabilir, değiştirilemez!

⚠️ Tablo RET komutundan hemen sonra gelmeli. Sıfır indeksli veri kullanılamaz çünkü 0. konum RET komutunun adresini içerir!


Bölüm 3: Veri İşleme Komutları

Tüm işlemler ALU (Arithmetic and Logic Unit) biriminde yapılır ve bayrakları etkiler.


3.1 Lojik Komutlar

ANL – AND İşlemi

AND Doğruluk Tablosu:

Bit 1 Bit 2 Sonuç
0 0 0
0 1 0
1 0 0
1 1 1

✅ AND ile bitleri sıfırlama (maskeleme) yapılır. Sıfırlamak istediğin bite 0, korumak istediğine 1 yaz!

Gerçek Örnek – PSW’de RS0=0, RS1=0 yap, diğer bitlere dokunma:


ORL – OR İşlemi

OR Doğruluk Tablosu:

Bit 1 Bit 2 Sonuç
0 0 0
0 1 1
1 0 1
1 1 1

✅ OR ile bitleri 1 yapma (setleme) yapılır. 1 yapmak istediğin bite 1, korumak istediğine 0 yaz!

Gerçek Örnek – PSW’de RS0=1, RS1=1 yap:


XRL – XOR İşlemi

XOR Doğruluk Tablosu:

Bit 1 Bit 2 Sonuç
0 0 0
0 1 1
1 0 1
1 1 0

✅ XOR ile bitleri tersleme (toggle) yapılır!


3.2 CLR ve CPL Komutları

Örnek:


3.3 Aritmetik Komutlar

Komut İşlem Açıklama
ADD A, byte A = A + byte Elde olmadan topla
ADDC A, byte A = A + byte + C Carry ile topla
SUBB A, byte A = A – byte – C Borçla çıkar
INC A A = A + 1 ACC artır
INC byte byte = byte + 1 Adresi artır
INC DPTR DPTR = DPTR + 1 DPTR artır
DEC A A = A – 1 ACC azalt
DEC byte byte = byte – 1 Adresi azalt
MUL AB B:A = B × A Çarp
DIV AB A = tam, B = kalan Böl
DA A Ondalık Ayar BCD için

ADD ve ADDC Farkı

ADD – düz toplama:

ADDC – 16-bit büyük sayı toplamada carry de eklenir:


MUL ve DIV


Bölüm 4: Döndürme Komutları

ACC üzerinde 4 farklı döndürme komutu vardır:

Komut Açıklama
RL A ACC’yi sola 1 bit döndür
RLC A ACC’yi carry üzerinden sola döndür
RR A ACC’yi sağa 1 bit döndür
RRC A ACC’yi carry üzerinden sağa döndür

✅ Sola döndürme = 2 ile çarpma, Sağa döndürme = 2 ile bölme (bit taşması yoksa!)

Örnek 

Ne yapar bu kod?

Her adımda tek bir LED yanar ve sola kayar – akan LED efekti!

Adım A değeri (binary) Port 1 Durumu
Başlangıç 0000 0001 Sadece P1.0 yanar
1. dönüş 0000 0010 Sadece P1.1 yanar
2. dönüş 0000 0100 Sadece P1.2 yanar
3. dönüş 0000 1000 Sadece P1.3 yanar
… … …
7. dönüş 1000 0000 Sadece P1.7 yanar

Döndürmede Dikkat – Hata Durumu!

⚠️ 3. döndürmede Bit-0 “1” değerini aldığından 2 ile çarpma sonucu hatalı olur! Bu durumda carry üzerinden döndürme (RLC) kullanılmalıdır.

Doğru kullanım (RLC ile):


Bölüm 5: Karşılıklı Değiştirme Komutları

SWAP A

ACC’nin yüksek nibble (bit7-4) ile düşük nibble’ını (bit3-0) yer değiştirir:

XCH A, byte

ACC ile bir byte arasındaki değerleri karşılıklı değiştirir:

XCHD A, @Ri

Sadece düşük nibble’ları karşılıklı değiştirir:


Bölüm 6: Program Akışı Kontrol Komutları

6.1 Durumdan Bağımsız (Unconditional) Dallanma

Komut Açıklama Kapsam
SJMP adres Kısa atlama ±128 byte
AJMP adres Mutlak atlama 2KB blok
LJMP adres Uzun atlama 64KB tümü
LJMP @A+DPTR İndisli atlama Tablo ile

6.2 Koşullu (Conditional) Dallanma Komutları

Komut Koşul Açıklama
JZ adres ACC = 0 ise ACC sıfırsa atla
JNZ adres ACC ≠ 0 ise ACC sıfır değilse atla
JC adres C = 1 ise Carry 1 ise atla
JNC adres C = 0 ise Carry 0 ise atla
JB bit, adres bit = 1 ise Bit 1 ise atla
JNB bit, adres bit = 0 ise Bit 0 ise atla
JBC bit, adres bit = 1 ise, biti sıfırla Atla ve biti temizle
CJNE byte1, byte2, adres byte1 ≠ byte2 ise Eşit değilse atla
DJNZ byte, adres byte’ı azalt, ≠ 0 ise Döngü komutu

6.3 Örnekler ve Analizi

JB/JNB ile Buton Kontrolü

Bu görsellerde şu devre ve kod var:

Devre: P1.1’e bir buton, P3.0’a bir LED bağlı.

Amaç: P1.1 basılıysa LED yak, P1.2 basılıysa LED söndür.

Mantığı:

  • Butonlar normalde 5V (lojik 1) konumundadır
  • Butona basıldığında pin GND’ye (lojik 0) çekilir
  • JB → “Jump if Bit = 1” → buton basılı değilse atlar
  • JNB → “Jump if Bit = 0” → buton basılıysa atlar

✅ Buton bağlantısında pull-up direnci kullanıldığında basılmamış = 1, basılmış = 0 olur!


SUBB ile Karşılaştırma

Amaç: P1 değeri P3’ten küçükse P0.1’i yak, büyükse P0.0’ı yak.

SUBB’nin Mantığı:

⚠️ SUBB kullanmadan önce mutlaka clr c yazılmalıdır! Aksi hâlde önceki işlemin carry’si sonucu bozar!

CJNE ile Eşitlik Kontrolü

Amaç: P1 = 55h ise P3.1’i yak, değilse söndür.

CJNE’nin Mantığı:

  • CJNE → “Compare and Jump if Not Equal”
  • İki değeri karşılaştırır
  • Eşit değilse belirtilen adrese atlar
  • Eşitse bir sonraki satırdan devam eder

DJNZ ile Sayaç Döngüsü

Görsel 6 (DEC ile):

Görsel 7 (DJNZ ile – daha verimli):

DJNZ’nin Mantığı:

  • “Decrement and Jump if Not Zero”
  • Sayacı 1 azaltır
  • Sıfır değilse döngüye devam eder
  • Tek komutla hem azaltma hem kontrol yapar → çok verimli!

Karşılaştırma:

Yöntem Komut sayısı Bellek
DEC + CJNE 2 komut Daha fazla
DJNZ 1 komut Daha az

Bölüm 7: Bit Transfer Komutları

Komut İşlem
MOV C, bit Biti Carry’e kopyala
MOV bit, C Carry’i bite kopyala
ANL C, bit C = C AND bit
ANL C, /bit C = C AND (bit’in tersi)
ORL C, bit C = C OR bit
ORL C, /bit C = C OR (bit’in tersi)
CLR C C = 0
CLR bit bit = 0
SETB C C = 1
SETB bit bit = 1
CPL C C = C tersi
CPL bit bit = bit tersi

 

Örnek:


Genel Özet Tablosu

Komut Grubu Komutlar Ne İşe Yarar?
Dahili Transfer MOV RAM, SFR, port arası taşıma
Harici Transfer MOVX Harici RAM okuma/yazma
Tablo Okuma MOVC Flash’tan sabit okuma
Lojik ANL, ORL, XRL Bit maskeleme, setleme, tersleme
Temizle/Tersle CLR, CPL ACC ve bit işlemleri
Toplama ADD, ADDC, INC Artırma ve toplama
Çıkarma SUBB, DEC Azaltma ve çıkarma
Çarpma/Bölme MUL, DIV Aritmetik
Döndürme RL, RR, RLC, RRC Bit kaydırma
Değiştirme SWAP, XCH, XCHD Nibble/byte değiştirme
Koşulsuz Atla SJMP, AJMP, LJMP Program akışı
Koşullu Atla JZ, JNZ, JC, JNC, JB, JNB, CJNE, DJNZ Şartlı dallanma
Bit Transfer MOV C, SETB, CLR, CPL Tek bit işlemleri

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu