Perpustakaan Unika
Lampiran Software #asm .equ __lcd_port=0x1B // LCD di PORTA alamat PORTA di 0x1B , 0x1B 'x'menunjukkan bilangan hexa kalau misal 0b11110000 'b' menunjukkan bilangan biner #endasm #include
// menyertakan library fungsi/routin LCD #include <stdio.h> // menyertakan library stdio #include <mega16.h> // menyertakan library IC ATMEGA16 #include <delay.h> // menyertakan fungsi delay #define PORT_KEY PORTC // definisi PORTC sebagai PORT keypad #define PIN_KEY PINC // #define INIT_TIMER0 TCNT0=200 // definisi inisialisasi TIMER #define sw_up E==0x10 // definisi tombol up E==0x10 merupakan data jika tombol up ditekan #define sw_down E==0x1A // definisi tombol down E==0x1A merupakan data jika tombol down ditekan #define ent E==0x13 // definisi tombol ent E==0x13 merupakan data jika tombol ent ditekan #define can E==0x11 // definisi tombol can E==0x11 merupakan data jika tombol can ditekan #define cor E==0x0A // definisi tombol cor E==0x0A merupakan data jika tombol cor ditekan #define mtr_dir PORTD.0 // definisi PIN direction/pemutar balik motor di PORTD.0 #define mtr_en PORTD.1 // definisi PIN on/off motor di PORTD.1 #define encoder PINB.0 // definisi masukan encoder di PINB.0 char Tulisan[]=" TUGAS AKHIR "; // Tulisan yang akan ditampilkan char Tulisan2[]="ALAT PENGGULUNG KUMPARAN "; char Tulisan3[]=" EMMANUEL 02.50.0029 "; char *P_T; // deklarasi pointer pada data string yang akan ditampilkan satu per satu * menunjukan penglamatan tidak langsung unsigned char i; // deklarasi variable i bertype unsigned char yaitu mempunyai jangkauan data 0 sampai 255 //}
unsigned int jml_lilit,ribuan,ratusan,puluhan,satuan; // deklarasi variable yang digunakan selama program yang bertype int mempunyai jangkauan data 0 sampai 65535 unsigned char dataA,dataB,conter; unsigned char E,D; char buf[16]; // deklarasi variable buffer string yang akan ditampilkan ke LCD char buffer[16]; // 16 menunjukan jumlah karakter yang bisa disimpan sementara void scan_baris (void); // deklarasi fungsi scan_baris pada keypad void scan_kolom (void); // deklarasi fungsi scan_kolom pada keypad typedef unsigned char byte; /* table for the user defined character arrow that points to the top right corner */
Perpustakaan Unika
flash byte char0[8]={ 0b1100000, // pembuatan karakter baru di LCD ini merupakan data karakter LCD yang berupa kursor 0b0011000, // 0b0000110, // 0b1111111, 0b1111111, 0b0000110, 0b0011000, 0b1100000}; void define_char(byte flash *pc,byte char_code) baru yang dibuat { byte i,a; a=(char_code<<3) | 0x40; DDRAM LCD for (i=0; i<8; i++) lcd_write_byte(a++,*pc++); }
//fungsi definisi karakter
// penulisan data biner ke
unsigned char scan_keypad(void) // fungsi/subrutin saning keypad { unsigned char C; scan_baris(); // panggilan scan baris scan_kolom(); // panggilan scan kolom C=dataA+dataB; // variable c diisi dengan penjumlahan data A+data B //if (C==0x0a) C=0; return C; } void scan_kolom (void) { DDRC=0x0F; // setting MSB PORTC sebagai input LSB output PORTC=0xF0; // pul up pada MSB PORTC delay_us(50); // panggil fungsi delay 50 mikro S if (~PINC&16) // jika kondisi data not PINC di AND kan dengan data 16 maka dataB diisi 0 dataB=0; else if (~PINC&32) dataB=1; else if (~PINC&64) dataB=2; else if (~PINC&128) dataB=9; else // jika kondisi tidak sama dengan kondisi diatas maka dataB diisi dengan 3 dataB=3; } void scan_baris(void) { DDRC=0xF0; PORTC=0x0F; delay_us(50); if (~PINC&1) dataA=1;
Perpustakaan Unika
else if (~PINC&2) dataA=4; else if (~PINC&4) dataA=7; else if (~PINC&8) dataA=17; else dataA=20; } void RFID() { void tampil (unsigned char masukan) { if (masukan==0x12)masukan=0; masukan di nolkan
// fungsi tampil (membaca input keypad) // jika data masukan = 0x12 maka
} void tampil2 (unsigned char masukan) { if (masukan==0x12)masukan=0; sprintf(buf,"%i",masukan); // cetak data masukan ke LCD lcd_puts(buf); switch (conter){ // counter penekana tombol case 0: satuan=masukan;break; // jika `1 kali satuan = masukan case 1: puluhan=satuan,satuan=masukan;break; case 2: ratusan=puluhan,puluhan=satuan,satuan=masukan;break; case 3: ribuan=ratusan;ratusan=puluhan,puluhan=satuan,satuan=masukan;break; } conter++; // conter penekanabn increment } void about() // fungsi about ( judl TA dll ) { //#asm ("cli"); //while(1){ lcd_clear(); /// kosongkan layar LCD lcd_gotoxy(0,0); // koordinat karaktr awal di 0,0 P_T=Tulisan; // variable P_T diisi dengan array Tulisan for (i=0;i<15;i++) // perulangan 16 kali ==> panjang layar LCD {lcd_putchar(*P_T); // tampilkan karakter ke lcd yang ditunjukan pointrer variabl P_T P_T++; // variabl P_T increment delay_ms(30);if (E==0x13){ goto akhir;}} // tunda 30 ms jika E=0x13 lompat ke labe; akhir delay_ms(500); lcd_clear(); lcd_gotoxy(0,0); P_T=Tulisan2; for (i=0;i<31;i++) {lcd_putchar(*P_T); P_T++; delay_ms(30);if (E==0x13){ goto akhir;}} delay_ms(500); lcd_clear(); lcd_gotoxy(0,0); P_T=Tulisan3; for (i=0;i<31;i++) {lcd_putchar(*P_T);
Perpustakaan Unika
P_T++; delay_ms(30);if (E==0x13){ goto akhir;}} akhir: delay_ms(500); } void hitung(){ jml_lilit=ribuan*1000+ratusan*100+puluhan*10+satuan; } perhitungan jmlh lilitan yg diinput keypad
//
interrupt [TIM0_OVF] void timer0_int(void) // fungsi interrup timer { INIT_TIMER0; // inisialisasi TIMER0 D=scan_keypad(); // D diisi scan_keypad ( variable fungsi ) delay_us(10); E=scan_keypad(); if (E!=23) // jika E tidak sma dengan 23 data waktu keypad tidak ditekan if (E!=D) // jika Etdak sma dengan D tampil(E); // masukan E ke fungsi tampil } void steper(unsigned int i) { unsigned int a; a=i%8; switch (a){ case 0: PORTD.4=1;PORTD.5=0; 0
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
PORTD.6=0;PORTD.7=0; break; PORTD.4=0;PORTD.5=1; PORTD.6=0;PORTD.7=0; break; PORTD.4=1;PORTD.5=0; PORTD.6=0;PORTD.7=0; break; PORTD.4=0;PORTD.5=1; PORTD.6=0;PORTD.7=0; break; PORTD.4=0;PORTD.5=0; PORTD.6=1;PORTD.7=0; break; PORTD.4=0;PORTD.5=0; PORTD.6=0;PORTD.7=1; break; PORTD.4=0;PORTD.5=0; PORTD.6=1;PORTD.7=0; break; PORTD.4=0;PORTD.5=0; PORTD.6=0;PORTD.7=1; break; } }
void motor_stop() { mtr_dir=0;
//
//inputan dari perputaran encoder
// baca var a //jika 0 ==>PD.4 diisi 1 dan PD.5 diisi
Perpustakaan Unika
mtr_en=0; PORTD=0x00;} void motor_rewind() { mtr_dir=0; mtr_en=1;} void motor_release() { mtr_dir=1; mtr_en=1;} void run_rewind(unsigned int inputan) // fungsi run rewind dengan jumlah input di inputan { unsigned int putaran=0; //variabl itung putaran motor_rewind(); // fungsi untuk mnjalankan mtr rewind lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("JUMLAH LILITAN"); // cetak ke lcd kata dlam kurung lcd_gotoxy(0,1); lcd_putsf("READ="); while (putaran
Perpustakaan Unika
} //steper(putaran); lcd_gotoxy(5,1); sprintf(buffer,"%i",putaran); lcd_puts(buffer); } motor_stop(); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("DONE"); lcd_gotoxy(0,1); lcd_puts(buffer); while (!can){;}; }
void showMenu() { lcd_clear(); menu01: delay_ms(50); lcd_gotoxy(0,0); lcd_putsf(" REWIND lcd_gotoxy(0,1); lcd_putsf(" RELEASE
"); ");
lcd_gotoxy(0,0); //kursor di REWIND lcd_putchar(0); // cetak kursor di koordinat diats if (ent) // jika ditekan enter maka { lcd_clear(); // layar kosong goto setREWIND; } // dan lompat ke label seREWIND if (sw_down) { goto menu02; } if (sw_up) { goto menu03; } goto menu01; menu02: delay_ms(50); lcd_gotoxy(0,0); lcd_putsf(" REWIND lcd_gotoxy(0,1); lcd_putsf(" RELEASE
"); ");
lcd_gotoxy(0,1); //kursor di RELEASE lcd_putchar(0); if (ent) { lcd_clear(); goto setRELEASE; } if (sw_up) { goto menu01; } if (sw_down) { goto menu03; }
Perpustakaan Unika
goto menu02; menu03: delay_ms(50); lcd_gotoxy(0,0); lcd_putsf("EXIT"); lcd_gotoxy(0,0); lcd_putchar(0);
//kursor di EXIT
if (ent) { lcd_clear(); goto EXIT; } if (sw_up) { goto menu02; } if (sw_down) { goto menu01; } goto menu03; setREWIND: lcd_clear(); while (ent){ // debouncing untuk penekanan tombol enter delay_ms(1);} lcd_gotoxy(0,0); lcd_putsf("INPUT JML LILIT "); lcd_gotoxy(0,1); lcd_putsf("WRITE="); _lcd_ready(); _lcd_write_data(0x0d); #asm("cli");conter=0; RWND: if (ent){ lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("REWIND OR NOT?"); // putsf itu mencetak karakter yang data karakternya disimpan di memori flash hitung(); // panggil fungsi kitung ==> penghitungan masukan keypad ke bilangan lcd_gotoxy(0,1); sprintf(buf,"%i lilitan",jml_lilit); lcd_puts(buf); delay_ms(500); E=0;#asm ("sei"); goto go_rewind; } if (cor){ #asm ("sei");ribuan=0;ratusan=0;puluhan=0;satuan=0; goto setREWIND;} if (can) { lcd_clear(); #asm ("sei"); goto menu01;} D=scan_keypad(); delay_ms(100); E=scan_keypad(); if (E!=23) /// desimal langsung angka , hexa depanya 0x , biner 0b if (E!=D) if (E!=0x10) if (E!=0x11) if (E!=0x13)
Perpustakaan Unika
if (E!=0x1A) if (E!=0x0D) tampil2(E);
goto RWND; setRELEASE: lcd_clear(); delay_ms(100); lcd_gotoxy(0,0); lcd_putsf("RELEASE OR NOT? delay_ms(100); RLES: if (ent) {
");
delay_ms(500);#asm ("sei"); E=0;goto go_release; } //run_release();PORTD=0x00; if (can){ lcd_clear(); #asm ("sei");goto menu02;} untuk mengeset global interupt goto RLES; go_rewind: if (ent){ run_rewind(jml_lilit);} if (cor) {goto setREWIND;} if (can) { goto menu01;} /*D=scan_keypad(); delay_ms(100); E=scan_keypad(); if (E!=23) if (E!=D) if (E!=0x10) if (E!=0x11) if (E!=0x13) if (E!=0x1A) if (E!=0x0D) tampil(E);*/ goto go_rewind; go_release: if (ent){run_release(); } if (can){goto menu02;} goto go_release;
EXIT: lcd_clear(); } void main() { PORTD=0x00; DDRD=0xff; // Mengeset PORTD sebagai output PORTB=0x00; DDRB=0x00; // Mengeset PORTB sebagai input
// #asm
script
Perpustakaan Unika
TCCR0=0x03; INIT_TIMER0; OCR0=0x00;
TIMSK=0x01;
// // // //
Timer/Counter 0 initialization Clock source: System Clock Clock value: 172.800 kHz Mode: Normal top=FFh
// Timer(s)/Counter(s) Interrupt(s) initialization
lcd_init(16); // inisialisasi lcd yang dipakai 16 menunjukkan jumlah kolom define_char(char0,0); //definisi karakter lcd buatan sendiri yakni kursor motor_stop(); //routin motor stop delay_ms(1000); //delay 1 detik #asm("sei"); //set global interrupt awal: E=0; about(); //pemanggilan fungsi/routin about yakni tampilan awal yang ditampilkan di LCD if (E==0x13){ goto menu;} // E==0x13 ==> data jika tombol enter ditekan,, jika enter ditekan maka program akan lompat ke label menu goto awal; // jika keypad tidak ditekan maka program akan lompat ke label awal menu: lcd_clear(); // pemanggilan fungsi/routin membersihkan layar LCD lcd_gotoxy(0,0); // penentuan posisi awal kursor angka pertama menunjukan baris dan angka kedua menunjukan kolom lcd_putsf("STANDBY"); // menampilkan tulisan STANDBY while (E!=0x0D){;} // data tombol MEN , jika tombol menu tidak ditekan maka program akan berputar disini terus jika MEN ditekan maka program akan lanjut kebawah lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("MENU"); while (E!=0x11){;} // data tombol CAN , jika tombol menu tidak ditekan maka program akan berputar disini terus jika MEN ditekan maka program akan lanjut kebawah showMenu(); // pemanggilan fungsi showMenu; goto awal; // program akan berulang ke label awal }