Jelajahi eBook
Kategori
Jelajahi Buku audio
Kategori
Jelajahi Majalah
Kategori
Jelajahi Dokumen
Kategori
Abstrak
Beberapa interface yang umum digunakan sebagai masukan
maupun keluaran dalam penggunaan mikrokontroller
ATMega8535 adalah seven segment, keypad, dan
LCD. Dalam percobaan di modul 4 ini akan dipelajari
bagaimana menggunakan ketiganya.
Delay 1 ms
Delay 1 ms
TIFR|=(0<<OCF1A)
PORTD=(0<<PD7)|(1<<PD6) OCF1A=0
PORTD=(1<<PD7)|(0<<PD6)
Delay 1 ms PORTA=Ssegmen( 0 )|(1<<7)
PORTA=Ssegmen( 2 )
Delay 1 ms Delay 1 ms
PORTD=(1<<PD7)|(0<<PD6)
OCF1A=0 PORTA=Ssegmen( 0 )|(1<<7)
Delay 1 ms
Delay 1 ms
Delay 1 ms
Kodehex = 0x4f
OCF1A=0
Kodehex = 0x66
start angka end
Kodehex = 0x6d
Gambar 4 - 3 Flowchart main Tugas A.2
Kodehex = 0x7d Untuk menghitung waktu satu detik dan setengah
Kodehex = 0x07
detik digunakan timer 1 dengan compare match.
Untuk waktu 1 detik digunakan OCR1A = 0x1C20.
Kodehex = 0x7f Untuk waktu 0.5 detik digunakan OCR1A =
Kodehex = 0x6d
0x0E10. Scanning seven segmen untuk
menampilkan suatu digit dilakukan berulang
Gambar 4 - 2 Flowchart SSegmen Tugas A.1 hingga flag compare match OCF1A diaktifkan
yang menunjukkan waktu 1 detik. Setelah waktu 1
Dari flowchart di atas terlihat bahwa program
detik, lanjut ditampilkan digit selanjutnya pada
memiliki bagian main dan sebuah fungsi SSegmen.
seven segment.
Fungsi Ssegmen digunakan untuk mengatur
segmen mana yang diaktifkan saat suatu karakter Selain penambahan timer1, modifikasi juga
akan ditampilkan. Dalam hal ini hanya karakter dilakukan pada fungsi Ssegmen. Sebelumnya
angka yang dibuat yaitu 0-9. Penambahan karakter seven segment hanya menampilkan angka saja.
titik pada seven segment dilakukan dengan operasi Modifikasi dilakukan dengan menambah digit hruf
OR dengan operan (1<<7). “F” karena diperlukan dalam percobaan ini.
Program utama yang dibuat melakukan scanning Hasil dari percobaan ini telah sesuai dengan yang
pada kedua seven segment secara bergantian diharapkan. Seven segment menampilkan “50.”,
dengan periode 2 detik, terlihat dari jeda 1 detik “40.”, “30.”, “20.”, “10.” Masing-masing selama 1
tiap proses scanning. Kemudian dilakukan detik. Kemudian ditampilkan “FF.” Yang berkedip
penampilan digit “7.” pada seven segment pertama dengan selang waktu 0.5 detik.
dan “2” pada seven segment kedua. Hasil yang
diperoleh dari percobaan ini telah sesuai yaitu
ditampilkannya “7.2” pada seven segment.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 3
4.2 TUGAS IV.B – SCANNING KEYPAD Hasil modifikasi program yang digunakan
terdapat dalam lampiran. Berikut flowchart yang
4.2.1 TUGAS IV.B.1 digunakan dalam program hasil modifikasi.
Pada percobaan ini akan dilakukan scanning
keypad 2x2 yang merupakan empat buah switch.
Program akan menampilkan LED yang menyala
sesuai dengan keypad yang ditekan. Jika SW1
ditekan LED bit 0 akan menyala, SW2 akan
menyalakan LED bit 0 dan 1, SW 3 akan
menyalakan LED bit 0, 1, dan 2, dan SW4 akan
menyalakan LED bit 0, 1, 2, dan 3. Program yang
digunakan terdapat dalam lampiran. Berikut
flowchart dari program yang digunakan.
start
DDRA=0xFF
PORTA=0
DDRD=(1<<PD4)|(1<<PD5)
SFIOR=(0<<PUD)
PORTD=(1<<PD4)|(0<<PD5) PORTD=(0<<PD4)|(1<<PD5)
PIND0=0 PIND0=0
no no
yes
yes
PORTA=0b1 PORTA=0b1
Delay 50 ms Delay 50 ms
no
PIND1=0 PIND1=0
no
yes
yes
PORTA=0b1 PORTA=0b1
Gambar 4- 5 Flowchart main Tugas B.2
Delay 50 ms Delay 50 ms
Modifikasi dilakukan dengan mengubah keluaran
yang tadinya melalui LED PORTA, menjadi
keluaran dalam seven segment. Untuk itu,
dilakukan kembali proses secanning seven
Gambar 4 - 4 Flowchart main Tugas B.1
segment setelah pengecekan tombol dilakukan.
Dari flowchart di atas terlihat bahwa proses
Hasil yang diperoleh telah sesuai dengan hasil
scanning yang dilakukan sesuai dengan teori.
yang diharapkan. Jika SW 1 ditekan seven segment
Scanning dilakukan dengan bergantian
akan menampilkan “11”, jika SW 2 ditekan seven
mengeluarkan logika “0” untuk mengecek keypad
segment akan menampilkan “22”, jika SW 3
yang ditekan.
ditekan seven segment akan menampilkan “33”,
Hasil yang diperoleh dari percobaan ini telah dan jika SW 4 ditekan seven segment akan
sesuai dengan yang diharapkan. Jika SW1 ditekan menampilkan “44”.
LED bit 0 akan menyala, SW2 akan menyalakan
LED bit 0 dan 1, SW 3 akan menyalakan LED bit 0, 4.3 TUGAS IV.C – LCD
1, dan 2, dan SW4 akan menyalakan LED bit 0, 1, 2, Pada percobaan ini akan digunakan library AVR
dan 3. LCD Lib untuk menggunakan fasilitas LCD. Dalam
library ini telah terdapat beberapa fngsi dan
4.2.2 TUGAS IV.B.2 prosedur yang dapat digunakan untuk
Pada percobaan ini akan dilakukan modifikasi menjalankan LCD. Berikut prosedur yang ada
terhadap program dari percobaan B.1. modifikasi dalam library ini.
dilakukan dengan menampilkan keluaran hasil
- LCDsendChar, untuk menampilkan
penekanan keypad pada seven segment. Jika SW 1
karakter
ditekan seven segment akan menampilkan “11”,
jika SW 2 ditekan seven segment akan - LCDsendCommand, sama seperti
menampilkan “22”, jika SW 3 ditekan seven LCDsendChar
segment akan menampilkan “33”, dan jika SW 4 - LCDinit, untuk menginisialisasi LCD
ditekan seven segment akan menampilkan “44”.
5. KESIMPULAN
DAFTAR PUSTAKA
Dari percobaan-percobaan yang telah dilakukan
[1] Datasheet ATMega8535
pada modul ini diperoleh kesimpulan bahwa
[2] Hutabarat, Mervin T., Petunjuk Praktikum
- Sebagai interface untuk memberikan
Sistem Mikroprosesor, Laboratorium Dasar
masukan ke mikrokontroller ATMega 8535
Teknik Elekto, Bandung, 2015.
dapat digunakan keypad. Terdapat
beberapa jenis keypad dilihat dari
ukurannya yaitu 2x2, 3x3, dan 4x4.
- Sebagai interface untuk menampilkan
suatu keluaran, selain digunakan LED,
dapat pula digunakan seven segmen dan
LCD.
1. Tugas A.1
#include <avr/io.h>
#define F_CPU 7372800L
#include <util/delay.h>
char angka;
char kodehex;
unsigned int SSegmen(char angka);
int main (void)
{
DDRA = 0xFF;
DDRD = 0xFF;
while (1)
{
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('7')|(1<<7);
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('2');
_delay_ms(1);
}
return 0;
}
2. Tugas A.2
#include <avr/io.h>
#include <util/delay.h>
char angka;
char kodehex;
unsigned int SSegmen(char angka);
int main (void)
{
char i;
DDRA = 0xFF;
DDRD = 0xFF;
TIMSK |= (1<<TOIE1);
TCCR1A = 0;
TCCR1B = 0b00001101;
//penentuan nilai awal timer
TCNT1H = 0;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 8
TCNT1L = 0;
//penentuan nilai compare untuk delay 1 detik
OCR1AH = 0x1C;
OCR1AL = 0x20;
while(1)
{
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('5');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('0')|(1<<7);
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('4');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('0')|(1<<7);
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('3');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('0')|(1<<7);
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('2');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('0')|(1<<7);
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('1');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('0')|(1<<7);
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
for(i=1;i<=3;i++){
//penentuan nilai awal timer
TCNT1H = 0;
TCNT1L = 0;
//penentuan nilai compare untuk delay 0.5 detik
OCR1AH = 0x0E;
OCR1AL = 0x10;
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('F');
3. Tugas B.1
#include <avr/io.h>
#define F_CPU 7372800UL
#include <util/delay.h>
int main (void)
{
DDRA=0xFF;
PORTA=0x00;
DDRD=(1<<PD4)|(1<<PD5);
SFIOR=(0<<PUD);
while(1)
{
PORTD=(1<<PD4)|(0<<PD5);
if(bit_is_clear(PIND,0))
PORTA=0b00000001;
_delay_ms(50);
if(bit_is_clear(PIND,1))
PORTA=0b00001111;
_delay_ms(50);
PORTD=(0<<PD4)|(1<<PD5);
if(bit_is_clear(PIND,0))
4. Tugas B.2
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
LCDinit();//init LCD bit, dual line, cursor right
LCDclr();//clears LCD
while(1)//loop demos
{
progress();
delay1s();
demoanimation();
}
return 0;
}
#ifdef LCD_4bit
//4 bit part
LDP=(ch&0b11110000);
LCP|=1<<LCD_RS;
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
LCP&=~(1<<LCD_RS);
_delay_ms(1);
LDP=((ch&0b00001111)<<4);
LCP|=1<<LCD_RS;
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
LCP&=~(1<<LCD_RS);
_delay_ms(1);
#else
//8 bit part
LDP=ch;
LCP|=1<<LCD_RS;
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
LCP&=~(1<<LCD_RS);
_delay_ms(1);
#endif
}
void LCDsendCommand(uint8_t cmd) //Sends Command to LCD
{
#ifdef LCD_4bit
//4 bit part
LDP=(cmd&0b11110000);
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
LDP=((cmd&0b00001111)<<4);
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
#else
//8 bit part
#else
//8 bit part
_delay_ms(15);
LDP=0x00;
LCP=0x00;
LDDR|=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4|1<<LCD_D3
|1<<LCD_D2|1<<LCD_D1|1<<LCD_D0;
LCDR|=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
//---------one------
LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4|0<<LCD_D3
|0<<LCD_D2|0<<LCD_D1|0<<LCD_D0; //8 it mode
LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
//-----------two-----------
#endif
}
void LCDclr(void) //Clears LCD
{
LCDsendCommand(1<<LCD_CLR);
}
void LCDhome(void) //LCD cursor home
{
LCDsendCommand(1<<LCD_HOME);
}
void LCDstring(uint8_t* data, uint8_t nBytes) //Outputs string to LCD
{
register uint8_t i;
// print data
for(i=0; i<nBytes; i++)
{
LCDsendChar(data[i]);
}
}
void LCDGotoXY(uint8_t x, uint8_t y) //Cursor to X Y position
{
register uint8_t DDRAMAddr;
// remap lines into proper order
switch(y)
}
//Copies string from flash memory to LCD at x y position
//const uint8_t welcomeln1[] PROGMEM="AVR LCD DEMO\0";
//CopyStringtoLCD(welcomeln1, 3, 1);
void CopyStringtoLCD(const uint8_t *FlashLoc, uint8_t x, uint8_t y)
{
uint8_t i;
LCDGotoXY(x,y);
for(i=0;(uint8_t)pgm_read_byte(&FlashLoc[i]);i++)
{
LCDsendChar((uint8_t)pgm_read_byte(&FlashLoc[i]));
}
}
//defines char symbol in CGRAM
/*
const uint8_t backslash[] PROGMEM=
{
0b00000000,//back slash
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000000,
0b00000000
};
LCDdefinechar(backslash,0);
*/
void LCDdefinechar(const uint8_t *pc,uint8_t char_code){
uint8_t a, pcc;
uint16_t i;
a=(char_code<<3)|0x40;
for (i=0; i<8; i++){
pcc=pgm_read_byte(&pc[i]);
LCDsendCommand(a++);
LCDsendChar(pcc);
}
}
#include <inttypes.h>
#endif
8. Tugas C.2
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd_lib.h"
#include "lcd_lib.c"
//Strings stored in AVR Flash memory
const uint8_t LCDtombol1[] PROGMEM="***Tekan Tombol Scanning
Keypad***\0";
//delay 1s
void delay1s(void)
{
uint8_t i;
for(i=0;i<100;i++)
{
_delay_ms(10);
}
}
int main(void)
{
LCDinit();//init LCD bit, dual line, cursor right
LCDclr();//clears LCD
DDRA=0xFF;
PORTA=0x00;
DDRD=(1<<PD4)|(1<<PD5)|(1<<PC7)|(1<<PC6);
SFIOR=(0<<PUD);
delay1s();
LCDGotoXY(0, 1);
delay1s();
while(1)//loop demos
{
CopyStringtoLCD(LCDtombol1, 0, 0);
LCDshiftRight(1);
PORTD =(1<<PD4)|(0<<PD5);
if(bit_is_clear(PIND,0))
{
LCDclr();
LCDGotoXY(8, 1);
LCDsendChar('&');
delay1s();
LCDclr();
}
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
LCDclr();
9. Tugas C.3
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd_lib.h"
#include "lcd_lib.c"
//Strings stored in AVR Flash memory
const uint8_t LCDtombol1[] PROGMEM="Percobaan LCD\0";
//delay 1s
void delay1s(void)
{
uint8_t i;
for(i=0;i<100;i++)
{
_delay_ms(10);
}
}
uint8_t counter = 0;
int main(void)
{
LCDinit();//init LCD bit, dual line, cursor right
LCDclr();//clears LCD
DDRA=0xFF;
PORTA=0x00;
DDRD=(1<<PD4)|(1<<PD5);
SFIOR=(0<<PUD);
delay1s();
LCDGotoXY(counter, 1);
PORTD =(1<<PD4)|(0<<PD5);
if(bit_is_clear(PIND,0))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('1');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('4');
delay1s();
}
_delay_ms(50);
PORTD =(0<<PD4)|(1<<PD5);
if(bit_is_clear(PIND,0))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('2');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('3');
delay1s();
}
_delay_ms(50);
}
return 0;
}
//delay 1s
void delay1s(void)
{
uint8_t i;
for(i=0;i<100;i++)
{
_delay_ms(10);
}
}
uint8_t counter = 0;
int main(void)
{
LCDinit();//init LCD bit, dual line, cursor right
LCDclr();//clears LCD
DDRA=0xFF;
PORTA=0x00;
DDRD=(1<<PD4)|(1<<PD5);
SFIOR=(0<<PUD);
delay1s();
while(1)//loop demos
{
LCDGotoXY(counter, 1);
PORTD =(0<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
if(bit_is_clear(PIND,0))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('4');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('2');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,2))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
}
_delay_ms(50);
if(bit_is_clear(PIND,3))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('A');
delay1s();
}
_delay_ms(50);
PORTD =(1<<PD4)|(0<<PD5)|(1<<PD6)|(1<<PD7);
if(bit_is_clear(PIND,0))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('7');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('5');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,2))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('6');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,3))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('B');
delay1s();
PORTD =(1<<PD4)|(1<<PD5)|(0<<PD6)|(1<<PD7);
if(bit_is_clear(PIND,0))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('7');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('8');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,2))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('9');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,3))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('C');
delay1s();
}
_delay_ms(50);
PORTD =(1<<PD4)|(1<<PD5)|(1<<PD6)|(0<<PD7);
if(bit_is_clear(PIND,0))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('*');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,3))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('D');
delay1s();
}
_delay_ms(50);
}
return 0;
}