MİKROİŞLEMCİ LABORATUARI UYGULAMA ÖRNEKLERİ



Benzer belgeler
MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

Mikroişlemcili Sistemler ve Laboratuvarı 8.Hafta

KOMUT TABLOSU İLE İLGİLİ AÇIKLAMALAR:

Mikrobilgisayar Mimarisi ve Programlama

SAUEEE.ORG. Önce C 00 Sonrası C 00

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

ASSEMBLY DİLİNDE PROGRAMLAMA

Sayı sistemleri iki ana gruba ayrılır. 1. Sabit Noktalı Sayı Sistemleri. 2. Kayan Noktalı Sayı Sistemleri

Ayhan Yüksel. (Son güncelleme: Berat Doğan) Tıbbi Enstrumantasyon Tasarım & Uygulamaları ( )

Elektronik sistemlerde dört farklı sayı sistemi kullanılır. Bunlar;

SAYISAL ELEKTRONİK. Ege Ü. Ege MYO Mekatronik Programı

3.3. İki Tabanlı Sayı Sisteminde Dört İşlem

BÖLÜM 7 Kesmeler.

BÖLÜM 6 Seri Port Đşlemleri

BIL 362 Mikroilemciler Dersi Arasınav Cevapları 3 Temmuz 2007

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI İKİLİ TABANDA ÇOK BAYTLI ÇARPMA

BÖLÜM 4. Dahili veri hafıza transfer komutlarının genel yapısı, mov <hedef>, <kaynak> şeklindedir

Mikrobilgisayar Mimarisi ve Programlama

2. SAYI SİSTEMLERİ. M.İLKUÇAR - imuammer@yahoo.com

Sayı sistemleri iki ana gruba ayrılır. 1. Sabit Noktalı Sayı Sistemleri. 2. Kayan Noktalı Sayı Sistemleri 2. SAYI SĐSTEMLERĐ VE KODLAR

JZ TEST3 (7/3) 1 makine çevrimi süresi

DENEY II RAPORU MİKROİŞLEMCİ UYGULAMALARI LABORATUVARI

2. SAYI SİSTEMLERİ VE KODLAR

1. Bölüm Sayı Sistemleri

8086 Mikroişlemcisi Komut Seti

Mikrobilgisayarda Aritmetik

SAYI SİSTEMLERİ. 1. Sayı Sistemleri. Sayı Sistemlerinde Rakamlar

Fatih University- Faculty of Engineering- Electric and Electronic Dept.

BLM221 MANTIK DEVRELERİ

2. Sayı Sistemleri. En küçük bellek birimi sadece 0 ve 1 değerlerini alabilen ikili sayı sisteminde bir basamağa denk gelen Bit tir.

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

MTM 305 MİKROİŞLEMCİLER

2. SAYI SİSTEMLERİ 2. SAYI SİSTEMLERİ

Her bir kapının girişine sinyal verilmesi zamanı ile çıkışın alınması zamanı arasında çok kısa da olsa fark bulunmaktadır -> kapı gecikmesi

Bir işaretli büyüklük sayısında en soldaki basamak bir işaret içerir. Diğer basamaklarda ise sayısal değerin büyüklüğü (mutlak değeri) gösterilir.

Giriş MİKROİŞLEMCİ SİSTEMLERİ. Elektronik Öncesi Kuşak. Bilgisayar Tarihi. Elektronik Kuşak. Elektronik Kuşak. Bilgisayar teknolojisindeki gelişme

İLERI MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı


MTM 305 MĠKROĠġLEMCĠLER

BILGISAYAR ARITMETIGI

2. Sayı Sistemleri. En küçük bellek birimi sadece 0 ve 1 değerlerini alabilen ikili sayı sisteminde bir basamağa denk gelen Bit tir.

DENEY III RAPORU MİKROİŞLEMCİ UYGULAMALARI LABORATUVARI

8086 Mikroişlemcisi Komut Seti

Mikroişlemcili Sistemler ve Laboratuvarı

MTM 305 MĠKROĠġLEMCĠLER

Algoritma ve Programlamaya Giriş

n. basamak basamak 3. basamak 2. basamak 1. basamak Üstel değer 10 n Ağırlık 10 n-1...

Sayı sistemleri-hesaplamalar. Sakarya Üniversitesi

Adresleme Modları. Mikroişlemciler ve Mikrobilgisayarlar

B.Ç. / E.B. MİKROİŞLEMCİLER

1. PORTB ye bağlı 8 adet LED i ikili sayı sisteminde yukarı saydıracak programı

8051 MİMARİSİ. Temel mimari yapısı Şekil 3.1 de görülmekte olan 8051 mikrodenetleyici ailesinin başlıca özellikleri aşağıda verilmiştir.

d) x TABAN ARĐTMETĐĞĐ

KASIRGA -4 Buyruk Tasarımı Belgesi Ankara

# PIC enerjilendiğinde PORTB nin 0. biti 1 olacak #PIC enerjilendiğinde PORTA içeriğinin tersini PORTB de karşılık gelen biti 0 olacak

Sayılar Teorisi SAYILAR TEORİSİ VE SAYILAR

Sayı Sistemleri. Onluk, İkilik, Sekizlik ve Onaltılık sistemler Dönüşümler Tümleyen aritmetiği

