Program 7 segment dengan ATmega16

kali ini saya mw nyoba share project sederhana,,,mbuat 7 segment 4 digit,,,dengan tteknik scanning,,,jadi 4 buah 7 segment dinyalain secara bergantian…itu misal mw pake sub rutinnya, tinggal taroh az di barisan sebelum “void main(void)”, trus dalamnya ente tinggal panggil misal nilai yg pengen ditampilin nilai 1234tulis az “sevsegment(1234);” selamat mencoba yah

itu 7segmennya disambung ke portB

pinB.0 = digit 1
pinB.1 = digit 2
pinB.2 = digit 3
pinB.3 = digit 4
pinB.4 = scanning digit 1
pinB.5 = scanning digit 2
pinB.6 = scanning digit 3
pinB.7 = scanning digit 4

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

void write7segment(unsigned char digit, unsigned char bilangan)
{
 PORTB=((0xF7<<digit)&0xF0)|bilangan;
}

void sevsegment( unsigned int bilangan)
{
  unsigned int tempdata;
  unsigned int digit1,digit2,digit3,digit4;  //array data untuk memilah
  tempdata=bilangan;
  digit1=tempdata%10;                //satuan,
  tempdata/=10;
  digit2=tempdata%10;                //puluhan,
  tempdata/=10;
  digit3=tempdata%10;                //ratusan,
  tempdata/=10;
  digit4=tempdata%10;                //ribuan

  write7segment(1,digit1);    //scanning untuk digit 1/satuan
  delay_ms(1);
  write7segment(2,digit2);   //scanning untuk digit 2/puluhan
  delay_ms(1);
  write7segment(3,digit3);   //scanning untuk digit 3/ratusan
  delay_ms(1);
  write7segment(4,digit4);   //scanning untuk digit 4/ribuan
  delay_ms(1);
}

void main(void)
{
  DDRB=255;
  while(1)
  {
   sevsegment(1234);
  }
}
skematik
ini skema nya ya gan,,,kmrn post skemanya hilang nth kmn

Program 7 segment dan Keypad dengan ATmega8535

ini salah satu file project keypad dengan 7 segment menggunakan bahasa C, yang pernah saya buat monggo untuk dicoba yah,,,makasih dah berkunjung di blog saya.. :)

/*
edited by :aliexdsg
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
#include
#include
#include

#define baris1 PIND.4
#define baris2 PIND.5
#define baris3 PIND.6
#define baris4 PIND.7

char temp=0;
unsigned long int simpan=0;
// Declare your global variables here

void write7segment(unsigned char digit, unsigned char bilangan)
{
 PORTB=((0xF7<
}

void sevsegment( unsigned int bilangan)
{
  unsigned int tempdata;
  unsigned int digit1,digit2,digit3,digit4;  //array data untuk memilah
  tempdata=bilangan;
  digit1=tempdata%10;                //satuan,
  tempdata/=10;
  digit2=tempdata%10;                //puluhan,
  tempdata/=10;
  digit3=tempdata%10;                //ratusan,
  tempdata/=10;
  digit4=tempdata%10;                //ribuan
  write7segment(1,digit1);    //scanning untuk digit 1/satuan
  delay_ms(1);
  write7segment(2,digit2);   //scanning untuk digit 2/puluhan
  delay_ms(1);
  write7segment(3,digit3);   //scanning untuk digit 3/ratusan
  delay_ms(1);
  write7segment(4,digit4);   //scanning untuk digit 4/ribuan
  delay_ms(1);
}

unsigned char scan_keypad()
{
 char nilai;
//scan kolom 1
 PORTD=0b11111110;
 if(!baris1){ while(!baris1);nilai=1;}
 if(!baris2){ while(!baris2);nilai=4;}
 if(!baris3){ while(!baris3);nilai=7;}
 if(!baris4){ while(!baris4);nilai='*';}
//scan kolom 2
 PORTD=0b11111101;
 if(!baris1){ while(!baris1);nilai=2;}
 if(!baris2){ while(!baris2);nilai=5;}
 if(!baris3){ while(!baris3);nilai=8;}
 if(!baris4){ while(!baris4);nilai=10;}
 //scan kolom 3
 PORTD=0b11111011;
 if(!baris1){ while(!baris1);nilai=3;}
 if(!baris2){ while(!baris2);nilai=6;}
 if(!baris3){ while(!baris3);nilai=9;}
 if(!baris4){ while(!baris4);nilai='_';}
 return nilai;
}

void main(void)
{
 //init
 DDRB=0xFF;                 //   PORTB OUTPUT 7 SEGMENT
 DDRC=0xFF;                 //   PORTC OUTPUT
 PORTD=0xFF;                //   PORTD INPUT KEYPAD
 DDRD=0x0F;                 //
 ACSR=0x80;                 //
 //routines

 while(1)
 {
   temp=scan_keypad();
   if ((temp!='*') && (temp!='_') && (temp!='') && (simpan999))
       {
        if (temp==10) {simpan*=10;} else
            {
             simpan=simpan-((simpan/1000)*1000);
             simpan=(simpan*10)+temp;
            }

       }

   if (temp=='*') {simpan=0;temp=0;}
   sevsegment(simpan);
 }
}

Skema rangkaiannya yah

*nb : tombol ‘*’ saya gunakan untuk mereset angka

Jam Digital 7 segment dengan ATmega8 dan RTC DS1307

Sudah lama sekali tidak berkreasi di blog ini…sekarang pengen coba share gimana membuat sebuah jam digital

akan saya paparkan skematik dan kode nya disini,,,silakan dicoba ya teman semua

setting xtall = 1 Mhz Internal,,, jadi ga perlu pakai xtall, dengan kata lain ketika kita beli ic Atmega8 yg masih baru yg belum diapa-apakan,,, bisa langsung diberi program ini, tanpa perlu setting fusebit nya. atau kalau ingin pakai Xtall dikasih xtall 1Mhz dan setting eksternal crystall oscillator. 

code

#include <mega8.h>
#asm
.equ __i2c_port=0x18 ;portc
.equ __sda_bit=5
.equ __scl_bit=4
#endasm
#include <i2c.h>
#include <delay.h>
#include <ds1307.h>
#include <math.h>
/*
7 segment
a = 6
b = 4
c = 0
d = 1
e = 2
f = 5
g = 3

*/
char status=0;
unsigned char jam,menit,detik,segment;

