MODUL 4 SEVEN SEGMENT, KEYPAD, DAN LCD Muhammad Hanif (13214147) Asisten : Dinan Fakhri (13213047) Tanggal Percobaan :10/04/2017 EL3214-Praktikum Sistem Mikroprosesor Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Dalam modul ini, praktikan akan memahami lebih lanjut datasheet ATMega8535 dengan membuat aplikasi menggunakan seven segment, keypad, dan LCD. Ada tiga tugas yang dilakukan. Keypad digunakan sebagai masukan dengan menghubungkan port I/P S KEY. Adapun seven segment dan LCD digunakan untuk menampilkan keluaran yang diharapkan. Pertama adalah adalah melakukan scanning scanning seven segment dengan keluaran berupa angka yang ditampilkan pada seven segment sesuai masukan baik yang diberikan melalui source code maupun tombol keypad. Kedua adalah melakukan scanning keypad dimana keluaran baik pada output LED display maupun seven segment sesuai dengan masukan yang diberikan melalui keypad. Ketiga adalah membuat sebuah program yang akan menampilkan angka sesuai masukan keypad pada LCD, dan setiap setelah masukan empat kali, layar akan bergeser ke kiri sebanyak 2 karakter. Kata kunci: keypad, LCD, seven segment. 1. PENDAHULUAN ATMega8535 adalah sebuah sistem minimum yang memiliki tiga alamat memori pada I/O nya. ATMega jenis ini mempunyai internal clock bawaan yang dapat diatur sesuai kebutuhan dengan melakukan pengaturan fuse agar program dapat berjalan dengan baik. Dengan mempelajari hal ini, diharapkan praktikan dapat memahami secara lebih mendalam dari system mikroprosesor yang akan sangat banyak aplikasinya dalam dunia elektornika ini pula. Adapun tujuan dari praktikum ini adalah sebagai berikut : 1.
Praktikan ATMega8535
memahami
datasheet
2.
Praktikan mampu membuat aplikasi menggunakan seven segment, keypad, dan LCD.
dijalankan secara bergantian (dengan frekuensi tertentu) melalui jumlah port yang minimum. Pada praktikum ini akan dipelajari teknik scanning untuk menjalankan dua buah seven segment pada Trainer Board. Aturan untuk menjalankan kedua seven segment tersebut adalah sebagai berikut: Untuk menjalankan seven segment 1 (berlabel DIGIT1) maka pin pi n DO1 (dari Port ”I/P S KEY”) harus diberi logika “0”; sedangkan untuk dapat menjalankan seven segment 2 (DIGIT1) maka pin DO2 (dari port ”I/P S KEY”) harus diberi logika “0”. Dengan demikian, untuk menyalakan masingmasing seven segemen tersebut, diatur logika logika ”0” untuk pin D01 dan D02 secara bergantian. Selain dua aturan di atas, untuk menampilkan angka (0 – 9) dan titik (.) dengan seven segment pada Trainer Board tersebut yaitu dengan mengatur logika pin dari port ”Data 7S”. Rangkaian seven segment tesebut tesebut berisfat active high (logika “1” = nyala, logika “0” = padam), dengan urutan dari MSB ke LSB adalah DP (titik), G, F, E, D, C, B, A. 2.2 SCANNING K EYPAD EYPAD Pada prinsipnya, teknik scanning pada keypad mirip dengan teknik scanning pada seven segmen. Namun, pada scanning keypad, selain dilakukan pengaturan logika pin secara bergantian, juga dilakukan secara bergantian pemeriksaan/pembacaan pin oleh mikrokontroler untuk mengetahui tombol keypad mana yang sedang ditekan. DT-51 Trainer Board memiliki keypad 2x2 dengan kondisi sebagai berikut:
2. S TUDI PUSTAKA 2.1 SCANNING SEVEN SEGMENT Salah satu teknik untuk menjalankan perangkat Seven Segment adalah teknik scanning. Dengan teknik scanning ini, sejumlah seven segmen dapat
Pin penerima output dari mkrokontroler adalah pin KBO1 (dari port “I/P S KEY”) dan KBO2 (dari port “I/P S KEY”) yang bersifat active low. Sedangkan pin yang memberikan input pada mikrokontroler adalah KBI1 (dari port “I/P S KEY”) dan KBI2 (dari port “I/P S KEY”) yang bersifat active low.
Berikut ini adalah tahap-tahap untuk menjalankan keypad 2x2:
Pertama, berikan logika “0” pada pin KBO1 (sementara pin KBO2 berlogika “1”). Lalu,
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1
periksa logika dari data input KBI1. Jika logika pin KBI1 berubah dari “1” ke “0” berarti KEY1 telah ditekan (perhatikan rangkain listriknya).
Mengatur power supply pada 9V Menghubungkan I SP Training Board dengan kabel downloader
Selanjutnya KBI2 diperiksa; jika logikanya berubah dari “1” ke “0” berarti berarti KEY3 telah ditekan. Kedua, berikan logika “0” pada KBO2 (sementara pin KBO1 berlogika “1”). Kemudian tiap-tiap data input-nya diperiksa, seperti pemeriksaan pada tahap pertama.
2.3 LCD
Menghubungkan PORTA dengan DATA 7S, PORTD dengan I/P S KEY Mengatur sumber clock eksternal 7372800Hz
Membuat source code pada WinAVR Mengubah target pada makefile sesuai nama file sourcecode Melakukan kompilasi source code
LCD yang digunakan dalam praktikum ini adalah LCD yang berbasis pada HD44780 LCD controller. Percobaan tentang LCD akan dilakukan dengan menggunakan library beserta demo project-nya. Hal pertama yang harus diperhatikan dalam menggunakan library tersebut untuk percobaan pada praktikum ini adalah bahwa pada praktikum ini LCD dijalankan dengan menggunakan Port C. Sementara pada library tersebut, LCD dijalankan dengan Port D. Pengubahan dari Port D ke Port C dilakukan dengan mengedit 4 baris perintah pada file lcd_lib.h menjadi sebagai berikut: #define LDP PORTC
Gambar 3-2 Diagram kerja tugas 4B
Mengatur power supply pada 9V Menghubungkan I SP Training Board dengan kabel downloader Menghubungkan PORTC dengan LCD, PORTD dengan I/P S KEY Mengatur sumber clock eksternal 7372800Hz
Membuat source code pada WinAVR Mengubah target pada makefile sesuai nama file sourcecode
#define LCP PORTC #define LDDR DDRC
Melakukan kompilasi source code
#define LCDR DDRC Gambar 3-3 Diagram kerja tugas 4C
3. METODOLOGI Alat dan komponen yang digunakan pada modul ini adalah sebagai berikut.
4. H ASIL DAN A NALISIS 4.1 TUGAS 4A: SCANNING SEVEN SEGMENT
a. PC dengan WinAVR
Tugas 4A1
b. Kit Praktikum (termasuk USART)
Pada tugas pertama modul empat ini, kita akan mengaplikasikan scanning seven segment dengan menjalankan source code dari modul dan mengamati keluaran yang terjadi pada seven segment. Hasil yang diperoleh sudah sesuai. Fungsi SSegmen akan menyalakan bit yang sesuai pada seven segment sesuai angka yang akan ditampilkan, yaitu 7.2. Kedua seven segment memang terlihat menyala bersamaan secara kasat mata, tetapi sebenarnya keduanya menyala bergantian dalam interval waktu yang sangat cepat. Pada program, PORTD melakukan proses scanning seven segment yaitu menentukan seven segment mana yang akan dinyalakan. Perlu diingat bahwa seven segment bersifat active low.
c. Power Supply d. Kabel-kabel Mengatur power supply pada 9V Menghubungkan I SP Training Board dengan kabel downloader Menghubungkan PORTA dengan DATA 7S, PORTD dengan I/P S KEY Mengatur sumber clock eksternal 7372800Hz
Membuat source code pada WinAVR Mengubah target pada makefile sesuai nama file sourcecode Melakukan kompilasi source code
Adapun hasil yang didapat serta flowchart pada tugas ini adlaah sebagai berikut :
Gambar 3-1 Diagram kerja tugas 4A Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
2
Gambar 4-1 Flowchart program tugas 4A1
Gambar 4-2 Ilustrasi keluaran tugas 4A1
Tugas 4A2
Seven segment akan menunjukkan angka yang berbeda setiap detiknya yaitu 50, 40, 30, 20, 10, kemudian F.F. berkedip 3 kali kemudian mati. Waktu yang dibutuhkan seven segment untuk menampilkan dua digit sebelum berganti angka sekarang bertambah menjadi 1 detik karena kondisi seven segment diulang 500 kali.
Gambar 4-4 Ilustrasi keluaran tugas 4A2
4.2 TUGAS 4B: Tugas 4B1
Tugas kedua adalah scanning keypad. Hasil yang diperoleh sesuai, dimana saat keypad 1 ditekan bit 0 LED akan menyala, keypad 2 ditekan maka bit 0,1 yang akan menyala dan seterusnya sampai keypad 4. Input berupa keypad 2x2. Scanning dilakukan per kolom. Jika kolom pertama mati maka keluaran akan disesuaikan untuk masukan key1. Jika kolom kedua yang mati, maka keluaran akan disesuaikan untuk masukan key4. Gambar 4-3 Flowchart tugas 4A2 Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
3
Gambar 4-5 Keluaran tugas 4B1
Gambar 4-7 Keluaran tugas 4B2
Gambar 4-6 Flowchart program tugas 4B1
Tugas 4B2
Pada gambar terlihat keluaran tugas B2, dimana tampilan awal seven segment adalah 00 kemudian mengikuti masukan yang diberikan yaitu 11 jika key1 ditekan, 22 untuk key2, 33 untuk key3, dan 44 untuk key4. Proses scanning sama seperti tugas sebelumnya, tetapi sekarang keluaran ditampilkan pada seven segment. Kedua seven segment dapat menampilkan kedua digit yang diinginkan secara bersamaan karena bernilai sama.
Gambar 4-8 Flowchart program tugas 4B2
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
4
4.3 TUGAS 3C: Tugas 4C1
Tugas terakhir adalah menggunakan LCD. Pertama, demo lib AVR dilakukan. Hasil yang diperoleh adalah karakter yang dideklarasikan pada source code yaitu pada gambar sebagai berikut. Terdapat beberapa prosedur yang dapat langsung digunakan yaitu: LCDGoToXY untuk menentukan posisi karakter LCDSendChar untuk menampilkan karakter yang diinginkan LCDClr untuk mengosongkan layar LCD Tugas 4C2
Tugas C2 adalah menggunakan keypad sebagai input. Key1 akan memberikan keluaran &. Key2 akan memberikan keluaran 5. Key3 akan memberikan keluaran 7 dan key4 akan memberikan keluaran a. Gambar 4-10 Flowchart program 4C2 ***Tekan Tombol Scanning Keypad*** Input key1
Percobaan LCD 143 Setelah 4 input pertama
&
rcobaan LCD 2770
Input key4 a Input key2 5 Input key3 7
Setelah 4 input kedua obaan LCD 3781 Gambar 4-11 Keluaran tugas 4C3 dan 4C4
Tugas 4C3
Tugas C3 adalah membuat program agar LCD menampilkan keluaran angka sesuai input keypad yang diberikan, dan layar akan bergeser 2 karakter ke kiri setiap empat kali input.
Gambar 4-9 Keluaran tugas 4C2
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
5
3. Pada
mode
pin
high
impedance,
Gambar 4-12 Flowchart tugas 4C3
Tugas 4C4
Tugas C4 mirip dengan tugas C3, tetapi input sekarang berupa keypad 4x4. pull-up resistor perlu digunakan membuat pin menjadi input.
untuk
5. K ESIMPULAN Dari percobaan ini didapat kesimpulan sebagai berikut :
Gambar 4-13 Flowchart tugas 4C4
1. Teknik scanning digunakan saat memakai seven segment dan keypad untuk meminimalisir penggunaan PORT ketika menentukan masukan mana yang diterima dan keluaran apa yang diharapkan. 2. Scanning keypad dilakukan per kolom sehingga saat keypad dalam satu baris ditekan tidak akan berpengaruh terhadap keluaran. Adapun jika keypad dalam satu kolom ditekan, keypad diatas tombol yang ditekan akan mati yaitu mengikuti keadaan keypad yang ditekan karena bersifat seri.
1.
Dalam melakukan problem solving dengan ATMega8535, kita harus terlebih dahulu memahami datasheetnya terlebih dahulu sehingga kita bisa mendesain solusi denngan benar
2.
Dalam melakukan problem solving, kita dapat memanfaatkan penggunaan mikrokontroler (dalam hal ini ATMega) dan dikombinasikan dengan penggunaan LCD, Seven segment, maupun keypad yang dapat digunakan sebagai output dan input dengan menghubungkannya ke PORT tertentu. Metode scanning dapat dgunakan untuk membuat seven segment menyala bergantian dengan sangat cepat. Scanning pada keypad juga dapat dilakukan per kolom untuk membaca masukannya. Dan kita juga bisa menggunakan LCD dengan bantuan library yang sudah ada untuk mendesain sesuai yang kita inginkan.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
6
D AFTAR PUSTAKA [1]
Hutabarat, Mervin T. dkk. Modul Praktikum Sistem Mikroprosesor . Laboratorium Dasar Teknik Elektro. Bandung, 2017.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
7
L AMPIRAN tugas4a1.c #include
#define F_CPU 7372800UL #include char angka; char kodehex; unsigned int SSegmen(char angka); int main(void) {
DDRA = 0xFF; DDRD = 0XFF; while (1) { PORTD = (0 <
unsigned int SSegmen(char angka) { switch (angka) { case '0' :
kodehex = break; case '1' : kodehex = break; case '2' : kodehex = break; case '3' : kodehex = break; case '4' : kodehex = break; case '5' : kodehex = break; case '6' : kodehex = break; case '7' : kodehex = break; case '8' : kodehex = break; case '9' : kodehex = break;
0x3f;
0x06;
0x5b;
0x4f;
0x66;
0x6d;
0x7d;
0x07;
0x7f;
0x6f;
} return kodehex; }
tugas4a2.c #include Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
8
#define F_CPU 7372800UL #include char angka; char kodehex; unsigned int SSegmen(int angka); int main(void) {
DDRA = 0xFF; DDRD = 0XFF; int i,j; while (1) { for(i=5;i> 0;i--) { for(j=0;j <500;j++) { PORTD = (0 <
unsigned int SSegmen(int angka) { switch (angka) { case 0 :
kodehex = 0x3f; break; case 1 :
kodehex = 0x06; break; case 2 :
kodehex = 0x5b; break; case 3 :
kodehex = 0x4f; break; case 4 :
kodehex = 0x66; Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
9
break; case 5 :
kodehex = 0x6d; break; case 6 :
kodehex = 0x7d; break; case 7 :
kodehex = 0x07; break; case 8 :
kodehex = 0x7f; break; case 9 :
kodehex = 0x6f; break; } return kodehex; }
tugas4b1.c #include #define F_CPU 7372800UL #include int main(void) {
DDRA = 0xFF; PORTA = 0x00; DDRD = (1 <
PORTD = (0 <
tugas4b2.c #include #define F_CPU 7372800UL #include char angka; char kodehex; unsigned int SSegmen(char angka); int main(void) {
DDRA = 0xFF; DDRD = (1 <
1 0
// Keadaan awal PORTD = (0 <
PORTD = (1 <
PORTA = SSegmen('1'); _delay_ms(1); PORTA = SSegmen('1'); _delay_ms(1); } if (bit_is_clear(PIND, 1)) { PORTA = SSegmen('4'); _delay_ms(1); PORTA = SSegmen('4'); _delay_ms(1); }
PORTD = (0 <
unsigned int SSegmen(char angka) { switch (angka) { case '0' :
kodehex = break; case '1' : kodehex = break; case '2' : kodehex = break; case '3' : kodehex = break; case '4' : kodehex = break; case '5' : kodehex = break; case '6' : kodehex = break;
0x3f;
0x06;
0x5b;
0x4f;
0x66;
0x6d;
0x7d;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
11
case '7' : kodehex = 0x07; break; case '8' : kodehex = 0x7f; break; case '9' : kodehex = 0x6f; break; } return kodehex; }
tugas4c1.c //***************************************************************************** // // File Name : 'main.c' // Title : LCD demo // Author : Scienceprog.com - Copyright (C) 2007 // Created : 2007-03-29 // Revised : 2007-08-28 // Version : 1.0 // Target MCU : Atmel AVR series // // This code is distributed under the GNU Public License // which can be found at http://www.gnu.org/licenses/gpl.txt // //***************************************************************************** #include #include #include #include
"lcd_lib.h"
//Strings stored in AVR Flash memory const uint8_t LCDwelcomeln1 [] PROGMEM="AVR LCD DEMO\0" ; const uint8_t LCDprogress [] PROGMEM="Loading...\0"; const uint8_t LCDanimation [] PROGMEM=" LCD animation \0" ; // additional custom LCD characters const uint8_t backslash [8] PROGMEM= {
0b00000000,//back slash 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001, 0b00000000, 0b00000000 };
//delay 1s void delay1s(void) {
uint8_t i; for(i=0;i <100;i++) {
_delay_ms(10); } }
//demonstration of progress bar void progress(void) {
LCDclr(); CopyStringtoLCD(LCDwelcomeln1, 3, 0); delay1s(); LCDclr(); CopyStringtoLCD(LCDprogress, 3, 0); Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
12
for(uint8_t i=0;i <255;i++) { _delay_ms(10); LCDGotoXY(0, 1); LCDprogressBar(i, 255, 16); } }
//demonstration of animation void demoanimation(void) {
LCDclr(); LCDdefinechar(backslash,0); CopyStringtoLCD(LCDanimation, 0, 0); for(uint8_t i=0;i <3;i++) {
LCDGotoXY(8, 1); LCDsendChar(0); delay1s(); LCDGotoXY(8, 1); LCDsendChar('-'); delay1s(); LCDGotoXY(8, 1); LCDsendChar('/'); delay1s(); LCDGotoXY(8, 1); LCDsendChar('|'); delay1s(); LCDGotoXY(8, 1); LCDsendChar(8);//backslash delay1s(); LCDGotoXY(8, 1); LCDsendChar('-'); delay1s(); LCDGotoXY(8, 1); LCDsendChar('/'); delay1s(); LCDGotoXY(8, 1); LCDsendChar('|'); delay1s(); } }
int main(void) {
LCDinit();//init LCD bit, dual line, cursor right LCDclr();//clears LCD while(1)//loop demos {
progress(); delay1s(); demoanimation(); } return 0; }
tugas4c2.c #include #include #include #include
"lcd_lib.h"
// 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++) Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
13
{
_delay_ms(10); } }
int main(void) {
LCDinit(); // initialize LCD bit, dual line, cursor right LCDclr(); // clear LCD DDRA = 0xFF; PORTA = 0x00; DDRD = (1 <
PORTD = (1 <
PORTD = (0 <
LCDclr(); LCDGotoXY(8, 1); LCDsendChar('5'); delay1s(); LCDclr(); }
_delay_ms(50); if (bit_is_clear(PIND, 1)) { LCDclr(); LCDGotoXY(8, 1); LCDsendChar('7'); delay1s(); LCDclr(); } _delay_ms(50); } return 0; }
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
14
tugas4c3.c #include #include #include #include
"lcd_lib.h"
// 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); } }
int main(void) {
LCDinit(); // initialize LCD bit, dual line, cursor right LCDclr(); // clear LCD DDRA = 0xFF; PORTA = 0x00; DDRD = (1 <
PORTD = (1 <
_delay_ms(50); if (bit_is_clear(PIND, 1)) {
//LCDclr(); LCDGotoXY(posisi, 1); LCDsendChar('4'); delay1s(); posisi++; hitung++; //LCDclr(); }
_delay_ms(50); PORTD = (0 <
15
delay1s(); posisi++; hitung++; //LCDclr(); }
_delay_ms(50); if (bit_is_clear(PIND, 1)) {
//LCDclr(); LCDGotoXY(posisi, 1); LCDsendChar('3'); delay1s(); posisi++; hitung++; //LCDclr(); }
_delay_ms(50); if ((hitung%5)==0) {
LCDshiftRight(2); hitung = 1; } } return 0; }
tugas4c4.c #include #include #include #include "lcd_lib.h" //Strings stored in AVR Flash memory const uint8_t LCDawal [] PROGMEM="Percobaan LCD\0"; int main(void) {
static int count = 0; LCDinit();//init LCD bit, dual line, cursor right LCDclr();//clears LCD DDRA=0xFF; PORTA=0x00; DDRD=0x00; PORTD=0x0F; SFIOR=(0 <= 4) {
LCDshiftRight(2); count = 0; }
for (int i = 0x10; i != 0;) { DDRD = i; _delay_ms(1); if (bit_is_clear(PIND,0)) { if (i == 0x10) LCDsendChar('1'); else if (i == 0x20) LCDsendChar('4'); else if (i == 0x40) LCDsendChar('7'); else if (i == 0x80) Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
16
LCDsendChar('*'); _delay_ms(200); count++; } if (bit_is_clear(PIND,1)) { if (i == 0x10) LCDsendChar('2'); else if (i == 0x20) LCDsendChar('5'); else if (i == 0x40) LCDsendChar('8'); else if (i == 0x80) LCDsendChar('0'); _delay_ms(200);
count++; } if (bit_is_clear(PIND,2)) { if (i == 0x10) LCDsendChar('3'); else if (i == 0x20) LCDsendChar('6'); else if (i == 0x40) LCDsendChar('9'); else if (i == 0x80) LCDsendChar('#'); _delay_ms(200);
count++; } if (bit_is_clear(PIND,3)) { if (i == 0x10) LCDsendChar('A'); else if (i == 0x20) LCDsendChar('B'); else if (i == 0x40) LCDsendChar('C'); else if (i == 0x80) LCDsendChar('D'); _delay_ms(200); count++; }
i=(i <<1); } } return 0; }
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
17