EBG101 PROGRAMLAMA TEMELLERİ VE ALGORİTMA

DENEY-2. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

SAYILAR DOĞAL VE TAM SAYILAR

14. MİKROİŞLEMCİ PROGRAMLAMA TEKNİKLERİ

EGE ÜNİVERSİTESİ EGE MYO MEKATRONİK PROGRAMI

MTM 305 MİKROİŞLEMCİLER

Özet DERS 5. Şu ana kadar bilmeniz gerekenler... İşaretsiz Çarpma. Bayraklardaki Durumlar. İşaretli Çarpma

Sayıtlama Dizgeleri. (a n a n-1 a n1 a n0. b 1 b 2 b m )r. simgesi şu sayıyı temsil eder.

16F84 ü tanıt, PORTB çıkış MOVLW h FF MOWF PORTB

T.C. KOCAELİ ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ BİLİŞİM SİSTEMLERİ MÜHENDİSLİĞİ

DERS 7 PIC 16F84 PROGRAMLAMA İÇERİK. PIC 16F84 örnek programlar Dallanma komutları Sonsuz döngü

BILGISAYAR ARITMETIGI

Algoritmalar ve Programlama. DERS - 2 Yrd. Doç. Dr. Ahmet SERBES

ALGORİTMA (ALGORITHM) M.İLKUÇAR -

SAYI VE KODLAMA SİSTEMLERİ. Teknoloji Fakültesi/Bilgisayar Mühendisliği

BİLGİSAYAR PROGRAMLAMA DERSİ

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

Mikroişlemciler Ara Sınav---Sınav Süresi 90 Dk.

Mikroişlemcilerde Aritmetik

MTM 305 MİKROİŞLEMCİLER

BLM221 MANTIK DEVRELERİ

BIL 362 Mikroilemciler Dersi Final Sınavı Cevapları

SAYISAL DEVRELER. İTÜ Bilgisayar Mühendisliği Bölümündeki donanım derslerinin bağlantıları

Çok sayıda adım motoru tasarımı olmasına rağmen, bu motorlar iki değişik temel tür altında toplanabilir: değişken relüktanslı veya hibrid yapılı.

Elektroniğe Giriş 1.1

BÖLÜM 2 SAYI SĐSTEMLERĐ (NUMBER SYSTEMS)

MİKRO DENETLEYİCİLER II DERS NOTLARI (VİZE KONULARI) Prof. Dr. Hakan Ündil Bahar-Vize

BLM1011 Bilgisayar Bilimlerine Giriş I

SAYISAL ELEKTRONİK DERS NOTLARI:

MTM 305 MĠKROĠġLEMCĠLER

Program Kodları. void main() { trisb=0; portb=0; while(1) { portb.b5=1; delay_ms(1000); portb.b5=0; delay_ms(1000); } }

PIC TABANLI, 4 BASAMAKLI VE SER

LPC2104 Mikro Denetleyicisini KEIL İle Programlamak

Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#8

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

Konular MİKROİŞLEMCİ SİSTEMLERİ. Giriş. Bilgisayar Tarihi. Elektronik Kuşak. Elektronik Öncesi Kuşak

BMT 101 Algoritma ve Programlama I 6. Hafta. Yük. Müh. Köksal Gündoğdu 1

ÖRNEK 1: Verilen iki sayının toplamının bulunmasının algoritması aşağıdaki gibi yazılır:

SAYI SİSTEMLERİ. Sayı Sistemleri için Genel Tanım

Bilgisayarların Gelişimi

INTEGER OVERFLOW ***************************************************************/

Internet Programming II

Transkript:

MİKROİŞLEMCİ LABORATUARI UYGULAMA ÖRNEKLERİ UYGULAMA 1 Bu uygulamada DIP anahtar konumunu P1 den okuyup, bu konumların LED lerde görüntülenmesi için P2 de yazacağız. Bu uygulamaya ait assembly program parçası aşağıda verilmektedir. ;********************************************************** ;***** 3m LED DIP anahtar kullanılarak Giriş/Çıkış ******* ;***** deneyinin gerçekleştirilmesi ******* basla org 08000h ;baslangıç adresi, reset vektörü ljmp led_1 org 08100h led_1: mov a,p1 cpl A mov P2,a ;P1'deki,DIP anahtar konumlarını oku ;A nın tersini al ;bu değeri Port 4'e yaz nop ; sjmp led_1 ;led_1 satırından devam et end UYGULAMA 2 Bu uygulamada sizlere program yazarken ihtiyacını duyduğumuz gecikme altyordamlarının ne işe yaradığını, sürelerin ne şekilde hesaplandığını örneklerle gösterelim. Kısa süreli beklemeler için tek döngülü altyordam kullanırız. Bunun için aşağıdaki örneğimizi inceleyelim. bekle: mov r7,#0ffh ;2byte,12periyod bekle1: djnz r7,bekle1 ret ;2byte,24periyod ;1byte,24periyod Programımızda r7 kayıtçısına(register) 0FFh(255) sayısı yüklenerek bir öndeğer atanmış olur. Sonraki adımda bu kayıtçı içeriği sıfır olana kadar birer birer azaltılır. Bu azaltma işlemi bizim kurguladığımız döngüyü oluşturmaktadır. Kayıtçı r7 sıfıra ulaşınca djnz kıyaslama sonucunda program bir sonraki satır 1

