April 14, 2012

Tutorial Seven Segment dengan CodeVision AVR

Tutorial Seven Segment dengan CodeVision AVR

Seven Segment adalah komponen yang terdiri dari tujuh led yang tersusun sedemikian rupa sehingga dapat digunakan untuk menampilkan angka 0-9 dan titik atau koma. Seven Segment seperti led pada umunya memiliki berbagai macam tampilan warna, yaitu merah, kuning, hijau, dsb dan berbagai macam ukuran.
Seven segment berdasarkan input logikanya terbagi menjadi dua macam, yaitu Common Anoda (input logika 0) dan Common Cathoda (input logika 1).
Hal yang perlu diperhatikan dalam setiap komponen seven segment adalah pin-pin pada yang mewakili urutan segmentnya (A-G dan titik), karena tidak semua seven segment sama urutannya walaupun sama ukurannya.

Salah satu contoh urutan kaki pada seven segment adalah sbb:



Ada berbagai macam cara dalam menampilkan seven segment, antara lain dengan menggabungkan langsung setiap pin 7 segment ke pin mikro, menggabungkan pin-pin 7 segment (sehingga yang terhubung ke mikro cuma 7 pin walaupun memakai lebih dari satu buah 7 segment) dengan common setiap 7 segment ke satu pin mikro, menggunakan IC BCD (cara ini lebih mudah, karena tidak perlu memikirkan data setiap led 7 segment, hanya mengirimkan data angka 0-9), dan menggunakan IC Shift Register.

Pada tutorial kali ini saya menggunakan cara kedua, yaitu menggabungkan setiap pin-pin 7 segment (saya menggunakan 3 buah 7 segment) dengan setiap pin common masing-masing 7 segment terhubung pada 1 pin mikrokontroler.


Seven Segment yang saya gunakan adalah Common Anoda, karena logika yang dikirimkan adalah 0 sehingga lebih sedikit power yang terbagi.


Contoh programnya dengan CodeVision AVR adalah sbb:

/*****************************************************
Tutorial 7SEGMENT dengan CodeVision AVR
Programmer : WAHYU RAHMANIAR
Company : TECHNOLOGINATION
*****************************************************/

#include
#include
#include
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include


// Declare your global variables here
char satuan, puluhan, ratusan, urut;
unsigned int data, data_temp;
unsigned int i;
unsigned char Baris1[16];

void tampil()
{
PORTD=ratusan;//mengirimkan data ratusan
PORTB=0x80;//menyalakan digit1
delay_ms(50);

PORTD=puluhan;//mengirimkan data puluhan
PORTB=0x40;//menyalakan digit2
delay_ms(50);

PORTD=satuan;//mengirimkan data satuan
PORTB=0x20;//menyalakan digit3
delay_ms(50);
//lamanya waktu scanning ditentukan oleh intruksi delay
}

void nyala_led()//fungsi untuk mengubah kedalam format 7segment
{
if (urut==0){urut=0xc0;}
if (urut==1){urut=0xf9;}
if (urut==2){urut=0xa4;}
if (urut==3){urut=0xb0;}
if (urut==4){urut=0x99;}
if (urut==5){urut=0x92;}
if (urut==6){urut=0x82;}
if (urut==7){urut=0xf8;}
if (urut==8){urut=0x80;}
if (urut==9){urut=0x90;}
}

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

PORTB=0x00;
DDRB=0xE0;

PORTC=0x00;
DDRC=0x00;

PORTD=0xFF;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);
//PORTB.0=1;
i=0;
while (1)
{
if(PORTB.0==0)
{
i++;
}

data=i;

sprintf(Baris1,"Counter=%5u",data);
lcd_gotoxy(0,0);
lcd_puts(Baris1);

data_temp=data;
ratusan=data_temp/100;
urut=ratusan;
nyala_led();
ratusan=urut;

data_temp=data_temp%100;
puluhan=data_temp/10;
urut=puluhan;
nyala_led();
puluhan=urut;

satuan=data_temp%10;
urut=satuan;
nyala_led();//fungsi untuk menyalakan led 7segment
satuan=urut;

tampil();//fungsi untuk mengaktifkan 7segment berdasarkan urutan
delay_ms(1000);
lcd_clear();

};
}

Simulasi dengan proteus dan program dengan CV AVR dapat didownload
disini.

sumber