Senin, 27 Juni 2011

PROGRAM MENGAKSES SEVEN SEGMENT MENGGUNAKAN CODEVISION AVR

Sebelumnya teman-teman harus mengerti terlebih dahulu tentang dasar-dasar dari seven segment. Sebenarnya seven segment tersusun dari 8 buah led yang dibentuk menyerupai angka 8 yang terdiri dari 7 segmen dan ditambah 1 segmen berupa titik (dot). Untuk mendapatkan datasheet penampil seven segment silakan download disini.

Seven segment terdiri dari 2 jenis konfigurasi yaitu katoda bersama atau common cathoda (CC) dan anoda bersama atau common anoda (CA) .

Dari gambar diatas teman-teman tentu  sudah dapat langsung bisa membedakannya. Jika common cathoda, dimana sisi katoda pada LED tiap segmennya digabungkan (common) sehingga sering disebut katoda bersama. Sedangkan jika common anoda, pada sisi anoda pada LED tiap segmennya digabungkan sehingga sering disebut katoda bersama.

Antara CC (common cathoda) dan  CA (common anoda) mempunyai perbedaan yang mendasar yaitu cara untuk mengaktifkan/menyalakan tiap segmennya.

Untuk CC agar segmennya dapat menyala harus diberi logika HIGH (misalnya 5V), sedangkan untuk CA agar segmennya dapat menyala harus diberi logila LOW (GND).
Berikut adalah cara untuk menampilkan angka pada CA dan CC, disini saya akan menampilkan angka 7 (tujuh).
 
Dari gambar diatas terlihat jelas bahwa untuk menampilkan  angka 7 pada CA harus menyalakan segment a (bit0), b (bit1) dan c (bit2) dengan memberikan logika LOW (GND).

Sedangkan untuk CC merupakan kebalikan dari CA, dimana untuk menampilkan angka 7 harus menyalakan segment a (bit0), b (bit1) dan c (bit2) dengan memberikan logika HIGH (5V atau VCC).

Dari penjelasan diatas dapat dibuat tabel untuk menampilkan angka dari 0-9.
 
TABEL 1
Sekarang teman-teman sudah tahu bagaimana cara membentuk tampilan angka pada seven segment. Selain dari itu seven segment dapat pula dibentuk karakter selain angka, teman-teman hanya tinggal menyesuaikannya sesuai keinginan dengan menyalakan segment yang diinginkan.

Sekarang saya akan menjelaskan bagaimana cara kerja seven segment jika di-interface-kan dengan mikrokontroler. Dimisalkan saya ingin menampilkan angka 2163 pada seven segment, maka saya akan membutuhkan 4 buah seven segment (digit1=2, digit2=1, digit3=6 dan digit4=3). Dan pada prinsipnya cara kerja seven segment dilakukan secara scanning yaitu “jika ingin menampilkan 2163, maka saya akan menampilkan angka 2 terlebih dahulu pada seven segment digit1 (digit ke1) dengan mematikan digit2, digit3 dan digit4. Kemudian saya akan menampilkan angka 1 pada seven segment digit2 dengan mematikan digit1, digit3 dan digit4 dan seterusnya sampai menampilkan angka 3 pada digit4″. Metode inilah yang dinamakan scanning, dengan melakukan scanning secara cepat (biasanya 25x dalam 1 detik), maka mata kita tidak akan bisa mengikuti scanning seven segment tersebut sehingga seolah-olah mata kita akan melihat bahwa semua seven segmen (digit1-digit4) menyala secara bersamaan.

Pertanyaaannya, mengapa kita menggunakan metode scanning? Jawabannya dikarenakan metode scanning dapat mengurangi konsumsi daya listrik dibandingkan dengan menyalakan semua seven segment. Dan yang paling penting yaitu dapat menghemat pemakaian pin-pin mikrokontroler, sehingga tidak banyak input/output yang terpakai untuk mengakses seven segment.

Baiklah berikut adalah aplikasi menampilkan angka 2163 menggunakan mikrokontroler dengan seven segment tipe common anoda (CA). Saya sarankan untuk menggunakan seven segment tipe CA karena nantinya mikrokontroler bersifat sebagai sinking. Untuk lebih jelasnya baca pada postingan Sinking Vs Sourching output.

Berikut adalah schematic dan listing program lengkapnya:

#include <mega16.h>
#include <delay.h>

char digit1, digit2, digit3, digit4;

void main(void)
{
PORTC=0xff;
DDRC=0xff;
PORTD=0x0f;
DDRD=0x0f;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

digit1=0xa4;//hexa untuk angka 2
digit2=0xf9;//hexa untuk angka 1
digit3=0×82;//hexa untuk angka 6
digit4=0xb0;//hexa untuk angka 3

while (1)
      {
      PORTC=digit1;//mengirimkan data untuk angka 2
      PORTD=0b11110111;//menyalakan digit1
      delay_ms(5);

      PORTC=digit2;//mengirimkan data untuk angka 1
      PORTD=0b11111011;//menyalakan digit2
      delay_ms(5);

      PORTC=digit3;//mengirimkan data untuk angka 6
      PORTD=0b11111101;//menyalakan digit3
      delay_ms(5); 

      PORTC=digit4;//mengirimkan data untuk angka 3
      PORTD=0b11111110;//menyalakan digit4
      delay_ms(5);
      //lamanya waktu scanning ditentukan oleh intruksi delay
      };
}