void init_dev(void)
{
 DDRC=0b11111100;
 DDRD=0XFF;
 i2c_init();
 rtc_init(0,1,0);
}

void write7segment(unsigned char digit, unsigned char bilangan)
{

 switch (bilangan)
 {
 case 0 : { PORTD=~(0b1110111); }; break;
 case 1 : { PORTD=~(0b0010001); }; break;
 case 2 : { PORTD=~(0b1011110); }; break;
 case 3 : { PORTD=~(0b1011011); }; break;
 case 4 : { PORTD=~(0b0111001); }; break;
 case 5 : { PORTD=~(0b1101011); }; break;
 case 6 : { PORTD=~(0b1101111); }; break;
 case 7 : { PORTD=~(0b1010001); }; break;
 case 8 : { PORTD=~(0b1111111); }; break;
 case 9 : { PORTD=~(0b1111011); }; break;
 };

 switch (digit)
 {
 case 0 : { PORTC=((0b1110)<<2); }; break;
 case 1 : { PORTC=((0b1101)<<2); }; break;
 case 2 : { PORTC=((0b1011)<<2); }; break;
 case 3 : { PORTC=((0b0111)<<2); }; break;
 };

}
void sevsegmentjam( void )
{
 unsigned int tempdata;
 unsigned int digit1,digit2,digit3,digit4,digit5,digit6;

 tempdata=menit;
 digit3=tempdata%10;
 write7segment(0,digit3);
 delay_ms(5);

 tempdata/=10;
 digit4=tempdata%10;
 write7segment(1,digit4);
 delay_ms(5);

 tempdata=jam;
 digit5=tempdata%10;
 write7segment(2,digit5);
 delay_ms(5);

tempdata/=10;
 digit6=tempdata%10;
 write7segment(3,digit6);
 delay_ms(5);
}

&nbsp;

void sevsegmentjamset( char dig )
{
 unsigned int tempdata;
 unsigned int digit1,digit2,digit3,digit4,digit5,digit6;

 tempdata=menit;
 digit3=tempdata%10;
 tempdata/=10;
 digit4=tempdata%10;

 tempdata=jam;
 digit5=tempdata%10;
 tempdata/=10;
 digit6=tempdata%10;

 if (dig==0)
 {
 write7segment(0,digit3);
 delay_ms(5);
 write7segment(1,digit4);
 delay_ms(5);
 }
 if (dig==1)
 {
 write7segment(2,digit5);
 delay_ms(5);
 write7segment(3,digit6);
 delay_ms(5);
 }

}

void read_key(void)
{
 if (PINC.0==0)
 {
 while (PINC.0==0);
 status++;
 if (status==3)
 {
 init_dev();
 rtc_set_time(jam,menit,0);
 status=0;
 }
 }
 if (PINC.1==0)
 {
 while (PINC.1==0);
 if (status==1)
 {
 menit++;
 if (menit==60) menit=0;
 }
 if (status==2)
 {
 jam++;
 if (jam==24) jam=0;
 }
 }
}

void main (void)
{
 unsigned long int j;
 init_dev();
 //rtc_set_time(13,30,00);
 while(1)
 {
 while(status==0)
 {
 rtc_get_time(&jam,&menit,&detik);
 if (status==0)
 {
 for (j=0;j<1000;j++)
 {
 if (status==0) read_key();
 if (status==0) sevsegmentjam();
 }
 }
 };
 while(status!=0)
 {
 if (status==1)
 {
 read_key();
 sevsegmentjamset(0);
 }
 if (status==2)
 {
 read_key();
 sevsegmentjamset(1);
 }

 }
 }
}

ini file projectnya
http://www.ziddu.com/download/19513172/clock.zip.htm


ini foto asli alatnya,,,,mungkin temen2 bisa berkreasi sendiri rangkaian yang diinginkan

 

itu button yg nyambung ke PINC.0 berfungsi untuk pindah2 mode set menit dan jam, dan yang terhubung ke PINC.1 berfungsi merubah angka menit dan jam, dan setelah merubah angka menit dan jam tekan button yg terhubung ke PINC.0 lagi maka jam akan tersimpan dan kembali ke mode normal :)