Ayo kita lanjutkan lagi...!
Jika artikel sebelumnya kita
membahas mengenai ”Pencacah Naik 5 Digit”, maka artikel kali ini, sebagai
kelanjutannya, akan kita lihat rangkaian penampil berupa LED 7 segmen. Rangkaian
yang akan dibahas adalah perangkat yang pernah dibuat tanpa modifikasi. Jadi
sudah pasti teruji dan dapat berfungsi seperti ditunjukkan pada gambardibawah
ini:
Pada gambar di atas perangkat yang
dibuat terdiri dari 2 baris penampil 5 digit. Penulis membuatnya menjadi 2
modul penampil yang dapat dialamati agar pembuatannya lebih sederhana dan
mudah. Masing-masing dioperasikan dengan masukan secara serial. rangkaian dapat
dilihat seperti gambar berikut:
Berkaitan dengan rangkaian
pencacah yang menggunakan data serial maka rangkaian penampil juga mengolah masukan
data dalam bentuk serial. Sebagai otak rangkaian digunakan mikrokontroler
AT89C2051 dengan konfigurasi gerbang P30 sebagai masukan serial, P32 sebagai
alamat, P33 sampai P35 dan P37 serta P17 sebagai scanner untuk digit, P10
sampai P16 adalah data segmen yang akan ditampilkan.
Penulis menggunakan jenis penampil
LED 7 segmen yang memiliki tegangan
kerja sebesar 6 volt, untuk itu keluaran gerbang tidak dapat secara langsung
menggerakkannya sehingga dibutuhkan sebuah kemudi transistor Darlington
menggunakan ULN2003 yang juga digunakan sebagai kemudi pada bagian scanner-nya
sebelum transistor C9012.
Nah, sepertinya kita tidak perlu
membahas terlalu panjang lebar rangkaian di atas. Kita langsung saja pada
program yang harus dijalankan oleh AT89C2051 seperti di bawah ini:
$mod51
; Aplikasi 5 digit LED 7 segmen
BitUnitID bit p3.2
ScanDigit1 bit p3.5
ScanDigit2 bit p3.4
ScanDigit3 bit p3.3
ScanDigit4 bit p3.7
ScanDigit5 bit p1.7
PortDigit data p1
RegUnitID data 08h
BuffSerial data 09h
BuffDisplay data 10h
RegBit data 20h
BitSerial bit RegBit.0
RegStack data 30h
Seperti diperlihatkan pada baris di atas,
tidak banyak konfigurasi yang diperlukan. Kita cukup menentukan gerbang yang
akan digunakan sebagai penampil dan alamat. Kemudian menetapkan register alamat
(RegUnitID), buffer untuk data serial (BuffSerial) dan peraga atau display
(BuffDisplay). Kita juga memerlukan sebuah register bit untuk membantu proses
aplikasi komunikasi serial meski yang diperlukan Cuma 1 bit saja (BitSerial).
Dan terakhir adalah memperbaharui lokasi Stack Pointer pada alokasi alamat dari
30H.
Langkah berikutnya adalah menjalankan
program inisialisasi untuk proses serial. Di sini kecepatan data ditetapkan
1200 bps menggunakan register TH1 yaitu E8H
org 0000h
mov sp,
RegStack-1
mov p1,
#0
mov p3,
#01000111b
clr BitSerial
mov pcon,
#0
mov tmod,
#20h
mov scon,
#50h
mov ie,
#90h
mov tl1,
#0e8h
mov th1,
#0e8h
setb tr1
ajmp Inisialisasi
Subrutin berikut yang dimulai pada 0023H
adalah merupakan interupsi serial masuk (RxD) yang terdeteksi oleh logika
tinggi dari bit RI (received interrupt). Informasi byte data masuk yang
disimpan pada register SBUF selanjutnya akan diolah melalui subrutin berikut.
Setiap kali subrutin dipanggil maka setelah
memindahkan isi register SBUF ke Akumulator, proses selanjutnya adalah
memeriksa status BitSerial. Jika BitSerial tinggi mengindikasikan bahwa
informasi SBUF adalah data yang akan diproses, sementara jika rendah isi SBUF
merupakan alamat dan akan dibandingkan dengan nilai pada RegUnitID.
org 0023h
push acc
jnb ri,
$
clr ri
mov a,
sbuf
jb BitSerial,
SerialData
xrl a,
RegUnitID
jz SerialStart
ajmp SerialSelesai
Pada subrutin SerialStart, nilai BitSerial
akan diset tinggi dan register R0 diisi dengan alokasi alamat BuffSerial.
SerialStart:
setb BitSerial
mov r0,
#BuffSerial
ajmp SerialSelesai
Pada subrutin SerialData, isi akumulator
akan disimpan pada lokasi buffer BuffSerial yang sesuai yang ditunjuk oleh
register R0. Byte data yag disimpan sebanyak 5 byte, jika jumlah tersebut
tercapai maka data yang disimpan akan diproses untuk kemudian dipindahkan ke
BuffDisplay.
SerialData:
mov @r0,
a
inc r0
cjne r0,
#BuffSerial+5, SerialSelesai
mov r0,
#BuffSerial
mov r1,
#BuffDisplay
mov r2,
#5
Informasi data serial yang masuk terdiri
dari 5 byte berupa karakter angka dan/atau spasi. Karakter spasi pada BuffSerial
akan dikonversi menjadi kosong pada BuffDisplay. Sementara karakter angka 0 – 9
atau 30H – 39H dengan nible MSB yang dikosongkan untuk kemudian akan dicocokkan
dengan data 7 segmen sesuai yang terdapat pada lokasi “LEDSegmen” menggunakan
perintah MOVC A, @A+DPTR.
SerialDisplay:
mov a, @r0
cjne a, #20h, DisplayAngka
ProsesKosong:
mov a, #0
ajmp ProsesDisplay
DisplayAngka:
anl a, #0f0h
cjne a, #30h, ProsesKosong
mov a, @r0
anl a, #0fh
mov dptr, #LEDSegmen
movc a, @a+dptr
ProsesDisplay:
mov @r1, a
inc r0
inc r1
djnz r2, SerialDisplay
clr BitSerial
SerialSelesai:
pop acc
reti
Catatan:
Format data serial yang masuk semisal
adalah “B12345” di mana semua informasi angka akan ditampilkan. Contoh lain
semisal “B 14” maka akan menampilkan
14.
Berikut adalah data tampilan pada LEDSegmen
yang bersesuaian dengan LED 7 Segmen. 6 byte kosong terakhir adalah untuk
menganulir kesalahan data di atas 0AH – 0FH. Byte di bawah merupakan data dari
segmen dengan format XGFEDCBA dengan bit ke-7 selalu dinolkan karena pada
gerbang digunakan untuk proses scan digit.
LEDSegmen:
db 00111111b, 00000110b, 01011011b,
01001111b, 01100110b
db 01101101b, 01111101b, 00000111b,
01111111b, 01101111b
db 0, 0, 0, 0, 0, 0
Program inisialiasi berikut adalah untuk
menentukan kode alamat dari unit peraga apakah “A” atau “B” sesuai dengan
status gerbang P32 atau BitUnitID, jika P32 rendah maka
ID unit adalah “B” sementara jika tinggi “A”. Alamat akan disimpan pada
register RegUnitID. Inisialisasi juga akan mengosongkan tampilan dan hanya
menampilkan angka “0” tunggal.
Inisialisasi:
jnb BitUnitID,
Unit_A
mov RegUnitID,
#'B'
ajmp IniDisplay
Unit_A:
mov RegUnitID,
#'A'
IniDisplay:
mov r3,
#4
mov r1,
#BuffDisplay
Bersihkan:
mov @r1,
#0
inc r1
djnz r3,
Bersihkan
mov BuffDisplay+4,
#00111111b
Nah, berikut ini adalah program untuk
menampilkan data dari BuffDisplay ke LED 7 segmen. Scan akan dimulai dari digit
MSB atau ScanDigit5 untuk data BuffDisplay. Pada digit ke-2 di mana pin DOT
dari LED 7 segmen digunakan sehingga jika nilai BuffDisplay+1 adalah kosong
maka ScanDigit2 akan tetap bernilai rendah akibatnya penampil 7 segmen akan
padam.
AppDisplay:
clr ScanDigit5
mov PortDigit,
BuffDisplay
setb ScanDigit1
acall Kedipan
clr ScanDigit1
mov a,
BuffDisplay+1
jz Display1
mov PortDigit,
a
setb ScanDigit2
Display1:
acall Kedipan
clr ScanDigit2
mov PortDigit,
BuffDisplay+2
setb ScanDigit3
acall Kedipan
clr ScanDigit3
mov PortDigit,
BuffDisplay+3
setb ScanDigit4
acall Kedipan
clr ScanDigit4
mov PortDigit,
BuffDisplay+4
setb ScanDigit5
acall Kedipan
ajmp AppDisplay
Proses scan tentu akan mengakibatkan
kedipan karena masing-masing penampil 7 segmen menyala bergantian. Agar kedipan
tidak terlalu nampak maka frekuensi putarannya harus cukup tinggi. Register R6
dan R7 akan menghasilkan tundaan sebesar kurang lebih 2 ms sehingga waktu
putaran totalnya sekitar 10 ms atau setara dengan 100 Hz.
Kedipan:
mov r6,
#4
Kedip:
mov r7,
#255
djnz r7,
$
djnz r6,
Kedip
ret
end
Seperti
itulah rangkaian penampil 5 digit dengan LED 7 segmen yang sudah penulis buat.
Kiranya mudah dan dapat diaplikasikan dengan pencacah naik sebelumnya atau
dapat digunakan untuk implementasi lainnya sesuai kebutuhan Sobat.
Sudah
ya, terima kasih sudah membaca artikel aku. Semoga bermanfaat dan bisa diterapkan oleh sobat semua.
Salam....
Tidak ada komentar:
Posting Komentar