ret ile devam etmektedir. Bu satırın işlenmesi sonucunda da program kontrolü bu altyordamın çağrıldığı yere aktarılmaktadır. Bu altyordamın çağrıldığı satırın hemen altından devam etmektedir. Bu gecikme altyoramında gecikme süresi hesabını komutların programda kaç osilatör periyodu olduğuna bakarak yaparız. Bunun için 8051 komut tablosunda her komutun kaç osilatör periyodu ile işletildiği ve kaç byte gerektiği verilmektedir. Bu tablodan bizim altyordamın 12+24*r7+ 24 = 12+24*255+24 = 6156 periyod süresi olduğu hesaplanmaktadır. Eğitim setimizin kalbi yani mikrodenetleyicinin kristali 1 saniyede 11059200 priyod vermektedir. Buna göre süreyi saniye cinsine çevirmek için 6156/11059200 işlemini yaparsak 0,56msn olduğunu buluruz. Eğer bu süre bizim ihtiyacımıza cevap vermiyorsa döngü içine NOP komutu ekleyerek süreyi uzatabiliriz. Eğer daha uzun gecikmelere ihtiyaç duyulursa o zaman iç içe iki döngü kurularak istenilen süre elde edilir. Bunun için hazırladığımız örnek altyordamı inceleyelim. ; Gecikme 1ms*r7 bekle_ms: mov r6,#250 ;2byte,12periyod bekle_ms1: nop nop djnz r6,bekle_ms1 djnz r7,bekle_ms ret ;1byte,12periyod ;1byte,12periyod ;2byte,24periyod ;2byte,24periyod ;1byte,24periyod Yukarıdaki programda iki döngü kullanılmaktadır. İç döngü 1msn lik bir gecikme sağlamakta, dış döngü ise bunun katları kadar bir gecikme olmasını sağlamaktadır. Eğer altyordam çağrılmadan önce r7 kayıtçısına 5 değeri yüklenmiş ise bu durumda 5*1 = 5milisaniyelik bir gecikme elde edilir. Daha önceki gecikmede öğrendiğimiz gibi hesaplama işlemini yapalım. (12+(12+12+24)*r6+ 24)*r7+24 = (12+48*250+24)*r7 +24= r7=1 için 12060 periyod olduğunu buluruz Bunun yaklaşık 1.09 ms ettğini 12060/11059200 işlemi sonucunda görürüz. Tam 1ms için r6 kayıtçısına hangi sayıyı yüklemeliyiz? 2

UYGULAMA 3 Gecikme ile ilgili öğrendiğimiz bilgileri kullanmak için ilk programımızı biraz değiştirelim. Şimdi DIP anahtardan okuduğumuz sayısal bilgi bizim ms cinsinden gecikme bilgisi olsun. En soldaki LED imizi yakalım ve bunu sürekli sağa kaydıralım. Son LED yakıldığında tekrar baştan başlasın. ;******* 3m LED DIP anahtar kullanılarak Giriş/Çıkış ********* basla org 08000h ;baslangıç adresi, reset vektörü ljmp led_2 org 08100h mov b,#80h ;en soldaki ledin yakılması mov P2,b led_2: mov a,p1 cpl a mov r7,a ;P1'deki,DIP anahtar konumlarını oku ;tersini al ;sayacı yükle acall bekle_ms mov a,b rr a jnz led_21 mov a,#80h led_21 mov P2,a ;yeniden başlat ;bu değeri Port 4'e yaz mov b,a ; sjmp led_2 ;led_1 satırından devam et ;********* Gecikme altyordamı 1ms*r7 *********************** bekle_ms: mov r6,#229 bekle_ms1: nop nop djnz r6,bekle_ms1 djnz r7,bekle_ms ret end 3

UYGULAMA 4 8051 internal data memory 30H adresinde pozitif sayılardan oluşan 25d byte uzunluğunda bir X dizisi bulunmaktadır. Y= Toplam(20 x X + 7) bağıntısı ile tanımlı sonucu hesaplayan ve bellekte 50H adresine kaydeden program. R0,#30H R1,#25 R2,#0 TEKRAR: B,#20 A,@R0 MUL AB ;SIRADAKI ELEMAN 20 ILE CARPILDI CLR C ;CARRY TEMIZLENDI ADD A,#7 ;SIRADAKI ELEMAN 7 ILE TOPLANDI JNC DEVAM1 CLR C INC B JNC DEVAM1 INC R2 DEVAM1: CLR C ADD A,50H 50H,A JNC DEVAM2 CLR C INC 51H JNC DEVAM2 CLR C INC 52H DEVAM2: CLR C A,B ADD A,51H 51H,A JNC DEVAM3 CLR C INC 52H DEVAM3: CLR C A,R2 ADD A,52H 52H,A INC R0 CJNE R0,#49H,TEKRAR END 4

UYGULAMA 5 P1 Portuna bağlı ortak katot 7 segment displayi sürekli 0'dan 9'a kadar saydıran program: 50H,#11111100B ;0 51H,#01100000B ;1 52H,#11011010B ;2 53H,#11110010B ;3 54H,#01100110B ;4 55H,#10110110B ;5 56H,#10111110B ;6 57H,#11100000B ;7 58H,#11111110B ;8 59H,#11100110B ;9 TEKRAR: INC LCALL CJNE JMP BEKLE: TEKRARB: DJNZ DJNZ R0,#4FH R0 P1,@R0 BEKLE R0,#59H,TEKRAR R0,#4FH TEKRAR R2,#0FFH R1,#0FFH R1,TEKRARB R2,TEKRARB 5

UYGULAMA 6 P1 Portuna bağlı bir ortak katot display, P2,0 portuna bağlı bir butona basıldıkça ondalık olarak saydırılacaktır. P2,1 portuna bağlı olan butonla da sıfırlanacaktır. Çözümü: 50H,#11111100B ;0 51H,#01100000B ;1 52H,#11011010B ;2 53H,#11110010B ;3 54H,#01100110B ;4 55H,#10110110B ;5 56H,#10111110B ;6 57H,#11100000B ;7 58H,#11111110B ;8 59H,#11100110B ;9 P1,#11111100B ;0 R0,#50H TEKRAR: A,P2 ANL A,#00000001B CJNE A,#1,RESET? CJNE R0,#59H,DEVAM JMP RESET? DEVAM: INC R0 P1,@R0 LCALL BEKLE JMP TEKRAR RESET?: A,P2 ANL A,#00000010B CJNE A,#2,TEKRAR R0,#50H P1,@R0 LCALL BEKLE JMP TEKRAR BEKLE: TEKRARB: DJNZ DJNZ R2,#0FFH R1,#0FFH R1,TEKRARB R2,TEKRARB 6

UYGULAMA 7 30H adresinde 25D uzunluğundaki bir dizi yer almaktadır. Y= (X^2)-5 bağıntısı ile tanımlı Y dizisini 50H adresinden itibaren oluşturunuz: TEKRAR: INC MUL CLR SUBB JNC DEC DEVAM1: INC INC CJNE END R0,#2FH R1,#50H R0 A,@R0 B,A A,@R0 AB C A,#5 DEVAM1 B @R1,A R1 @R1,B R1 R0,#49H,TEKRAR UYGULAMA 8 P2.0 a basınca tek, P2.1 set olunca da çift sayan program: TEKRAR: JC JC JMP TEK: JMP CIFT: DEVAM: C DPTR,#0700H R5,#0 C,P2.0 TEK C,P2.1 CIFT DEVAM R3,#1 DEVAM R3,#0 A,R5 A,@A+DPTR P1,A 7

LCALL INC INC CJNE DEVAM2: JC SIFIRLA: JMP BEKLE: TEKRARB: DJNZ DJNZ BEKLE R5 R5 R5,#0AH,DEVAM2 TEKRAR A,R3 R5,A TEKRAR R2,#0FFH R1,#0FFH R1,TEKRARB R2,TEKRARB org 700h DB 11111100B ;0 DB 01100000B ;1 DB 11011010B ;2 DB 11110010B ;3 DB 01100110B ;4 DB 10110110B ;5 DB 10111110B ;6 DB 11100000B ;7 DB 11111110B ;8 DB 11100110B ;9 8

UYGULAMA 9 P2 portuna bağlı 8 adet ledi sağa ve sola kaydıran program: SOLA: LCALL CJNE LJMP SOLA2: RL LJMP SAGA: LCALL CJNE LJMP SAGA2: RR LJMP BEKLE: D2: D1: DJNZ DJNZ A,#01H P2,A BEKLE A,#128,SOLA2 SAGA A P2,A SOLA BEKLE A,#1,SAGA2 SOLA A P2,A SAGA R4,#0FFH R5,#0FFH R5,D1 R4,D2 9

UYGULAMA 10 ÜÇ BYTE LIK DEĞİŞKENİN TOPLAMINI HESAPLAYAN PROGRAM ;SORU: 3'er byte lık iki değişkenin toplanarak ;sonucun 4 bytelık bir değişken içine atandığı bir program yazınız ;İlk sayı(ilk_sayi_0/1/2) 06DH-06FH adres aralığına, ;ikinci sayı(ikinci_sayi_0/1/2) 06AH-06CH adres aralığına ;sonuc (SONUC_0/1/2/3) 066H-069H adres aralığına yerleştirilmiştir. ILK_SAYI_0 DATA 6FH ILK_SAYI_1 DATA 6EH ;ilk sayının değer ;değişkenleri ILK_SAYI_2 DATA 6DH IKINCI_SAYI_0 DATA 6CH IKINCI_SAYI_1 DATA 6BH ;ikinci sayının değer ;değişkenleri IKINCI_SAYI_2 DATA 6AH SONUC_0 DATA 69H SONUC_1 DATA 68H ;sonucun değer ;değişkenleri SONUC_2 DATA 67H SONUC_3 DATA 66H ;----------------------------- ;basit toplamada olduğu gibi iki sayının en küçük ;kısımları toplanır A,ILK_SAYI_0 ADD A,IKINCI_SAYI_0 JNC TPL_DVM0 INC SONUC_1 10

TPL_DVM0: SONUC_0,A ;----------------------------- ;en kucuk ikinci kısımlar toplanıyor A,ILK_SAYI_1 ADD A,IKINCI_SAYI_1 JNC TPL_DVM1 INC SONUC_2 TPL_DVM1: ADD A,SONUC_1 JNC TPL_DVM2 INC SONUC_2 TPL_DVM2: SONUC_1,A ;---------------------------- ;büyük kısımlar toplanıyor A,ILK_SAYI_2 ADD A,IKINCI_sAYI_2 JNC TPL_DVM3 INC SONUC_3 TPL_DVM3: ADD A,SONUC_2 JNC TPL_DVM4 INC SONUC_3 SONUC_2,A 11

UYGULAMA 11 N ADET BİR BYTE LIK DEĞİŞKENİN TOPLAMINI HESAPLAYAN PROGRAM ; N adet bir byte lık değişkenin toplamını iki bytelık ;bir değişken içine atayan program ;NOT:BU PROGRAM 101 ADET BİR BYTELIK SAYIYI ;TOPLAYABİLİR N_TOPLA: ;Sayılar 40h adresinden başlasın SAYAC DATA 6FH SONUC_L DATA 6EH SONUC_H DATA 6DH R0,#40H SAYAC,"n" ;--------------- N_TPL_DONGUSU: ADD A,@R0 JNC N_TPL_DVM INC SONUC_H N_TPL_DVM: INC R0 DJNZ SAYAC,N_TPL_DONGUSU ;---------------- SONUC_L,A 12

UYGULAMA 12 İKİ BYTE LIK DEĞİŞKENLER ÜZERİNDE ÇIKARTMA İŞLEMİ PROGRAMI ;31H ve 30H adreslerindeki 2 byte lık sayıdan ;41H ve 40H adreslerindeki sayı çıkarılıp sonuç ;51H ve 50H adreslerinde saklanmaktadır. 16BIT_CIKARMA: A,30H SUBB A,40H 50H,A JNC DEVAM ; çıkarma işleminde elde ödünç alınıyorsa 31H i azalt DEC 31H DEVAM: A,31H SUBB A,41H 51H,A 13

UYGULAMA 13 İKİ BYTE LIK İKİ DEĞİŞKENİN ÇARPIMINI HESAPLAYAN PROGRAM D1_H DATA 078H ;Sayıların yüksek ve düşük bytelarının atanması D1_L DATA 079H D2_H DATA 07AH D2_L DATA 07BH S1 DATA 07CH ;sonuc bytelarının yazılacağıadreslarin atanması S2 DATA 07DH S3 DATA 07EH S4 DATA 07FH ELDE1 DATA 077H ;not:lütfen işlemden önce içeriklerini sıfırlayınız. ;yığından eldelerin çekilebilmesi için kullanılacak olan değişkenler ELDE2 DATA 076H ;Iki_16bitlik_Sayiyinin_Carpimi: ;BIRINCI BASAMAKLARIN ÇARPIMI A,D1_L B,D2_L MUL AB S1,A R1,B ;Sonucun birinci byteını ata ;birinci çarpımın yüksek byteını elde için R1 de sakla ;IKINCI SAYININ BIR,BIRINCI SAYININ IKINCI BASAMAK CARPIMI A,D2_L B,D1_H MUL AB R2,A ;ikinci carpımın düşük byteını elde için R2 ye ata 14

PUSH B ;ikinci çarpımın yüksek byteını elde için yığına gönder ;IKINCI SAYININ IKI BIRINCI SAYININ BIRINCI BASAMAK CARPIMI A,D1_L B,D2_H MUL AB PUSH B ;Carpımın yüksek byteını elde için yığına gönder ;IKINCI BYTE ın ELDELERININ TOPLANMASI ADD A,R1 JNC DVM INC S3 ;yeni elde kontrolü ;elde durumundaki arttırma DVM: ADD A,R2 JNC DVM2 INC S3 ;yeni elde kontrolü ;elde durumundaki arttırma DVM2: S2,A ;toplamda gelen veriyi sonucun ikinci byteına ata ;IKINCI BASAMAKLARIN CARPIMI A,D2_H B,D1_H MUL AB ;UCUNCU BYTE ın ELDELERİNİN TOPLANMASI POP ELDE1 R1,ELDE1 ;ilk eldeyi yığından çek ;ve R1 e ata 15

POP ELDE2 R2,ELDE2 ADD A,R1 JNC DVM3 INC S4 ;ikinci eldeyi yığından çek ;ve R2 ye ata ;Birinci eldeyi ekle ;yeni elde kontrolü ;elde durumundaki arttırma DVM3: ADD A,R2 JNC DVM4 INC S4 ;yeni elde kontrolü ;elde durumundaki arttırma DVM4: ADD A,S3 JNC DVM5 INC S4 ;yeni elde kontrolü ;elde durumundaki arttırma DVM5: S3,A ;sonucun ücüncü byteını ata A,B ;DORDUNCU BYTEın ELDELERİNİN TOPLANMASI ADD A,S4 S4,A ;Sonucun dorduncu byteını ata 16

