Senin, 07 Januari 2013

Menampilkan data dengan 7 segment


Bingung nch mau ngapain minggu-minggu menunggu seminar skripsi akhirnya teringat ada temen kampus yang tanya tentang 7 segment mulai dech membongkar file-file di komputer tentang 7 segment yang udah sy buat dulu. ok sebelumnya kita harus tahu dulu apa itu seven segment. Ringkasnya 7 segment merupakan komponen yang berfungsi sebagai penampil karakter angka dan karakter huruf. 7 segment tersusun atas led-led. lihat gambar dibawah ini untuk lebih jelasnya.


Dari gambar diatas ada 2 jenis 7 segment yaitu common cathode dan common anode. perbedaanya cuma cara  menghidupkan 7 segment tersebut. Untuk common cathode pin kaki a b c d e f g harus diberi tegangan vcc dan pin gnd di hubungkan ke ground agar 7 segment menyala. Sedangkan untuk common anode pin a b c d e f g harus dihubungkan ke ground dan pin vcc di hubungkan ke vcc agar 7 segment menyala (lihat gambar diatas).


1. Project 1 (Menampilkan angka 0 - 9) 

Pada project 1 ini kita mengendalikan 7 segment ini menggunakan mikrokontroller. Buat rangkaian berikut ini bisa langsung menggunakan real mikrokontroller atau menggunakan proteus sebagai simulasi.



Komponen yang dipakai ATmega 8535 dan 7 segment jenis common cathode. pin a b c d e f g pada 7 segment dihubungkan di PORTC sedangkan pin gnd dihubungkan di PORTD 3 (port yang dipakai ini bisa anda rubah sesuai kebutuhan).

Selanjunya kita akan menuliskan angka 0 - 9 pada 7 segment dengan 7 segment berjumlah satu. Bagaimana caranya..? lihat skematik isi dari 7 segment pada gambar diatas. Untuk angka 1 maka yang perlu dihidupkan adalah pin b dan c pada 7 segment sehingga di mikrokontroller kita perlu mengeset PORTB 1 dan PORT B 2 dengan nilai 1 dan PORT D3 dengan nilai 0 ( PORTD 3 sebagai grn maka diberi nilai 0) , angka 2 yang perlu dihidupkan adalah pin a b  g e d pada 7 segment. demikian seterusnya sampai angka 9. program di CAVR sebagai berikut :
Spoiler :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 07/01/2013
Author  : Bayu Sasongko
Company : Teknik Elektro UNILA
Comments: 


Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>


void main(void)
{
PORTC=0x00;
DDRC=0xFF;

PORTD=0x00;
DDRD=0xFF;

while (1)
      {
        PORTC=0b00111111; //angka 0  
        delay_ms(100);
        PORTC=0b00000110; // angka 1
        delay_ms(100);
        PORTC=0b01011011; //angka 2
        delay_ms(100);
        PORTC=0b01001111; // angka 3
        delay_ms(100);
        PORTC=0b01100110; //angka 4
        delay_ms(100);
        PORTC=0b01101101; // angka 5
        delay_ms(100);
        PORTC=0b01111101; //angka 6
        delay_ms(100);
        PORTC=0b00000111; // angka 7
        delay_ms(100);
        PORTC=0b01111111; //angka 8
        delay_ms(100);
        PORTC=0b01101111; // angka 9
        delay_ms(100);
      }
}


Tampilannya


download project coding dan proteus disini
(login dulu ke account google anda untuk mendownload)

2. Project 2 (menampilkan angka sampai ribuan)

Pada project ini kita menggunakan 4 buah 7 segment yang mampung menampilkan nilai pada variabel tertentu. Buat rangkaian seperti dibawah ini :


Dari gambar diatas terlihat bahwa 7 segment terhubung paralel antara yang satu dengan yang lain. Dalam menampilkan data dengan susunan 7 segment seperti ini kita perlu menggunakan teknik scaning. apa itu teknik scaning...? kita kembali dulu pada project 1, pada project tersebut seandainya kita ingin menambah 7 segment tapi dilain port misal PORTD memang bisa tetapi hal itu tentu sangat boros. Bayangkan seandainya kita perlu menambah 4 seven seven segment, berapa port banyaknya yang kita butuhkan...? tentu banyak khan....karena 1 seven segment membutukan 8 PORT pada mikrokontroller. Maka untuk menghemat PORT kita menggunakan teknik scaning ini. Pada teknik ini sebenarnya yang kita kendalikan adalah kolom mana yang hidup. Ok lihat gambar diatas misal kita ingin menampilkan nilai 4657 maka pertama-tama kita kirimkan nilai 7 pada PORTC, maka dapat dipastikan bahwa keempat seven segment menunjukkan angka 7. namun yang kita inginkan adalah nilai satuannya maka kita kendalikan kolomnya yaitu dengan mengatur PORTD. Lihat seven segment yang kita ingin hidupkan hanya yang paling kanan (satuan) maka PORTD0 kita beri nilai 0 dan PORTD1,PORTD2,PORTD3 diberi angka 1 sehingga hanya seven segment yang paling kanan yang hidup. Begitu seterusnya untu seven segment yang menunjukkan angka puluhan maka PORTD1 diberii nilai 0 sedangkan PORTD yang lain 1. Untuk coding lengkapnya silahkan lihat dibawah ini :