Mudah bukan untuk mengakses seven segment? Tapi jangan senang dulu, disini saya akan menjelaskan tentang kesulitan yang akan dihadapi jika menggunakan penampil seven segment. Pada program diatas kita membuat aplikasi untuk menampilkan angka 2163 pada keempat buah seven segment dengan mengirimkan datanya secara langsung ke setiap seven segment. Pertanyaannya, bagaimana jika kita ingin menampilkan isi dari sebuah variabel ke dalam seven segment? Misalnya saya punya sebuah variabel dengan nama data yang bernilai 2163. Jika dalam program menjadi seperti ini.

int data;//mendeklarasikan tipe data
data=2163;//variabel nilai berisi 2163

Cukup sulit bukan jika ditampilkan kedalam seven segment, jika kita menggunakan LCD 2×16 maka akan sangat mudah sekali menampilkannya. Tetapi tenang saja, disini saya akan menjelaskan cara mengatasi permasalahan diatas dengan menggunakan beberapa tambahan algoritma pemrograman.

Sekarang saya akan memberikan sebuah solusi dari permasalahan diatas untuk menampilkan isi dari sebuah variabel ke dalam seven segment. Rangkaiannya masih sama seperti gambar diatas.

Caranya adalah:
Dengan melakukan pembagian dengan angka 10 sebanyak 4 kali, dimana sisa dari pembagian tersebut akan ditampilkan berupa satuan, puluhan, ratusan dan ribuan.

data=2163;
data dibagi 10, hasilnya adalah 216 dan menghasilkan sisa pembagian yaitu 3, angka 3 tersebut kemudian disimpan kedalam variabel satuan.

sekarang data=216 (karena sudah bagi 10 sebelumnya), dengan cara yang sama.
data dibagi 10 lagi, hasilnya adalah 21 dan menghasilkan sisa pembagian yaitu 6, angka 6 tersebut kemudian disimpan kedalam variabel puluhan.

sekarang data=21
data dibagi 10 lagi, hasilnya adalah 2 dan menghasilkan sisa pembagian yaitu 1, angka 1 tersebut kemudian disimpan kedalam variabel ratusan.

sekarang data=2
data dibagi 10 lagi, hasilnya adalah 0 dan menghasilkan sisa pembagian yaitu 2, angka 2 tersebut kemudian disimpan kedalam variabel ribuan.

Untuk dapat mengimplementasikannya keprogram dibutuhkan sebuah intruksi % (dalam bahasa C adalah operator untuk operasi sisa pembagian). Berikut adalah listing program lengkapnya untuk mengatasi masalah diatas.

#include <mega16.h>
#include <delay.h>

int data, data_temp;
char ribuan, ratusan, puluhan, satuan, ubah;

void tampil_7segment()
{
      PORTC=ribuan;//mengirimkan data ribuan
      PORTD=0b11110111;//menyalakan digit1
      delay_ms(5);

      PORTC=ratusan;//mengirimkan data ratusan
      PORTD=0b11111011;//menyalakan digit2
      delay_ms(5);

      PORTC=puluhan;//mengirimkan data puluhan
      PORTD=0b11111101;//menyalakan digit3
      delay_ms(5); 

      PORTC=satuan;//mengirimkan data satuan
      PORTD=0b11111110;//menyalakan digit4
      delay_ms(5);
      //lamanya waktu scanning ditentukan oleh intruksi delay
}

void ubah_ke_format7segment()//fungsi untuk mengubah kedalam format 7segment
{
      if (ubah==0){ubah=0xc0;}
      if (ubah==1){ubah=0xf9;}
      if (ubah==2){ubah=0xa4;}
      if (ubah==3){ubah=0xb0;}
      if (ubah==4){ubah=0×99;}
      if (ubah==5){ubah=0×92;}
      if (ubah==6){ubah=0×82;}
      if (ubah==7){ubah=0xf8;}
      if (ubah==8){ubah=0×80;}
      if (ubah==9){ubah=0×90;}
}

void main(void)
{
PORTC=0xff;
DDRC=0xff;
PORTD=0x0f;
DDRD=0x0f;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

data=2163;

while (1)
      {
      data_temp=data;
      satuan=data_temp%10;//sisa dari pembagian disimpan di variabel satuan
      ubah=satuan;
      ubah_ke_format7segment();//panggil fungsi mengubah kedalam format 7segment
      satuan=ubah;

      data_temp=data_temp/10;
      puluhan=data_temp%10;
      ubah=puluhan;
      ubah_ke_format7segment();
      puluhan=ubah;

      data_temp=data_temp/10;
      ratusan=data_temp%10;
      ubah=ratusan;
      ubah_ke_format7segment();
      ratusan=ubah;

      data_temp=data_temp/10;
      ribuan=data_temp%10;
      ubah=ribuan;
      ubah_ke_format7segment();
      ribuan=ubah;

      tampil_7segment();//fungsi untuk menampilkan ke 7segment
      };
}

8 komentar:

  1. boleh belajar seven segmen dsini g?

    BalasHapus
  2. makasih..... mantap..ditunggu posting berikutnya...

    BalasHapus
  3. mau tanya mas,
    bagaimana caranya nampilin di seven segment jika datanya berupa data float. Misal datanya 10.35. Kita gunakan 4 digit seven segment. Terima kasih

    BalasHapus
  4. bang q coba malah ada sebagian segmen(sell)yg g nyala,trus q pake clear ru bisa nyala sesuai dg angka yg d tampilkan...

    BalasHapus
  5. thank You infonya gan.. tambah referensi nih.. hehehe

    di tunggu posting barunya Sip!

    BalasHapus