UYGULAMA 14 BİR BYTE LIK BİR DEĞİŞKENİN İÇERİĞİNİ DİGİTLERE (HANE DEĞERLERİNE) AYIRAN PROGRAM ;SORU:Bir baytlık bir sayı değişkenin yüzler onlar ve birler basamakları olarak ayır BASAMAKLARA_AYIRMA: BIRLER DATA 30h ONLAR DATA 31h YUZLER DATA 32h ;BIRLER basamağının tutulacağı yer ;ONLAR basamağının tutulacağı yer ;YUZLER basamağının tutulacağı yer A,#k B,#100 DIV AB ;Ayıklanıacak sayıyı A ya ata ;B ye 100 ata ;A yı B ye böl ;Not:Bu işlemin özelliğinde sonuç A ya kalan Byte yazılır YUZLER,A A,B B,#10 DIV AB ONLAR,A BIRLER,B ;Sonuc olarak gelen yüzler basamağını yaz ;Geri kalan onlar ve birler basamaklarını A ya yaz ;B ye 10 ata ;A yı B ye böl ;Onlar basamağını yaz ;Birler basamağını yaz 17

UYGULAMA 15 16 ADET BİR BYTE LIK DEĞİŞKENİN ARİTMETİK ORTALAMASINI HESAPLAYAN PROGRAM Bu alt programda 16 sayının ortalamasını alan bir alt program örneği verilmiştir. 30H den 3FH e kadar olan 16 sayının ortalaması alınarak 61H adresinde saklanmaktadır. Ayrıca kalan 60H adresine yazılmaktadır. Öncelikle 16 sayı toplanmakta ve ardından bu toplam 16 ya bölünmektedir. Bilindiği herhangi bir tabandaki sayıyı o tabana bölmek o sayıyı sağa bir basamak kaydırmak demektir. Örneğin onluk tabanda bir sayıyı 10 a bölmek için sayıyı bir sağa kaydırmak ve dolayısıyla varsa virgülü sola kaydırmak demektir. Burada da toplanan sayıyı 16 ya bölme işlemi için toplam sayısı bir nibble sağa kaydırılmaktadır. Oluşan toplam en fazla üç nibble dan oluşabileceğinden üç defa kaydırma işlemi yapılmaktadır ORTALAMA: R0,#30H A,30H CLR C ; ilk adres ;ilk değeri yükle ; sonraki işlemler için eldeyi temizle DONGU: INC R0 ADD A, @R0 JNC DEVAM INC 41H CLR C ; bir sonraki adres ; değerleri topla ; elde oluşuyorsa ; bir üst dijiti bir arttır ; sonraki işlem için eldeyi temizle DEVAM: CJNE R0,#3FH,DONGU ; 15 kez toplama işlemi yap 40H,A BOLME: A,40H ANL A,#0FH ; 40H adresindeki düşük nibble ı kalan olarak ; 60H adresine yaz 60H,A A,40H ANL A,#0F0H SWAP A ; 40H adresindeki yüksek nibble ı 61 adresinin ; düşük nibble ı olarak yaz ; nibble ları yer değiştir 61H,A A,41H SWAP A ; 41H adresindeki düşük nibble ı yükle ; düşük nibble ı yüksek nibble yap 18

ADD A,61H 61H,A ; 61H deki düşük nibble ı yükle ; akümülatördeki yüksek nibble ile topla ve kaydet UYGULAMA 16 N BYTELIK SAYININ İŞA DEĞİŞİMİ İşaretli sayılarla direk işlem yapılamadığı zaman yada işaret değişimi yapmak gerektiğinde bu alt programla kolayca bu işlem gerçekleştirilebilmektedir. Bilindiği gibi işaretli sayıların en yüksek ağırlıklı byte ındaki en yüksek ağırlıklı biti 0 ise sayı pozitif, 1 ise sayı negatiftir. Pozitif bir sayının negatif karşılığı bulunmak için öncelikle sayının bütün bitlerinin eşleniği ( complement ) alınır. Bu işlemin ardından sayıya 1 eklenerek istenen negatif sayı bulunur. Negatif bir sayının pozitif karşılığı da aynı şekilde bulunur. Bu yöntem sayesinde mikroişlemci sistemlerde kolaylıkla işaret dönüşümü yapılabilmektedir. Aşağıda verilen örnekte 20H den 2FH e kadar olan adreslerde tutulan maximum 16 byte uzunluğundaki sayının işaret değişimi yapılmaktadır. Ancak istenirse bu uzunluk daha da arttırılabilir. Bu alt programda önce sayının uzunluğu bulunmakta sonra bu sayının işaret değişimi yapılmaktadır. SAYAC DATA 070H ELDE DATA 071H ; sayının byte sayısı (N değeri). ;işlemde oluşan eldenin tutulacağı alan ISA_DEGISIMI: R0,#020H SAYAC,#10H ;sayının LSB kısmının basladıgı adres ;sayının kac byte oldugu bilgisi A,@R0 CPL A ADD A,#01 JNC ELDE_YOK_0 ELDE,#01 ;R0 ın gösterdiği adresteki ilk byte (LSB) A ya yazılır. ;Complementi alınır. ;Sayıya 1 eklenir. ;Carry yoksa diğer byte gec. ;Carry varsa elde buffer ına yazılır. ELDE_YOK_0: ELDE,#0 @R0,A INC R0 DEC SAYAC ;Carry yoksa elde bufferı temizlenir. ;Diğer byte A ya alınır ;Adres değeri 1 arttırılır. ;Byte sayısı 1 azaltılır. 19

A,SAYAC JZ SON TOP: A,@R0 CPL A ADD A,ELDE JNC ELDE_YOK ELDE,#01 ELDE_YOK: ELDE,#0 @R0,A INC R0 DJNZ SAYAC,TOP ;byte sayısı kontrol için A ya alınır. ;sayı bitmişse(tek byte ise)son a git ;ilk byte tan sonraki byte ler dongu içinde tümleyenleri alınır. ;Diğer byte A ya alınır ;Tümleyeni alınır. ;ELDE buffer ındaki değer eklenir. ;Carry yoksa ELDE_YOK Label ına git. ;Carry varsa ELDE buffer ına 1 yaz. ;Carry olmaması durumunda ;ELDE buffer ı temizlenir. ;Byte yeni haliyle tekrar yazılır. ;adres değeri arttırılır. ;SAYAC 0 değilse TOP a git. SON: UYGULAMA 17 ;Belli bir k boyutlu adres aralığından oluşan bir tablodaki bölümlerde bulunan değerler arasında ; a)en küçük sayıyı bul ; b)tek sayıların adedini bul ; c)çift sayıların adedini bul ; d)en büyük sayıyı bul ;A) EN_KUCUK_DEGER: EN_KUCUK DATA 31h SAYAC DATA 30h ;Sonucun saklanacağı yeri belirle ;Sayac değerinin saklanacağı yeri belirle 20

R0,#TUT R1,#TUT+1 SAYAC,#k ;İlk tutulacak sayının adresine yaz ;İlk karşılaştırılacak sayının adresi ;Sayacın değerini ata CIKAR: A,@R0 ;Bu bölümde R0 da gösterdiğimiz sayıdan R1 de gösterdiğimiz sayıyı ;çıkararak SUBB A,@R1 JNC DEGIS ;elde oluşup oluşmadığına göre daha küçük olan sayı belirlenir ;Elde durumuna göre atlama veya devam etme(elde yoksa atla) DEGISME: INC R1 EN_KUCUK,R0 DJNZ SAYAC,CIKAR ;Bir dahaki sayı için R1 i arttır ;En küçük sayı adresine R0 ı ata ;Bir dahaki sayıyı deneme işlemine geç ;Alt işlemi bitir DEGIS: A,R1 R0,A INC R1 EN_KUCUK,R0 DJNZ SAYAC,CIKAR ;A yardımı ile R1 içeriğini al ;A yı R0 içine yaz ;Bir dahaki sayı için R1 i arttır ;En küçük sayı adresine R0 ı ata ;Bir dahaki sayıyı deneme işlemine geç ;Alt işlemi bitir ;B) TEK_SAYI_ADEDI: ADET DATA 30h SAYAC DATA 31h ;Tek sayı adedinin tutulacağı bölüm ;Sayacın tutulacağı bölüm 21

ADET,00h R0,#BASAdrr ;Adet içeriğini sıfırla ;R0 a ilk adresi ata SORGU: A,#00000001b ANL A,@R0 ;Sorgu işlemi Sayının 000000001b sayısıyla AND ;Kapısı kullanılarak yapılır ve ANL komutunun özelliğinden ;sonuc 1 veya 0 olarak A içeriğine yazılır JNZ TEK INC R0 DJNZ SAYAC,SORGU ;A nın içeriği 0 değil ise TEK etiketine atla ;A nın içeriği 0 ise R0 ı arttır ;Yeni sayıyı sorgulamak için başa dön TEK: INC ADET INC R0 DJNZ SAYAC,SORGU ;Tek sayı ise ;ADET içeriğini arttır ;R0 ı arttır ;Yeni sayıyı sorgulamak için başa dön ;C) Çift sayı adedini bulma ;Bu alt programda 30H den 40H kadar olan adresteki sayılar içinden çift sayı adedi bulunmakta ve ;50H adresinde kaç tane olduğu gösterilmektedir. Elde ile birlikte döndürme komutu kullanılarak son ;bitin 0 veya 1 olmasına göre çift yada tek olmasına bakılır. R0,#30H CIFT: A, @R0 INC R0 RRC A JC DEVAM INC 50H DEVAM: 22

CJNE R0,40H,CIFT ;D) EN_BUYUK_DEGER: EN_BUYUK DATA 31h SAYAC DATA 30h R0,#TUT R1,#TUT+1 SAYAC,#k CIKAR: A,@R0 SUBB A,@R1 JC DEGIS ;Sonucun saklanacağı yeri belirle ;Sayac değerinin saklanacağı yeri belirle ;İlk tutulacak sayının adresini yaz ;İlk karşılaştırılacak sayının adresi ;Sayacın değerini ata ;Bu bölümde R0 da gösterdiğimiz sayıdan R1 de gösterdiğimiz sayıyı çıkararak ;elde oluşup oluşmadığına göre daha büyük olan sayı belirlenir ;Elde durumuna göre atlama veya devam etme(elde varsa atla) DEGISME: INC R1 EN_BUYUK,R0 DJNZ SAYAC,CIKAR ;Bir dahaki sayı için R1 i arttır ;En büyük sayı adresine R0 ı ata ;Bir dahaki sayıyı deneme işlemine geç ;Alt işlemi bitir DEGIS: A,R1 R0,A INC R1 EN_BUYUK,R0 DJNZ SAYAC,CIKAR ;A yardımı ile R1 içeriğini al ;A yı R0 içine yaz ;Bir dahaki sayı için R1 i arttır ;En büyük sayı adresine R0 ı ata ;Bir dahaki sayıyı deneme işlemine geç ;Alt işlemi bitir 23

UYGULAMA 18 Binary BCD dönüşümleri Burada binary sayılardan BCD ( Binary Coded Decimal ) sayılara ve BCD sayılardan binary sayılara dönüşüm işlemi için iki alt program yazılmıştır. BCD sayılarla işlem bildiğimiz 10 tabanında yapılan işlemlerin 16 tabanındaki mikrodenetleyici sistemlerle yapılan işlemler arasında dönüşüm için kullanılır. Binaryden BCD ye dönüşüm yapan alt programda 30H de bulunan sayı dönüşüm işleminden sonra onlar ve birler basamağı 40H de yüzler basamağı ise 41H de saklanmaktadır. BCD den binary e dönüşüm işleminde 30H adresindeki sayı dönüşüm işlemi ardından 40H adresinde saklanmaktadır. BINARY2BCD: A,30H B,#0AH DIV AB 40H,B ; birler basamağını 40h adresine yaz B,#0AH DIV AB ; 41H,A A,B SWAP A ADD A,40H 40H,A ; yüzler basamağını 41H adresine yaz ; onlar basamağını akümülatöre yaz ; onlar basamağı olarak değiştir ; onlar basamağını birler basamağıyla ; topla ve sonucu 40H adresine yaz ; BCD2BINARY: A,30H ANL A,#0F0H SWAP A ;alt nibble ını sil ;nibble ları değiştir 24

B,#0AH MUL AB A,B 32H,A ;A daki sayı geçici olarak 32H yaz A,30H ANL A,#0FH ADD A,32H 40H,A ;üst nibble ını sil ;geçici değerle topla ; sonucu yaz UYGULAMA 19 BINARY VE ASCII DÖNÜŞÜMLERİ Haberleşme sistemlerinde ve değişik uygulamalarda sıklıkla kullanılan binary ve ASCII dönüşümleri için kullanılan iki alt program yazılmıştır. Bilindiği gibi ASCII tablosu 256 karakterden oluşmaktadır. Bunlardan 30H ve 39H arasındaki semboller 0-9 sayılarıdır. Hexadecimal sistemde kullanılan A-F ise 41H ve 46H arasında bulunmaktadır. Ayrıca a-f küçük harfleri de 61H ve 66H arasında bulunmaktadır. Binaryden ASCII ye dönüşüm işleminde önce R0 alınan binary değerin sayı mı harf mi olduğuna bakılmakta ardından buna göre sayı ise o sayıya 30H, harf ise 61H eklenmektedir. Bu kontrol işlemi o akümülatördeki değerden 10 çıkarılmaktadır. Eğer sayı ise çıkarma işleminde çıkarılan sayı çıkan sayıdan büyük olacaktır ve elde bayrağı set edilmeyecektir, çıkarılan sayı çıkan sayıdan küçük ise elde bayrağı set edilerek o değere 41H değeri eklenecektir. Burada A-F arasındaki harf değerlerine 41H eklenerek ASCII tablosundaki büyük harfler kullanılmıştır. Gerektiğinde bu değerlere 61H yerine 41H eklenerek harflerin ASCII tablosundaki küçük harf karşılıkları da bulunabilir. ASCII den binary e dönüşümde ise yukarda anlatılanların tam tersi yapılmaktadır. Ancak burada ek olarak harf ASCII karakterlerin büyük ve küçük olması durumları için ek bir kontrol daha yapılmaktadır. İki alt programda da girilen değer R0 a çıkan sonuç ise akümülatörde saklanmaktadır. BINARY2ASCII: A,R0 CLR C SUBB A,#0AH ;R0 daki değeri akümülatöre yükle ;sonraki işlemler için elde bayrağınıtemizle ;sayı mı harf mi olduğunu bulmak için 10 çıkar JNC SAYI ;elde set edilmemişse sayı işlemine geç 25

ADD A,#41H JMP SON ;elde set edilmişse 41H ekle ;işlemi bitir SAYI: A,R0 ADD A,#30H ;elde set edilmemişse sayı işlemi ;değeri akümülatöre yükle ;sayı için 30H ekle SON: ;bitir ;alt programdan geri dön ASCII2BINARY: A,R0 CLR C SUBB A,#41H JNC SAYI2 ADD A,#0AH JMP SON2 ;R0 daki değeri akümülatöre yükle ;sonraki işlemler için elde bayrağını temizle ;sayı mı büyük harf mi olduğunu bulmak için 41H çıkar ;elde set edilmemişse sayı2 işlemine geç ;büyük harf için çıkan değere 10 ekle ;işlemi bitir A,R0 SUBB A,#61H ADD A,#0AH JNC SAYI2 ;R0 daki değeri akümülatöre yükle ;sayı mı küçük harf mi olduğunu bulmak için 61H çıkar ;küçük harf için çıkan değere 10 ekle ;işlemi bitir SAYI2: A,R0 SUBB A,#30H ;elde set edilmişse sayı işlemi ;R0 daki değeri akümülatöre yükle ;sayı değeri için 30H ekle SON2: ;bitir ;geri dön 26