Sasaran
Setelah anda menamatkan bab ini , diharapkan anda dapat :
ð Memaparkan Instruksi dalam bahasa Assembler 8051 untuk manipulasi bit.
ð Membuat code instruksi 8051 untuk manipulasi bit pada port.
ð Menjelaskan bagian mana dalam 8051 yang bisa dialamati bit.
ð Menjelaskan manipulasi bit atas bendera carry.
ð Memaparkan intruksi yang bit-relation pada bendera carry pada 8051.
Salah satu andalan yang unik dan hebat nan digjaya dari 8051 adalah operasi bit-tunggal. Instruksi bit-tunggal ini memungkinkan kepada kita untuk men-set, clear, move, dan complemet bit secara mandiri baik itu untuk port, memory, atau register. Pada bab ini ini kita akan menggali instruksi-instruksi ini dalam konteks dari beberapa contoh dan aplikasinya. Pada SubBab 8.1 kita belajar instruksi bit-tunggal yang umum. Dana pada SubBab 8.2 kita menggali instruksi bit-tunggal yang "bit-related" dengan carry.
SubBAB 8.1 Pemrograman Instruksi Bit tunggal
Pada kebanyakan mikroporsesor, data diakses dalam bentuk ukuran byte. Dalam hal pengalamatan byte pada Mikroprosesor, isi register, RAM, atau port, semuanya harus diakses sebagai byte. Dengan kata lain, minimum penanganan terhadap data di dalam mikroprosesor harus dilakukan dalam ukuran byte. Hal yang sama, dilakukan oleh Mikrprosesor seperti Pentium, jika kita ingin mengubah sebuah bit, kita terpaksa harus melibat semua bit-bit dalam satu byte yang bersangkutan. Namun adakalanya kita hanya ingin mengakses satu bit saja , misalnya saat kita ingin menghidupkan atau mematikan sebuah lampu. 8051 sanggup melakukannya operasi bit-tunggal itu. Kemampuan pengalamatan bit ini membuat 8051 menjadi mikroprosesor yang sangat pas untuk keperluan tersebut. Kemampuan dalam menanganan bit-tunggal dari 8051 ini, dan menjadikannya sebagai mikrokontroller 8-bit terbaik yang ada di pasaran. Bagian yang mana dari RAM, register, ROM, dll yang bisa dialamat secara bit ini ? Kita tahu bahwa ROM digunakan untuk menyimpan kode operasi yang berformat byte. Setiap opcode diwakili oleh satu byte, dan beberapa diantaranya ditambah dengan beberapa operand dan alamat relatif yang kesemuaya juga dalam bentuk byte. Dengan alasan ini, kemampuan pengalamat bit dalam ROM menjadi tidak berguna, oleh karena itu dalam 8051, ROM tidak dimasukkan di dalamnya, yaitu sebagai bagian yang bisa dialamati bit. Selebihnya beberapa lokasi RAM, beberapa register, dan port I/O dibuat untuk bisa dialamati secara bit. Kesemuanya akan dibahas satu per satu.
Instruksi Bit-Tunggal
Instruksi-instruksi untuk operasi bit-tunggal dapat kita lihat dalam Table 8.1. Dalam SubBab ini kita akan menbahas instruksi tersebut dan memberikan contoh penggunaannya. Intruksi bit-tunggal yang hanya berpengaruh untuk CY akan dibahas di bagian lain.
Tabel 8.1 Instruksi-instruksi Bit Tunggal
Instruksi keterangan
SETB bit Men-set bit (bit=1)
CLR bit men-clear bit (bit=0)
CPL bit complement bit ( bit = NOT bit)
JB bit,target Lompat ke target jika bit = 1 (jumop if bit)
JNB bit,target Lompat ke target jika bit = 1 (jumop if bit)
JNC bit,target Lompat ke target dan clear bit,jika bit = 1 (jumop if bit)
Port I/O dan Kemampuan Pengalamatan-Bit
8051 memiliki 4 port, masing-masing port disebut sebagai P0, P1, P2, dan P3. Kita dapat mengakses port-port ini sebagai 8-bit, maupun sebagai bit tunggal tanpa mempengauhi bit-bit yang lain. Saat kita hendak mengakses satu bit dalam port tersebut kita dalam menggunakan perintah seperti "SETB X.Y", dimana X dapat berupa P0, P1, P2, atau P3. Sedang Y adalah nomor bit yang dibutuhkan yaitu diantara 0 s/d 7 untuk data bit D0 s/d D7. Contohnya, " SETB P1.5", yaitu men-Set bit ke-5 dari Port P1. Ingat D0 adalah LSB dan D7 adalah MSB. Liihat contoh 8-1.
Contoh 8-1
|
Tulis program berikut.
(a) Buat gelombang kotak dengan siklus kerja 50% pada bit-0 dari P1.
(b) Buat gelombang kotak dengan siklus kerja 66% pada bit-3 dari P1.
Jawaban:
(a) siklus kerja 50% berarti lama status "on" dan "off" (atau high atau low) memiliki panjang yang sama.Selanjutnya kita akan men-toggle P1.0 yang ditambahkan Tundaan untuk setiap state-nya.
ULANG: SETB P1.0 ;Set tinggi untuk bit 0 dari port 1
LCALL DELAY ;Panggil Tundaan
CLR P1.0 ;Reset menjadi rendah
LCALL DELAY ;Panggil Tundaan
SJMP ULANG ;Terus kerjakan
Cara lain dalam penulisan program adalah sebagai berikut.
ULANG: CPL P1.0 ;buat Complement dari P1.0
LCALL DELAY ;Panggil Tundaan
SJMP ULANG ;Terus kerjakan
(b) Sedang siklus kerja 66%, berarti status "on" memiliki lama sebanyak 2 kali dari status "off".
ULANG: SETB P1.3 ;Set tinggi untuk bit 3 dari port 1
LCALL DELAY ;Panggil Tundaan
LCALL DELAY ;Panggil Tundaan 2 kali
CLR P1.3 ;Reset menjadi rendah
LCALL DELAY ;Panggil Tundaan
SJMP ULANG ;Terus kerjakan
|
Harap dicatat saat ada instruksi seperti "SETB P1.0" di kompilasi, instruksi tersebut akan otomatis diubah menjadi "SETB 90h" karena P1.0 memiliki alamat bit 90h. Dari gambar 8.1 kita melihat bahwa alamat bit dari P1 adalan 90h s/d 97h, dan seterusnya. Gambar 8.1 juga menunjukkan semua register yang bisa dialamati bit.
Tabel 8-2 Port-port yang bisa dialamati-bit
P0 P1 P2 P3 Bit Port
P0.0 P1.0 P2.0 P3.0 D0
P0.1 P1.1 P2.1 P3.1 D1
P0.2 P1.2 P2.2 P3.2 D2
P0.3 P1.3 P2.3 P3.3 D3
P0.4 P1.4 P2.4 P3.4 D4
P0.5 P1.5 P2.5 P3.5 D5
P0.6 P1.6 P2.6 P3.6 D6
P0.7 P1.7 P2.7 P3.7 D7
Contoh 8-2
|
Untuk setiap instruksi berikut ini,
Gunakan gambar 8-1.
(a) SETB 86h (b) CLR 87h (c) SETB 92h
(d) SETB 0A7h (e) CLR 0F2h (f) SETB 0E7h
Jawaban:
(a) SETB 86h sama dengan SETB P0.6
(b) CLR 87h sama dengan CLR P0.7
(c) SETB 92h sama dengan SETB P1.2
(d) SETB 0A7h sama dengan SETB P2.7
(e) CLR 0F2h sama dengan CLR B.2 yaitu bit-2 dari register B
(f) SETB 0E7h sama dengan SETB ACC.7 yaitu bit-7 dari register ACC
|
Memeriksa Bit Input
Instruksi JNB (jump if bit not set) dan JB (Jump if bit set) digunakan untuk operasi bit-tunggal. Dengan instruksi tersebut kita dapat memonitor bit dan membuat keputusan berdasarkan kemungkinan 0s atau 1s. Lihat Contoh 8-3.
Contoh 8-3
|
Anggaplah bahwa bit P2.3 adalah input dan merupakan representasi kondisi dari oven pemanas. Jika bit tersebut menjadi tinggi, dapat berarti oven dalam keadaan panas. Periksa bit terus menerus. Begitu dia tinggi, kirim pulsa tinggi ke rendah pada port P1.5 untuk menyalakan buzzer.
Jawaban:
ULANG: JNB P2.3,ULANG ;Terus monitor Port
SETB P1.5 ;Set bit P1.5
CLR P1.5 ;Clear P1.5 untuk membuat pulsa H-L
|
Register dan kemampuan Pengalamatan-Bit.
Jika semua port I/O dapat dialamati-bit, ternyata tidak semua register juga bisa dialamati-bit. Seperti yang kita lihat pada gambar 8-1. Kita hanya akan mendapatkan register B, PSW, IP, IE, ACC, SCON, dan TCON yang termasuk memiliki kemampuan bisa dialamati-bit. Dari beberapa register yang bisa dialamati-bit tersebut, kita akan berkonsentrasi pada ACC, B dan PSW. Sedang register yang lain akan kita bahas pada bab yang lain. Dari gambar 8-1 dapat kita lihat bahwa bit-bit port-0 memiliki alamat 80h s/d 87h. Dan alamat 88h s/d 8Fh adalah alamat yang digunakan untuk register TCON. Dan terakhir F0h dan F7h ditempatkan pada register B. Lihat contoh 8-4 dan ontoh 8-5 yang memperlihatkan penggunaan register ini dalam hal pengalamatan secara bit.
Gambar 8-1. Alamat-alamat SFR (byte dan Bit)
Contoh 8-4
|
Tulis program untuk melihat apakah isi akumulator memiliki nilai genap. Jika ya, bagilah dengan 2. Jika tidak, maka buatlah menjadi genap, baru bagi menjadi 2.
Jawaban:
MOV B,#2 ;B=2
JNB ACC.0,YES ;Jika D0 (dari A) = 0 ? Jk ya lompat
INC A ;Ganjil, buatlah menjadi genap
YES: DIV AB ;A/B
|
Contoh 8-5
|
Tulis program untuk melihat apakah bit 0 dan 5 dari register B adalah tinggi (1′s). Jika tidak, buatlah menjadi tinggi dan simpan pada R0.
Jawaban:
JB 0F0h,LANJUT_1 ;lompat jika B.0 = tinggi
SETB 0F0h ;jadikan tinggi
LANJUT_1: JB 0F5h,LANJUT_2 ;lompat jika B.5 = tinggi
SETB 0F5h ;jadikan tinggi
LANJUT_2: MOV R0,B ;Simpan pada R0
|
RS1 RS0 Register Bank Alamat
0 0 0 00h s/d 07h
0 1 1 08h s/d 0Fh
1 0 2 10h s/d 17h
1 1 3 18h s/d 1Fh
|
Gambar 8-2. Bit-bit pada register PSW
Seperti yang kita diskusikan pada Bab 2 bahwa register PSW memiliki dua bit yang digunakan untuk memilih bank bagi register kerja R0 s/d R7. Kita dapat memilih bank dari register kerja tersebut melalui kemampuan PSW untuk dialamati secara bit. Hal tersebut cukup dengan mengakses bit 3 dan 4 dari register PSW atau juga yang disebut RS0 dan RS1.
Contoh 8-6
|
Tulis program untuk menyimpan akumulator ke dalam R7 di bank 2.
Jawaban:
CLR PSW.3
SETB PSW.4
MOV R7,A
|
Contoh 8-7
|
Jika ada instruksi seperti JNC dan JC untuk memeriksa kondisi bit bendera Carry, namun tidak ada perintah seperti itu untuk memeriksa bit bendera Overflow (OV). Bagaimana kita menulis program untuk memeriksa OV ?
Jawaban:
Bendera OV juga disebut PSW.2, yakni nama bit anggota register PSW. PSW adalah register yang bisa dialamati-bit, sehingga kita dapat menggunakan perintah berikut untuk memeriksa OV.
JB PSW.2,target ;lompat jika OV = 1
|
RAM yang bisa Dialamati bit
Dari 128 byte RAM internal dalam 8051 hanya 16-byte yang bisa dialamati secara bit (selain juga secara byte), yakni RAM dengan lokasi 20h s/d 2Fh. Sedang lokasi RAM yang lain, harus diakses secara byte. Ke 16-byte yang bisa dialamati-bit ini dapat menyediakan maksimum 128 bit yang doalokasikan dengan alamat mulai dari 0 s/d 7Fh. Lokasi bit tersebut berurutan mulai dari bit terkecil mulai RAM-byte lokasi 20h. Bit ke 8 s/d 15 di RAM-byte lokasi 21h. Dan seterusnya sampai bit terakhir, yakni bit 128 (7Fh) pada RAM-byte lokasi 2Fh. Perhatikan gambar 8-3 dan 8-1 untuk memperjeas kedudukan bit di dalam RAM-byte.
Gambat 8-3 RAM Internal 128 byte
Contoh 8-8
|
Carilah byte yang mana yang ditempati oleh masing-masing bit berikut ini. Berikan alamat dari RAM dalam bilangan hex.
(a) SETB 42h (d) SETB 28h
(b) CLR 67h (e) CLR 12
(c) CLR 0Fh (f) SETB 05
Jawaban:
(a) lokasi bit RAM 42h adalah di D2 dari RAM lokasi 28h
(b) lokasi bit RAM 67h adalah di D7 dari RAM lokasi 2Ch
(c) lokasi bit RAM 0Fh adalah di D7 dari RAM lokasi 21h
(d) lokasi bit RAM 28h adalah di D0 dari RAM lokasi 25h
(e) lokasi bit RAM 12 adalah di D4 dari RAM lokasi 21h
(f) lokasi bit RAM 05 adalah di D5 dari RAM lokasi 20h
|
Salah satu kegunaan RAM yang bisa dialamati bit adalah untuk menyimpan status sebuah bit. Misalnya digunakan sebagai menunjuk status sebuah lampu yang cukup diwakili dengan hanya satu bit. Lihat contoh 8-9.
Contoh 8-9
|
Status dari bit P1.2 dan P1.3 dari I/O port P1 harus disimpan sebelum mereka berubah. Tulis program untuk menyimpan status dari port-port tersebut pada bit lokasi 06 untuk P1.2 dan bit lokasi 07 untuk P1.3.
Jawaban:
CLR 06 ;Clear bit lokasi 06
CLR 07 ;Clear bit lokasi 07
JNB P1.2,LANJUT ;periksa bit P1.2, lompat jika 0
SETB 06 ;Set bit lokasi 06
LANJUT: JNB P1.3,SELESAI ;periksa bit P1.3, lompat jika 0
SETB 07 ;Set bit lokasi 07
SELESAI: …
|
SubBAB 8-2: Operasi bit dengan CY
Di samping yang kita tahu bahwa CY (Carry Flag) adalah bit yang paling berpengaruh pada operasi aritmatika dan logika, 8051 memiliki beberapa instruksi yang dimana CY dapat dimanipulasi secara langsung. Instruksi ini ditampilkan pada Tabel 8-3.
Dari instruksi-instruksi pada tabel 8-3, kita ditunjukkan penggunaan JNC , JC, CLR dan SETB di dalam beberapa contoh pada beberapa bab sebelumnya. Selebihnya dari SubBAB ini adalah menunjukkan bagaimana menggunakan beberapa instruksi lainnya seperti dalam table 8-3.
Beberapa instruksi dari Tabel 8-3 terkait dengan operasi logika AND dan OR, contoh penerapannya dapat anda lihat pada contoh berikutnya ini.
Pada BAB yang mendatang kita dapat melihat menggunaan instruksi-instruksi seperti pada table 8-3 lebih instensif di dalam program aplikasi sebenarnya (real-word application).
Tabel 8-3 Instruksi yang Bit-Related dengan Carry
Instruksi Gunanya
SETB C membuat CY = 1
CLR C membuat CY = 0
CPL C Complemnet CY <== not CY
MOV bit,C salin CY ke dalam bit
MOC C,bit salin bit ke dalam CY
JNC target lompat jika CY = 0
JC target lompat jika CY = 1
ANL C,bit CY –AND- bit , dan simpan hasil pada CY
ANL C,/bit CY –AND- (kebalikan bit) , dan simpan hasil pada CY
ORL C,bit CY –OR- bit , dan simpan hasil pada CY
ORL C,/bit CY –OR- (kebalikan bit) , dan simpan hasil pada CY
Contoh 8-10
|
Tulis progam untuk menyimpan status dari bit P1.2 dan P1.3 ke dalam RAM, masing-masing dengan lokasi bit 6 dan 7.
Jawaban:
MOV C,P1.2 ;simpan status dari P1.2 pada CY
MOV 06,C ;simpan ke dalam memory ( bit 06 = 20h.6)
MOV C,P1.3 ;simpan status dari P1.3 pada CY
MOV 07,C ;simpan ke dalam memory ( bit 07 = 20h.7)
|
Contoh 8-11
|
Anggaplah RAM bit dengan lokasi 12h menyimpan status keadaan adanya panggilan telepon atau tidak. Jika tinggi, berarti ada panggilan baru. Tulis prtogram untuk menulis LCD "New Messages" jika RAM bit 12h tersebut tinggi. Namun jika rendah maka LCD tetap bertuliskan "No New Messages".
Jawaban:
MOV C,12h ;salin bit 12h pada C
JNC NO ;periksa CY, apakah tinggi
MOV DPTR,#400h ;Jika ya, isikan dengan alamat tulisan
LCALL DISPLAY ;Tulis pada LCD
SJMP KELUAR ;program selesai
NO: MOV DPTR,#420h ;Jika ya, isikan dengan alamat tulisan
LCALL DISPLAY ;Tulis pada LCD
KELUAR: …
;—————-data yang dikirim pd LCD
ORG 400h
TES_MG: DB "New Messages"
ORG 420h
NO_MG: DB "No New Messages"
|
Contoh 8-12
|
Anggaplah bahwa bit P2.2 digunakan untuk mengkontrol lampu halaman dan bit P2.5 untuk mengontrol lampu dalam ruangan. Tunjukkan bagaimana untuk menyalakan lampu halaman dan mematikan lampu ruangan.
Jawaban:
SETB C ;CY=1
ORL C,P2.2 ;CY <== P2.2 di-OR dengan CY
MOV P2.2,C ;nyalakan "on" jika belum "on"
CLR C ;CY=0
ANL C,P2.5 ;CY <== P2.5 di-AND dengan CY
MOV P2.5,C ;matikan "off" jika belum "off"
|
SubBAB 8.3: Membaca Pin Input atau Port Latch.
Saat membaca port, beberapa instruksi adalah membaca status dari pin milik port. Instruksi yang lain adalah membaca status dari gerendel(latch) milik port. Sehingga kita mendapatkan dua kemungkinan untuk membaca sebuah port:
1. Membaca status dari pin
2. Mambaca status dari Latch
Tentu saja kita tidak boleh dibingungkan dengan dua kategori tersebut. Namun kesalahan dalam menetukkan instruksi yang tepat akan membuat program tidak seperti yang kita harapkan. Lalu mana yang hendak kita gunakan?. Kita menggunakan instruksi membaca pin milik port misalnya dengan instruksi "MOV A,P1", "JNB P1.2,label", atau "MOV C,P3.0", adalah saat kita membaca status dari peralatan lain misalnya saklar, comparator dll yang terhubung pada port tersebut. Pada saat membaca pin tersebut latch port harus dibuat tinggi, agar port bertindak sebagai port input, yakni cukup dengan "MOV P1,#0FFh" atau "SetB P1.1". Dengan demikian status yang diberikan terhadap port dapat langsung dibaca. Namun saat kita handak memaca status latch dari port tersebut tanpa meperdulikan status dari pin yang terhubung dengan peralatan lain, kita dapat menggunakan perintah seperti "XRL P1,#0Fh", "INC P2", "DJNZ P3,Label". Nilai port bukan seperti status yang diberikan terhadap pin milik port tersebut, melainkan status latch internal. Adapun fungsi darilatch ini adalah untuk keperluan port dalam tugasnya sebagai port output.
Instruksi-instruksi untuk membaca Input Port
Dalam BAB 4, untuk dapat membuat port dalam 8051 dapat bekerja sebagai port input, kita harus menulis port tersebut sebagai 1′s (high). Sebenarnya yang kita tulis terhadap port tersebut adalah menulis latch. Setelah membuat latch tersebut menjadi tinggi, data diluar CPU yang dihubungkan pada pin kemudian dapat dibaca. Berikut ini adalah tabel untuk instruksi-instruksi pembacaan status pin.
Tabel 8-4 Instruksi-instruksi untuk membaca Input Port
Mnumonic Contoh Keterangan
MOV A,Px MOV A,P2 Mengambil data dan disimpan pada A
JNB Px.y,Label JNB P2.1,Target Lompat jika pin P2.1 = rendah
JB Px.y,Label JB P2.1,Target Lompat jika pin P2.1 = tinggi
MOV C,Px.y MOV C,P3.0 Ambil data bit dan simpan pd C
Membaca Latch untuk Port Output
Beberapa instruksi dapat digunakan untuk membaca isi dari latch internal milik port disamping instruksi untuk membaca status dari pin eksternal. Tabel 8-5 memberikan daftar dari instruksi tersebut. Misalnya contoh, lihat pada instruksi "ANL P1,A". Urutan kejadian dari instruksi tersebut saat dieksekusi adalah sebagai berikut.
1. Membaca latch internal dari port dan mambawa data nya pada CPU.
2. Data tersebut di-AND dengan isi register A.
3. Hasil dari AND tersebut kemudian dikembalikan pada latch.
4. Pin dari port kemudian mungkin berubah menurut perubahan status dari latch port yang bersangkutan.
Dari pemaparan di atas kesimpulannya adalah instruksi untuk membaca lacth, adalah kira-kira sebagai berikut, yaitu adalah membaca status latchnya, melakukan operasi tertentu, dan kemudian menuliskan hasil operasi, kembali pada latch port. Hal ini kemudian disebut sebagai "Read-Modify-Write". Tabel 8-5 menunjukkan kepada kita daftar instruksi read-modify-write yang menggunakan port sebagai tujuan destination.
5. semua instruksi read-modify-write tersebut harus menggunakan port sebagai operand. Dengan kata lain instruksi tersebut hanya bekerja untuk port, dan digunakan sebagai port output.
Tabel 8-5 Instruksi-instruksi untuk membaca Latch
Mnumonic Contoh
ANL Px ANL P0
ORL Px ORL P3
XRL Px XRL P1
JBC Px.y,target JBC P1.1,target
CPL Px.y CPL P3.1
INC Px INC P2
DEC Px DEC P1
DJNZ Px,target DJNZ P3,target
MOV Px.y,C MOV P1.0,C
CLR Px.y CLR P1.2
SETB Px.y SETB P2.1
RINGKASAN
Bab ini menjelaskan operasi bit-tunggal pada 8051, yang merupakan salah satu andalan paling hebat dari 8051. Instruksi bit-tunggal memberikan programer kemudahan untuk men-set, clear, move, dan complement bit secara individual terhadap bit-bit port, memory, dan register.
Selebihnya, ada beberapa instruksi dimana bendera Carry dapat dimanipulasi secara langsung. Kita juga mendiskusikan instruksi untuk membaca status pin pada port, dan juga membaca status latch pada port.
0 komentar:
Post a Comment