Selasa, 30 April 2013

Mikrokontroller


long int num;
const long int menit = 60000000; //banyaknya siklus dalam 1 menit (xtal 4Mhz)
const long int timer_ovr = 0x00010000; //banyaknya siklus timer
char cacah;
char h0 = 0; //satuan jam
char h1 = 0; //puluhan jam
char m0 = 0; //satuan menit
char m1 = 0; //puluhan menit
char over_flow;
const char led[10] = {0x08, 0x3e, 0x11, 0x14, 0x26, 0x44, 0x40, 0x1e, 0x00, 0x04};
//rutin untuk menunda waktu sebesar 5ms
 void tunda(void){
Delay_ms(5);
 }

//rutin untuk menambah menit
void inc_minute(void){
m0++ ; over_flow = 0;
if (m0 == 10){
m0 = 0;
m1++ ;
if (m1 == 6)
{m1 = 0; over_flow = 1;}
}
}

//rutin untuk menambah jam
void inc_hour(void){
h0++ ;
if (h0==10){h0 = 0; h1++ ;}
if (h0==4 && h1 == 2){h0 = 0; h1 = 0;}
}

//rutin untuk multiplex 7 segment
void display(void){
PORTA = 0b11111111;
PORTB = led[m0];
PORTA = 0b11111110;
tunda();

PORTA = 0b11111111;
PORTB = led[m1];
PORTA = 0b11111101;
tunda();

PORTA = 0b11111111;
PORTB = led[h0];
PORTA = 0b11111011;
tunda();

PORTA = 0b11111111;
PORTB = led[h1];
PORTA = 0b11110111;
tunda();
}

// rutin layanan interrupt
void interrupt(void){
INTCON.T0IF = 0;
num -= timer_ovr;
if (num < 0){
num += menit;
inc_minute();
if (over_flow) inc_hour();
}
}

/* -----------ini adalah program utama---------------------- */
void main(void) {
//mengatur arah data pada port
TRISB = 0b10000000;
TRISA = 0b10000;
//mengatur timer0
OPTION_REG = 0b11010111;

//memampukan interrupt timer
INTCON.GIE = 1;
INTCON.T0IE = 1;
 
num = menit;
while (1){
for (cacah = 0; cacah < 25; cacah++){
display();
}

if (PORTB.RB7 == 0)  //periksa apakah tombol menit ditekan
inc_minute(); num = menit;}
if (PORTA.RA4 == 0) //periksa apalah tombol jam ditekan
{inc_hour(); num = menit;}
}

1 komentar: