Translate

Penampil 5 Digit 7 Segment Dengan Masukan Serial Pada MCS51



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