Spoiler :
#include  <mega8535.h>
#include  <delay.h>
unsigned char angka[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int satuan,puluhan,ratusan,ribuan,data,data_temp;

void ambil_data()
{
data_temp=data;
satuan=data_temp%10;
puluhan=(data_temp/10)%10;
ratusan=(data_temp/100)%10;
ribuan=(data_temp/1000)%10; 
}

void tampilkan_seven_segment()
{
PORTD.0=0;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[satuan];
delay_ms(1);
           
PORTD.0=1;
PORTD.1=0;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[puluhan];
delay_ms(1);
             
PORTD.0=1;
PORTD.1=1;
PORTD.2=0;
PORTD.3=1;
PORTC=angka[ratusan];
delay_ms(1);
            
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=0;;
PORTC=angka[ribuan];
delay_ms(1); 
}

void main(void)
{
data=4657;

PORTA=0x00;
DDRA=0xFF;

PORTB=0xFF;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0xFF;

while (1)
      {
      ambil_data();
      tampilkan_seven_segment();             
      };
}




variabel data merupakan variable yang nilainya akan ditampilkan ke 7 segment. Silahkan anda coba ubah-ubah sesuai kebutuhan. Berikut tampilan screenshootnya:


download coding lengkapnya disini (Login ke account google anda terlebih dahulu sebelum men-downlod).




3. Project 3 (Counter up dan Counter down)

Sekarang rangkaian kita modif untuk counter up dan counter down. Tambah switch push button misal pada PORTB. Rubah DDRB menjadi intput (DDRB=0x00;) aktifkan internal pull up (PORTB=0xFF;). buat rangkaian seperti dibawah ini :


programnya sebagai berikut :

Spoiler :
#include  <mega8535.h>
#include  <delay.h>
unsigned char angka[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int satuan,puluhan,ratusan,ribuan,data,data_temp,x;   

void ambil_data()
{
data_temp=data;
satuan=data_temp%10;
puluhan=(data_temp/10)%10;
ratusan=(data_temp/100)%10;
ribuan=(data_temp/1000)%10; 
}

void tampilkan_seven_segment()
{
PORTD.0=0;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[satuan];
delay_ms(1);
           
PORTD.0=1;
PORTD.1=0;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[puluhan];
delay_ms(1);
             
PORTD.0=1;
PORTD.1=1;
PORTD.2=0;
PORTD.3=1;
PORTC=angka[ratusan];
delay_ms(1);
            
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=0;;
PORTC=angka[ribuan];
delay_ms(1); 
}

void main(void)
{
data=0;

PORTA=0xFF;
DDRA=0x00;

PORTB=0xFF;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0xFF;

while (1)
      {
      for(x=0;x<50;x++)   
        {
        ambil_data();
        tampilkan_seven_segment(); 
        }  
       
      if (PINB.0==0)
        {
        data++;
        if (data>9999)
            {
            data=0;
            }
        } 
      
      if (PINB.1==0)
        {
        data--;
        if (data<=0)
            {
            data=0;
            }
        }
           
      };
}

Screenshootnya seperti dibawah ini:



Download projectnya lengkap disini.

4. Project 4 (Menampilkan data ADC)

Selanjutnya kita modif rangkaian diatas untuk menampilkan data ADC ( analog to digital konverter). Dalam percobaan ini menggunakan potensiometer untuk mendapatkan tegangan output yang akan dirubah menjadi nilai digital. Buat rangkaian seperti dibawah ini :


Programnya sebagai berikut :


Spoiler :
#include  <mega8535.h>
#include  <delay.h>
unsigned char angka[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int satuan,puluhan,ratusan,ribuan,data,data_temp,x; 

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}  

void ambil_data()
{
data_temp=data;
satuan=data_temp%10;
puluhan=(data_temp/10)%10;
ratusan=(data_temp/100)%10;
ribuan=(data_temp/1000)%10; 
}

void tampilkan_seven_segment()
{
PORTD.0=0;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[satuan];
delay_ms(1);
           
PORTD.0=1;
PORTD.1=0;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[puluhan];
delay_ms(1);
             
PORTD.0=1;
PORTD.1=1;
PORTD.2=0;
PORTD.3=1;
PORTC=angka[ratusan];
delay_ms(1);
            
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=0;;
PORTC=angka[ribuan];
delay_ms(1); 
}

void main(void)
{
PORTA=0xFF;
DDRA=0x00;

PORTB=0xFF;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0xFF;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SFIOR&=0xEF;

while (1)
      {
      
      data=read_adc(0);
      
      for(x=0;x<50;x++)   
        {
        ambil_data();
        tampilkan_seven_segment(); 
        }  
      };
}

Screenshoot hasilnya sebagai berikut:


Download Poject lengkap disini.


5. Project 5 (Menampilkan data sensor suhu LM35)

Setelah kita dapat menampilkan data ADC, sekarang kita naik lagi yaitu membuat termometer digital dengan sensor suhu LM35 dan menampilkannya dengan seven segment. Buat rangkaian seperti dibawah ini:


Programnya sebagai berikut :

Spoiler :
#include  <mega8535.h>
#include  <delay.h>

unsigned char angka[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int satuan,puluhan,ratusan,ribuan,data,data_temp,x;

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}  

void ambil_data()
{
data_temp=data;
satuan=data_temp%10;
puluhan=(data_temp/10)%10;
ratusan=(data_temp/100)%10;
ribuan=(data_temp/1000)%10; 
}

void tampilkan_seven_segment()
{
PORTD.0=0;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[satuan];
delay_ms(1);
           
PORTD.0=1;
PORTD.1=0;
PORTD.2=1;
PORTD.3=1;
PORTC=angka[puluhan];
delay_ms(1);
             
PORTD.0=1;
PORTD.1=1;
PORTD.2=0;
PORTD.3=1;
PORTC=angka[ratusan];
delay_ms(1);
            
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=0;;
PORTC=angka[ribuan];
delay_ms(1); 
}

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0xFF;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0xFF;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
SFIOR&=0xEF;

while (1)
      {
                
      data=read_adc(0)*0.488;

      for(x=0;x<100;x++)   
        {
        ambil_data();
        tampilkan_seven_segment(); 
        }  
      
      };
}

Hasilnya seperti dibawah ini :


Download project lengkap disini.


29 komentar:

  1. -BADIE-

    Mas...
    Saya baru belaajar Mikro nih. Saya punya kasus
    ->> http://www.media*fire.com/?77owdama580bd8i

    Kondisinya pengen munculin nama terlebih dahulu, selang 2 detik kemudian muncul no teleponnya..
    Gimana caranya ya mas??!

    Mohon bantuannya n' Terima kasih banyak.

    BalasHapus
  2. apakah harus ATMega8535?
    apa bisa diganti?

    BalasHapus
  3. sya mau buat jam digital pake seven segmen. bagaimana ya.. pemrogramannya.. email sy: udedayat@gmail.com makasih.

    BalasHapus
  4. mas saya mau bikin counter down 5 ke 0 dengan microcontroler avr 8535. tapi saya bingung mau mulai dari mana

    pengennya ada tombol input buat nguranginya

    misaal udah di set 5,mk 7 segment menampilkn angka 5

    terus tombol di pencet menjadi 4 ,, di pencet lg jadi 3, pencet lagi lagi dan lagi akhirnya jadi 0

    lalu ada tombol yang membuat tampilan 7 segment jadi 5 lagi
    help yaa gan kalau bisa

    BalasHapus
  5. mas , aku pengen belajar nih, rangkaian tak ganti make atmega 8,, , , kok nol persen yah :(
    help...
    (moga cepet dibales)

    lampiran: https://drive.google.com/file/d/0B9FuRMB1eXjcZTFqaDFBVkJ4R00/edit?usp=sharing

    BalasHapus
  6. min flowchart program sma penjelasannya buat project 5 nya bisa d kirim gk ksini suganggageor@gmail.com mohon bantuannya saya masih bingung sma pemerograman

    BalasHapus
  7. Makasih mas atas infonya, mau nanya mas klo rangkaian voltmeter digital dgn penampil; seven segmen gmna ya contoh rangkaian sm program C nya?
    terima kasih
    email saya : Junanmutamadra@yahoo.co.id

    BalasHapus
  8. Kan seven segment itu voltase nya brp ya ?
    saya buat seven segment 3 unit untuk penampakan angka, saya test dengan multi tester nyala semua. Jika saya ingin menggunakan tegangan 12 volt seperti aki motor gmn gan, apa saja yg perlu ditambahkan. thnk
    email : philipkanawijaya@gmail.com

    BalasHapus
  9. mas, mau tanya, bahasa program tersebut bahasa apa ya?
    saya mau belajar bahasa mikrokontroller, bingung harus darimana :(

    BalasHapus
  10. Makasih..
    ikut belajar... :)

    BalasHapus
  11. wahhhh ini blog keren bener, thanks berat yaaa bro

    BalasHapus
  12. untuk project 5 yang menggunakan sensor suhu tidak dapat menampilkan suhu minus. di bawah 0 pasti akan tetap menampilkan angka 0 walaupun lm35 menangkap suhu di bawah 0 alias minus

    BalasHapus
  13. makasih mas bro..,
    tutornya mantap..,
    sangat jelas.., (y)

    BalasHapus
  14. kalo buat downcounter buat lampu trafic supaya bisa detek angka nol saat ganti lampu. input dari lampu merah sama hijonya pake at 89s51 bisa nggak gan nanti tak beli souce listnya pake bascom gmn,lewat email aja gan.trims

    BalasHapus
  15. maaf gan, boleh minta yg bahasa mikroC nya ngga ya?

    BalasHapus
  16. mau tanya yang program ke 4, itu saya udah buat proteus dan avr tapi kalo di proteus hasil udah muncul tapi angka tidak sama.

    BalasHapus
  17. mas klo micro nya diganti pake arduino kira2 program nya gmna ya mas ???
    mohon pencerahannya mas

    BalasHapus
    Balasan
    1. Komentarna sama spt saya,dan sy tambahkan kalo pake led matrix 5x7 gmna master

      Hapus
  18. tutorial yang wow!. Lalu bagaimana caranya menampilkan data yang sudah kita tentukan untuk kondisi tertentu?. Misalnya, Jika saklar A ditekan, tampilkan angka 1000. Jika saklar B ditekan, tampilkan angka 2000, dst. Mohon bantuannya, terima kasih.

    BalasHapus
  19. terima kasih buat referensinya, sangat berguna sekali bagi saya yang masih pemula :)

    BalasHapus
  20. kok yang yang program ribuan tidak bisa??
    itu kenapa ya gan??

    BalasHapus
  21. Thx mas bro work smua ,, dan bisa di utak atik sedikit dengan mudah,, makasih ,,,,

    BalasHapus
  22. kalo buat winavr ada gak bang?
    kalo ada minta dong code program nya...

    BalasHapus
    Balasan
    1. dikirim sini aja yah gan kalo ada rivodatau.rd@gmail.com

      Hapus
  23. gan., mau tanya donk..?

    kenapa ada perulangan "for" pada listing di bwh ini:

    data=read_adc(0);

    for(x=0;x<50;x++)
    {
    ambil_data();
    tampilkan_seven_segment();
    }

    BalasHapus
  24. ZIPP ....SANGANT bermanfaat bagi pemula , trims,
    Sangat berguna buat pembelajaran.

    Kasih Proyek baru dong " Counter 4 digit input rs232 "

    sebelumnya terima kasih.

    BalasHapus

Silahkan isi komentar yang dapat membangun blog ini. Atas komentarnya saya ucapkan terimakasih

Related Posts Plugin for WordPress, Blogger...