MODUL 4 SEVEN SEGMENT, KEYPAD, DAN LCD Novi Prihatiningrum (13212065) Asisten: Lukman Aji Samudra Samud ra (13211018) Tanggal Percobaan: 22/04/2015 EL3214-Praktikum Sistem Mikroprosesor Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak Beberapa interface yang interface yang umum digunakan sebagai masukan maupun keluaran dalam penggunaan mikrokontroller ATMega8535 ATMega8535 adalah seven segment, keypad, dan LCD. LCD. Dalam percobaan di modul 4 ini akan dipelajari bagaimana menggunakan ketiganya. Kata kunci: seven segment, keypad, LCD, scanning. Gambar 2- 1 Tampilan Seven Segment
1.
PENDAHULUAN
Dalam menggunakan mikrokontroller ATMega 8535, seringkali diperlukan suatu devais untuk menampilkan keluaran maupun memberikan suatu masukan. Untuk itu dapat digunakan devais tambahan seperti seven segment, keypad, dan LCD. Dalam penggunaannya, seven segment dan keypad memerlukan proses scanning untuk menampilkan keluaran maupun membaca masukan. Sementara untuk menggunakan LCD, telah terdapat library yang berisi fungsi-fungsi untuk menampilkan dalam LCD. 2. 2.1
S TUDI PUSTAKA SCANNING SEVEN SEGMENT
Salah satu teknik untuk menggunakan seven teknik Dengan segment adalah scanning. menggunakan teknik ini, sejumlah seven segment dapat dijalankan secara bergantian dengan frekuensi tertentu. Hal ini akan menghemat jumlah port.
2.2
SCANNING K EYPAD EYPAD
Untuk menggunakan keypad , digunakan teknik scanning seperti pada penggunaan seven segment sebelumnya. Pengaturan logika dilakukan secara bergantian untuk mengetahui tombol mana yang sedang ditekan. Keypad 2x2 yang terdapat pada trainer board memiliki pin penerima output dari mikrokontroller KBO1 dan KBO2 yang bersifat active low, dan pin pemberi input pada mikrokontroller KBI1 dan KBI2 yang juga bersifat active low. Untuk menjalankan keypad 2x2, diberikan logika “0” pada KBO1 dan “1” pada KBO2”. Selanjutnya dilakukan pengecekan pada KBI1 dan KBI2 yang mengalami perubahan logika dari “0” menjadi “1” untuk mengetahui tombol mana yang ditekan. Selanjutnya diulangi langkah yang sama dengan memberi logika “1” pada KBO1 dan logika “1” pada KBO2.
Pada percobaan di modul ini akan digunakan dua buah seven segment pada Trainer Board. Untuk menjalankan seven segment 1 dan 2 secara berurutan pin DO1 dan DO2 masing-masing harus diberi logika “0” secara bergantian. Selain itu perlu dilakukan pengaturan segment mana yang akan diaktifkan diaktifkan dengan memberikan logika “1”. Urutan dari MSB ke LSB adalah DP, G, F, D, E, C, B, A.
Gambar 2- 2 Skematik Keypad 2x2
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1
2.3
LCD
3.2
Pada percobaan ini digunakan LCD yang berbasis HD44780 LCD Controller. Penggunaan LCD akan dilakukan dengan menggunakan library dan demo project yang bernama AVR LCD lib. LCD digunakan pada Port C.
TUGAS IV.B – SCANNING K EYPAD EYPAD
Hubungkan PORT A ATMega 8535 dengan PORT OUTPUT pada Trainer Board dan PORT D ATMega 8535 dengan I/P S KEY pada Trainer Board. 3.2.1
3.
L ANGKAH PERCOBAAN
Untuk melakukan percobaan-percobaan pada modul ini digunakan Sismin dengan mikrokontroller ATMega 8535. Untuk interface digunakan Trainer Board yang sudah memiliki keypad, seven segment, dan LCD. Sebagai sumber daya digunakan power supply 9 V. Untuk melakukan pemrograman digunakan usbasp. Sebagai persiapan, hal berikut dilakukan: Buka Programmer Notepad, lalu buat New Project. Kemudian masukkan script program. Lalu simpan dan add files tersebut pada project. Setelah itu, buka Mfile untuk membuat Makefile guna melakukan compiling dari script yang telah dibuat. Pada Mfile, diatur jenis Mikrokontroller yang digunakan yaitu ATMega8535, jenis programmer yaitu usbasp, port programmer yang digunakan yaitu com1, dan Clock Frequency dari osilator yang digunakan yaitu 7,378 MHz. Setelah script dan Mfile selesai dibuat, kembali ke Programmer Notepad, lakukan Make All untuk meng-compile program. Apabila berhasil, lakukan download program untuk memasukkan program ke mikrokontroller. 3.1
Lakukan download program yang telah terdapat pada modul. Lakukan percobaan masukan melalui keypad 2x2, amati keluaran pada LED. 3.2.2
3.1.1
3.3
TUGAS IV.C – LCD
Hubungkan PORT C ATMega 8535 dengan PORT LCD dan PORT D ATMega 8535 dengan I/P SKEY pada Trainer Board. 3.3.1
TUGAS IV.C.1
Adaptasi makefile dan jalankan avrlcd.pnproj pada AVR LCD Lib Demo. Amati keluaran pada LCD 3.3.2
TUGAS IV.C.2
Jalankan main.c yang telah dimodifikasi pada modul. Amati keluaran dari penekanan tombol pada LCD. 3.3.3
TUGAS IV.C.3
Modifikasi file main.c sehingga LCD menampilkan keypad 2x2 yang ditekan. Amati keluaran dari penekanan tombol pada LCD. 3.3.1
TUGAS IV.C.4
Modifikasi file main.c sehingga LCD menampilkan keypad 3x3 yang ditekan. Amati keluaran dari penekanan tombol pada LCD.
TUGAS IV.A.1
Lakukan download program yang telah terdapat pada modul. Amati keluaran pada seven segment. Program yang dibuat akan menampilkan “7.2” pada seven segment. 3.1.2
TUGAS IV.B.2
Lakukan modifikasi sehingga program menampilkan keluaran pada seven segment.
TUGAS IV.A – – SCANNING SEVEN SEGMENT
Hubungkan PORT A ATMega8535 dengan DATA 7S pada Trainer Board dan PORT D ATMega 8535 dengan I/P S KEY pada Trainer Board.
TUGAS IV.B.1
4. 4.1
H ASIL DAN A NALISIS NALISIS TUGAS IV.A – – SCANNING SEVEN SEGMENT 4.1.1
TUGAS IV.A.2
Lakukan modifikasi pada program A.1. program akan menampilkan “50.”, “40.”, hingga “10.” Masing-masing selama 1 detik, kemudian menampilkan “FF.” Yang berkedip dengan selang waktu 0.5 detik.
TUGAS IV.A.1
Pada percobaan ini akan dilakukan scanning seven segment. Akan ditampilkan digit 7.2 pada dua seven segment. Program yang digunakan terdapat pada lampiran. Berikut flowchart dari program yang digunakan.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
2
4.1.2 start
Pada percobaan ini dilakukan modifikasi dari tugas A.1. program diinginkan menampilkan “50.” selama 1 detik, kemudian “40.” selama satu detik, dan begitu seterrusnya hingga menampilkan “10.” Setelah itu program akan menampilkan “F.F.” yang berkedip-kedip 3x dengan selang waktu setengah detik lalu padam. Untuk itu dibuat program dengan menggunakan timer1. Timer1 digunakan untuk menghitung waktu satu detik dan setengah detik. Hasil modifikasi program yang digunakan terdapat dalam lampiran. Berikut flowchart dari program yang dimodifikasi.
DDRA = 0xFF DDRD = 0xFF
PORTD = (0<
TUGAS IV.A.2
Delay 1 ms
start
PORTD = (1<
i=1;i<=3;i++
DDRA=0xFF DDRD=0xFF TIMSK|=(1<
TIFR|=(0<
Delay 1ms
PORTD=(1<
OCR1AH=0x1c OCR1AL=0x20
OCR1AH=0x1e OCR1AL=0x10
TIFR|=(0<
Delay 1ms Delay 1ms
TIFR|=(0<
PORTD=(1<
OCF1A=0
Delay 1ms
PORTD=(1<
Delay 1 ms
Delay 1ms
TIFR|=(0<
Delay 1ms
Delay 1ms
OCF1A=0
PORTD=(1<
Gambar 4 - 1 Flowchart main Tugas A.1
OCF1A=0
Delay 1ms TIFR|=(0<
Kodehex = 0x3f
OCF1A=0
Delay 1ms
Kodehex = 0x06
PORTD=(1<
Delay 1ms
Kodehex = 0x56 OCF1A=0
TIFR|=(0<
Delay 1ms
PORTD=(1<
Delay 1ms
Kodehex = 0x4f
OCF1A=0
start
angka
Kodehex = 0x66
end
Kodehex = 0x6d
Gambar 4 - 3 Flowchart main Tugas A.2
Kodehex = 0x7d
Untuk menghitung waktu satu detik dan setengah detik digunakan timer 1 dengan compare match. Untuk waktu 1 detik digunakan OCR1A = 0x1C20. Untuk waktu 0.5 detik digunakan OCR1A = 0x0E10. Scanning seven segmen untuk menampilkan suatu digit dilakukan berulang hingga flag compare match OCF1A diaktifkan yang menunjukkan waktu 1 detik. Setelah waktu 1 detik, lanjut ditampilkan digit selanjutnya pada seven segment.
Kodehex = 0x07 Kodehex = 0x7f Kodehex = 0x6d
Gambar 4 - 2 Flowchart SSegmen Tugas A.1
Dari flowchart di atas terlihat bahwa program memiliki bagian main dan sebuah fungsi SSegmen. Fungsi Ssegmen digunakan untuk mengatur segmen mana yang diaktifkan saat suatu karakter akan ditampilkan. Dalam hal ini hanya karakter angka yang dibuat yaitu 0-9. Penambahan karakter titik pada seven segment dilakukan dengan operasi OR dengan operan (1<<7). Program utama yang dibuat melakukan scanning pada kedua seven segment secara bergantian dengan periode 2 detik, terlihat dari jeda 1 detik tiap proses scanning. Kemudian dilakukan penampilan digit “7.” pada seven segment pertama dan “2” pada seven segment kedua. Hasil yang diperoleh dari percobaan ini telah sesuai yaitu ditampilkannya “7.2” pada seven segment.
Selain penambahan timer1, modifikasi juga dilakukan pada fungsi Ssegmen. Sebelumnya seven segment hanya menampilkan angka saja. Modifikasi dilakukan dengan menambah digit hruf “F” karena diperlukan dalam percobaan ini. Hasil dari percobaan ini telah sesuai dengan yang diharapkan. Seven segment menampilkan “50.”, “40.”, “30.”, “20.”, “10.” Masing-masing selama 1 detik. Kemudian ditampilkan “FF.” Yang berkedip dengan selang waktu 0.5 detik.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
3
4.2
TUGAS IV.B – SCANNING K EYPAD 4.2.1
Hasil modifikasi program yang digunakan terdapat dalam lampiran. Berikut flowchart yang digunakan dalam program hasil modifikasi.
TUGAS IV.B.1
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<
PORTD=(1<
PORTD=(0<
PIND0=0
PIND0=0
no
no
yes
yes PORTA=0b1
PORTA=0b1
Delay 50 ms
Delay 50 ms
no PIND1=0 yes
PIND1=0 no yes
PORTA=0b1
PORTA=0b1
Delay 50 ms
Delay 50 ms
Gambar 4- 5 Flowchart main Tugas B.2
Modifikasi dilakukan dengan mengubah keluaran yang tadinya melalui LED PORTA, menjadi keluaran dalam seven segment. Untuk itu, dilakukan kembali proses secanning seven segment setelah pengecekan tombol dilakukan.
Gambar 4 - 4 Flowchart main Tugas B.1
Dari flowchart di atas terlihat bahwa proses scanning yang dilakukan sesuai dengan teori. Scanning dilakukan dengan bergantian mengeluarkan logika “0” untuk mengecek keypad yang ditekan. Hasil yang diperoleh dari percobaan ini telah sesuai dengan yang diharapkan. 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. 4.2.2
TUGAS IV.B.2
Pada percobaan ini akan dilakukan modifikasi terhadap program dari percobaan B.1. modifikasi dilakukan dengan menampilkan keluaran hasil penekanan keypad pada seven segment. Jika SW 1 ditekan seven segment akan menampilkan “11”, jika SW 2 ditekan seven segment akan menampilkan “22”, jika SW 3 ditekan seven segment akan menampilkan “33”, dan jika SW 4 ditekan seven segment akan menampilkan “44”.
Hasil yang diperoleh telah sesuai dengan hasil yang diharapkan. Jika SW 1 ditekan seven segment akan menampilkan “11”, jika SW 2 ditekan seven segment akan menampilkan “22”, jika SW 3 ditekan seven segment akan menampilkan “33”, dan jika SW 4 ditekan seven segment akan menampilkan “44”. 4.3
TUGAS IV.C – LCD
Pada percobaan ini akan digunakan library AVR LCD Lib untuk menggunakan fasilitas LCD. Dalam library ini telah terdapat beberapa fngsi dan prosedur yang dapat digunakan untuk menjalankan LCD. Berikut prosedur yang ada dalam library ini. -
LCDsendChar, karakter
untuk
menampilkan
-
LCDsendCommand, LCDsendChar
-
LCDinit, untuk menginisialisasi LCD
sama
seperti
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
4
-
LCDclr, untuk mengosongkan layar LCD
-
LCDhome, untuk menggeser cursor ke home
-
LCDstring, untuk menampilkan string pada layar
-
LCDGotoXY, untuk menggeser kursor ke posisi yang diinginkan
-
CopyStringtoLCD, pada LCD
-
LCDdefinechar, untuk menulis sebuah char ke LCD CGRAM
-
LCDshiftRight, menggeser karakter ke kanan
sejumlah n
-
LCDshiftLeft, menggeser karakter ke kiri
sejumlah
-
LCDcursorOn, mengaktifkan posisi kursor dengan underline
-
LCDcursorOnBlink, mengaktifkan posisi kursor dengan underline yang berkedip
-
LCDcursorOFF, mematikan posisi cursor
-
LCDblank, tidak menampilkan apapun pada LCD, namun tidak membersihkan yang sebelumnya ada
-
LCDvisible, menampilkan LCD
-
LCDCursorLeft, menggeser kursor LCD ke kiri sejumlah n karakter
-
LCDCursorRight, menggeser kursor LCD ke kanan sejumlah n karakter 4.3.1
menampilkan
string
Gambar 4- 6 Flowchart main C.1
n
TUGAS IV.C.1
Gambar 4- 7 Flowchart delay 1s C.1
Library AVR LCD Lib telah memberikan sebuah main file untuk mendemokan penggunaan LCD. Pada percobaan ini akan dijalankan demo file tersebut. Program yang digunakan terdapat dalam lampiran. Berikut flowchart dari program yang digunakan.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
5
ada pada modul terdapat dalam lampiran. Berikut flowchart dari program yang digunakan.
Gambar 4- 8 Flowchart progressbar C.1 Gambar 4- 10 Flowchart main C.2
Hasil dari percobaan ini ditampilkan dalam LCD. Jika SW1 ditekan akan ditampilkan “&”, jika SW2 ditekan akan ditampilkan “7”, jika SW3 ditekan akan ditampilkan “5”, jika SW4 ditekan akan ditampilkan “a”. 4.3.3
TUGAS IV.C.3
Pada percobaan ini dilakukan modifikasi untuk menampilkan pada LCD karakter yang ditekan melalui keypad 2x2. Program hasil modifikasi terdapat dalam lampiran. Berikut flowchart dari program yang digunakan.
Gambar 4- 9 Flowchart demoanimation
Hasil dari percobaan ini merupakan tampilan pada LCD yang menampilkan judul, kemudian melakukan proses loading. 4.3.2
Hasil dari percobaan ini ditampilkan dalam LCD. Jika SW1 ditekan akan ditampilkan “1”, jika SW2 ditekan akan ditampilkan “2”, jika SW3 ditekan akan ditampilkan “3”, jika SW4 ditekan akan ditampilkan “4”. Jumlah karakter yang ditampilkan hanya 3 karakter, setelah terdapat tiga karakter, dilakukan penggeserean ke kiri 2 karakter. 4.3.4
TUGAS IV.C.2
Pada percobaan ini dilakukan modifikasi untuk menampilkan pada LCD karakter yang ditekan melalui keypad 2x2. Program hasil modifikasi yang
TUGAS IV.C.4
Pada percobaan ini dilakukan modifikasi untuk menampilkan pada LCD karakter yang ditekan melalui keypad 4x4. Program hasil modifikasi terdapat dalam lampiran. Modifikasi dilakukan
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
6
dengan menambah jumlah scanning karena kali ini terdapat 4x4 tombol. Terdapat empat pin sebagai output yang akan diberi logika “0” secara bergantian, dan terdapat empat pin yang akan dicek apakah memiliki logika “0” Hasil yang diperoleh belum sesuai yang diharapkan. Hal ini karena konfigurasi pin dari keypad 4x4 yang belum diketahui. Pengecekan berhasil dilakukan untuk 2 baris yangberisi digit 1, 2, 3, a, 4, 5, 6, b. Namun masih terjadi kesalahan karena jika tombol 1 ditekan yang ditampilkan adalah 4, dan jika tombol 4 ditekan yang ditampilkan adalah 7. 5.
K ESIMPULAN
-
Untuk menghemat penggunaan port pada mikrokontroller ATMega, dalam proses pembacaan masukan maupun menampilkan keluaran digunakan sebuah teknik scanning. Dnegan teknik ini, scanning dilakukan secara bergantian untuk setiap komponen sehingga jumlah pin yang digunakan hanya sedikit.
-
Untuk menggunakan LCD, telah tersedia library yang dapat langsung digunakan beserta dnegan prosedur-prosedur di dalamnya.
D AFTAR PUSTAKA
Dari percobaan-percobaan yang telah dilakukan pada modul ini diperoleh kesimpulan bahwa -
Sebagai interface untuk memberikan masukan ke mikrokontroller ATMega 8535 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]
Datasheet ATMega8535
[2]
Hutabarat, Mervin T., Petunjuk Praktikum Sistem Mikroprosesor , Laboratorium Dasar Teknik Elekto, Bandung, 2015.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
7
LAMPIRAN
1. Tugas A.1 #include
#define F_CPU 7372800L #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 case '1': kodehex case '2': kodehex case '3': kodehex case '4': kodehex case '5': kodehex case '6': kodehex case '7': kodehex case '8': kodehex case '9': kodehex } return kodehex;
= = = = = = = = = =
0x3f; 0x06; 0x5b; 0x4f; 0x66; 0x6d; 0x7d; 0x07; 0x7f; 0x6f;
break; break; break; break; break; break; break; break; break; break;
}
2. Tugas A.2 #include #include char angka; char kodehex; unsigned int SSegmen(char angka); int main (void) {
char i; DDRA = 0xFF; DDRD = 0xFF; TIMSK |= (1 <
8
TCNT1L = 0; //penentuan nilai compare untuk delay 1 detik OCR1AH = 0x1C; OCR1AL = 0x20; while(1) { do{
TIFR|=(0 <
TIFR|=(0 <
TIFR|=(0 <
TIFR|=(0 <
TIFR|=(0 <
TIFR|=(0 <
9
_delay_ms(1); PORTD =(1 <
TIFR|=(0 <
unsigned int SSegmen(char angka) { switch (angka) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'F': } return kodehex;
{kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex
= = = = = = = = = = =
0x3f; 0x06; 0x5b; 0x4f; 0x66; 0x6d; 0x7d; 0x07; 0x7f; 0x6f; 0x71;
break;} break;} break;} break;} break;} break;} break;} break;} break;} break;} break;}
}
3. Tugas B.1 #include #define F_CPU 7372800UL #include int main (void) {
DDRA=0xFF; PORTA=0x00; DDRD=(1 <
PORTD=(1 <
1 0
PORTA=0b00000011; _delay_ms(50); if(bit_is_clear (PIND,1)) PORTA=0b00000111; _delay_ms(50); } return 0; }
4. Tugas B.2 #include #include char angka, kodehex; unsigned int SSegmen(char angka); int main (void) {
char state = 0; DDRA=0xFF; PORTA=0x00; DDRD=(1 <
PORTD =(0 <
11
PORTA =SSegmen('3'); _delay_ms(1); break; } case 4 : {
PORTD =(0 <
PORTD=(1 <
= 1; = 4; = 2; = 3;
} return 0; }
unsigned int SSegmen(char angka) { switch (angka) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'F': } return kodehex;
{kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex {kodehex
= = = = = = = = = = =
0x3f; 0x06; 0x5b; 0x4f; 0x66; 0x6d; 0x7d; 0x07; 0x7f; 0x6f; 0x71;
break;} break;} break;} break;} break;} break;} break;} break;} break;} break;} break;}
}
5.
Library AVR LCD : main.c LCD demo //*********************************************************************** ****** // // 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 // //*********************************************************************** ****** Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
12
#include #include #include #include #include
"lcd_lib.h" "lcd_lib.c"
//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); 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); Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
13
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; }
6.
Library AVR LCD : lcd_lib.c //*********************************************************************** ****** // // File Name : 'lcd_lib.c' // Title : 8 and 4 bit LCd interface // Author : Scienceprog.com - Copyright (C) 2007 // Created : 2007-03-29 // Revised : 2007-08-08 // 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 "lcd_lib.h" #include #include #include #include const uint8_t LcdCustomChar[] PROGMEM=//define 8 custom LCD chars {
0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, // 0. 0/5 full Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
14
progress block 0x00, 0x1F, progress block 0x00, 0x1F, progress block 0x00, 0x1F, progress block 0x00, 0x1F, progress block 0x00, 0x1F, progress block 0x03, 0x07, 0x18, 0x1C, arrow
0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, // 1. 1/5 full 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, // 2. 2/5 full 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x00, // 3. 3/5 full 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x00, // 4. 4/5 full 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, // 5. 5/5 full 0x0F, 0x1F, 0x0F, 0x07, 0x03, 0x00, // 6. rewind arrow 0x1E, 0x1F, 0x1E, 0x1C, 0x18, 0x00 // 7. fast-forward
};
void LCDsendChar(uint8_t ch)
//Sends Char to LCD
{
#ifdef LCD_4bit //4 bit part LDP=(ch&0b11110000); LCP|=1 <
void LCDsendCommand(uint8_t cmd)
//Sends Command to LCD
{
#ifdef LCD_4bit //4 bit part LDP=(cmd&0b11110000); LCP|=1 <
15
LDP=cmd; LCP|=1 <
void LCDinit(void)//Initializes LCD {
#ifdef LCD_4bit //4 bit part _delay_ms(15); LDP=0x00; LCP=0x00; LDDR|=1 <
LCDdefinechar((LcdCustomChar+ch),chn++); ch=ch+8; }
#else //8 bit part _delay_ms(15); LDP=0x00; LCP=0x00; LDDR|=1 <
16
LDP=0 <
LCDdefinechar((LcdCustomChar+ch),chn++); ch=ch+8; }
#endif }
void LCDclr(void)
//Clears LCD
{
LCDsendCommand (1 <
void LCDhome(void)
//LCD cursor home
{
LCDsendCommand (1 <
void LCDstring(uint8_t* data, uint8_t nBytes)
//Outputs string to LCD
{
register uint8_t i; // check to make sure we have a good pointer if (!data) return; // print data for(i=0; 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) Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
17
{ case 0: DDRAMAddr = LCD_LINE0_DDRAMADDR+x; break; case 1: DDRAMAddr = LCD_LINE1_DDRAMADDR+x; break; case 2: DDRAMAddr = LCD_LINE2_DDRAMADDR+x; break; case 3: DDRAMAddr = LCD_LINE3_DDRAMADDR+x; break; default: DDRAMAddr = LCD_LINE0_DDRAMADDR+x; }
// set data address LCDsendCommand (1 <
//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); } }
void LCDshiftLeft(uint8_t n)
//Scrol n of characters Right
{ for (uint8_t i=0;i
void LCDshiftRight(uint8_t n) //Scrol n of characters Left { for (uint8_t i=0;i
18
void LCDcursorOn(void) //displays LCD cursor {
LCDsendCommand (0x0E); }
void LCDcursorOnBlink(void)
//displays LCD blinking cursor
{
LCDsendCommand (0x0F); }
void LCDcursorOFF(void) //turns OFF cursor {
LCDsendCommand (0x0C); }
void LCDblank(void)
//blanks LCD
{
LCDsendCommand (0x08); }
void LCDvisible(void)
//Shows LCD
{
LCDsendCommand (0x0C); }
void LCDcursorLeft(uint8_t n) //Moves cursor by n poisitions left { for (uint8_t i=0;i
void LCDcursorRight(uint8_t n)
//Moves cursor by n poisitions left
{ for (uint8_t i=0;i
//adapted fro mAVRLIB void LCDprogressBar(uint8_t progress, uint8_t maxprogress, uint8_t length) {
uint8_t i; uint16_t pixelprogress; uint8_t c; // // // // //
draw a progress bar displaying (progress / maxprogress) starting from the current cursor position with a total length of "length" characters ***note, LCD chars 0-5 must be programmed as the bar characters char 0 = empty ... char 5 = full
// total pixel length of bargraph equals length*PROGRESSPIXELS_PER_CHAR; // pixel length of bar itself is pixelprogress = ((progress*(length*PROGRESSPIXELS_PER_CHAR ))/maxprogress); // print exactly "length" characters for(i=0; i
// check if this is a full block, or partial or empty // (u16) cast is needed to avoid sign comparison warning if( ((i*(uint16_t)PROGRESSPIXELS_PER_CHAR )+5) > pixelprogress ) {
// this is a partial or empty block Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
19
if( ((i*(uint16_t)PROGRESSPIXELS_PER_CHAR )) >
pixelprogress ) {
// this is an empty block // use space character? c = 0; } else {
// this is a partial block c = pixelprogress % PROGRESSPIXELS_PER_CHAR; } } else {
// this is a full block c = 5; }
// write character to display LCDsendChar(c); } }
7.
Library AVR LCD : lcd_lib.h //*********************************************************************** ****** // // File Name : 'lcd_lib.h' // Title : 8 and 4 bit LCd interface // Author : Scienceprog.com - Copyright (C) 2007 // Created : 2007-03-29 // Revised : 2007-08-08 // 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 // //*********************************************************************** ****** #ifndef LCD_LIB #define LCD_LIB #include
//Uncomment this if LCD 4 bit interface is used //****************************************** #define LCD_4bit //*********************************************** #define #define #define #define #define #define
LCD_RS LCD_RW LCD_E LCD_D0 LCD_D1 LCD_D2
0 1 2 0 1 2
//define //define //define //define //define //define
MCU MCU MCU MCU MCU MCU
pin pin pin pin pin pin
connected connected connected connected connected connected
to to to to to to
LCD LCD LCD LCD LCD LCD
RS R/W E D0 D1 D1
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
2 0
#define LCD_D3 #define LCD_D4 #define LCD_D5 #define LCD_D6 #define LCD_D7 #define LDP PORTC #define LCP PORTC #define LDDR DDRC LCD data pins #define LCDR DDRC LCD control pins
3 //define MCU pin connected to LCD D2 4 //define MCU pin connected to LCD D3 5 //define MCU pin connected to LCD D4 6 //define MCU pin connected to LCD D5 7 //define MCU pin connected to LCD D6 //define MCU port connected to LCD data pins //define MCU port connected to LCD control pins //define MCU direction register for port connected to //define MCU direction register for port connected to
#define LCD_CLR 0 //DB0: clear display #define LCD_HOME 1 //DB1: return to home position #define LCD_ENTRY_MODE 2 //DB2: set entry mode #define LCD_ENTRY_INC 1 //DB1: increment #define LCD_ENTRY_SHIFT 0 //DB2: shift #define LCD_ON_CTRL 3 //DB3: turn lcd/cursor on #define LCD_ON_DISPLAY 2 //DB2: turn display on #define LCD_ON_CURSOR 1 //DB1: turn cursor on #define LCD_ON_BLINK 0 //DB0: blinking cursor #define LCD_MOVE 4 //DB4: move cursor/display #define LCD_MOVE_DISP 3 //DB3: move display (0-> move cursor) #define LCD_MOVE_RIGHT 2 //DB2: move right (0-> left) #define LCD_FUNCTION 5 //DB5: function set #define LCD_FUNCTION_8BIT 4 //DB4: set 8BIT mode (0->4BIT mode) #define LCD_FUNCTION_2LINES 3 //DB3: two lines (0->one line) #define LCD_FUNCTION_10DOTS 2 //DB2: 5x10 font (0->5x7 font) #define LCD_CGRAM 6 //DB6: set CG RAM address #define LCD_DDRAM 7 //DB7: set DD RAM address // reading: #define LCD_BUSY 7 //DB7: LCD is busy #define LCD_LINES 2 //visible lines #define LCD_LINE_LENGTH 16 //line length (in characters) // cursor position to DDRAM mapping #define LCD_LINE0_DDRAMADDR 0x00 #define LCD_LINE1_DDRAMADDR 0x40 #define LCD_LINE2_DDRAMADDR 0x14 #define LCD_LINE3_DDRAMADDR 0x54 // progress bar defines #define PROGRESSPIXELS_PER_CHAR 6
void LCDsendChar(uint8_t); //forms data ready to send to 74HC164 void LCDsendCommand(uint8_t); //forms data ready to send to 74HC164 void LCDinit(void); //Initializes LCD void LCDclr(void); //Clears LCD void LCDhome(void); //LCD cursor home void LCDstring(uint8_t*, uint8_t); //Outputs string to LCD void LCDGotoXY(uint8_t, uint8_t); //Cursor to X Y position void CopyStringtoLCD(const uint8_t*, uint8_t, uint8_t);//copies flash string to LCD at x,y void LCDdefinechar(const uint8_t *,uint8_t);//write char to LCD CGRAM void LCDshiftRight(uint8_t); //shift by n characters Right void LCDshiftLeft(uint8_t); //shift by n characters Left void LCDcursorOn(void); //Underline cursor ON void LCDcursorOnBlink(void); //Underline blinking cursor ON void LCDcursorOFF(void); //Cursor OFF void LCDblank(void); //LCD blank but not cleared void LCDvisible(void); //LCD visible void LCDcursorLeft(uint8_t); //Shift cursor left by n void LCDcursorRight(uint8_t); //shif cursor right by n // displays a horizontal progress bar at the current cursor location Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
21
//