Anda di halaman 1dari 28

MODUL 4 SEVEN SEGMENT, KEYPAD, DAN LCD

Novi Prihatiningrum (13212065)


Asisten: Lukman Aji Samudra (13211018)
Tanggal Percobaan: 22/04/2015
EL3214-Praktikum Sistem Mikroprosesor
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

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.

Kata kunci: seven segment, keypad, LCD, scanning.


Gambar 2- 1 Tampilan Seven Segment
1. PENDAHULUAN
2.2 SCANNING KEYPAD
Dalam menggunakan mikrokontroller ATMega
8535, seringkali diperlukan suatu devais untuk Untuk menggunakan keypad, digunakan teknik
menampilkan keluaran maupun memberikan scanning seperti pada penggunaan seven segment
suatu masukan. Untuk itu dapat digunakan devais sebelumnya. Pengaturan logika dilakukan secara
tambahan seperti seven segment, keypad, dan LCD. bergantian untuk mengetahui tombol mana yang
Dalam penggunaannya, seven segment dan keypad sedang ditekan. Keypad 2x2 yang terdapat pada
memerlukan proses scanning untuk menampilkan trainer board memiliki pin penerima output dari
keluaran maupun membaca masukan. Sementara mikrokontroller KBO1 dan KBO2 yang bersifat
untuk menggunakan LCD, telah terdapat library active low, dan pin pemberi input pada
yang berisi fungsi-fungsi untuk menampilkan mikrokontroller KBI1 dan KBI2 yang juga bersifat
dalam LCD. active low.
Untuk menjalankan keypad 2x2, diberikan logika “0”
2. STUDI PUSTAKA pada KBO1 dan “1” pada KBO2”. Selanjutnya
dilakukan pengecekan pada KBI1 dan KBI2 yang
2.1 SCANNING SEVEN SEGMENT mengalami perubahan logika dari “0” menjadi “1”
Salah satu teknik untuk menggunakan seven untuk mengetahui tombol mana yang ditekan.
segment adalah teknik scanning. Dengan Selanjutnya diulangi langkah yang sama dengan
menggunakan teknik ini, sejumlah seven segment memberi logika “1” pada KBO1 dan logika “1”
dapat dijalankan secara bergantian dengan pada KBO2.
frekuensi tertentu. Hal ini akan menghemat jumlah
port.
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 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 TUGAS IV.B – SCANNING KEYPAD
Pada percobaan ini digunakan LCD yang berbasis Hubungkan PORT A ATMega 8535 dengan PORT
HD44780 LCD Controller. Penggunaan LCD akan OUTPUT pada Trainer Board dan PORT D
dilakukan dengan menggunakan library dan demo ATMega 8535 dengan I/P S KEY pada Trainer
project yang bernama AVR LCD lib. LCD Board.
digunakan pada Port C.
3.2.1 TUGAS IV.B.1
Lakukan download program yang telah terdapat
3. LANGKAH PERCOBAAN pada modul. Lakukan percobaan masukan melalui
keypad 2x2, amati keluaran pada LED.
Untuk melakukan percobaan-percobaan pada
modul ini digunakan Sismin dengan
3.2.2 TUGAS IV.B.2
mikrokontroller ATMega 8535. Untuk interface
digunakan Trainer Board yang sudah memiliki Lakukan modifikasi sehingga program
keypad, seven segment, dan LCD. Sebagai sumber menampilkan keluaran pada seven segment.
daya digunakan power supply 9 V. Untuk
melakukan pemrograman digunakan usbasp. 3.3 TUGAS IV.C – LCD
Sebagai persiapan, hal berikut dilakukan: Hubungkan PORT C ATMega 8535 dengan PORT
LCD dan PORT D ATMega 8535 dengan I/P SKEY
Buka Programmer Notepad, lalu buat New Project.
pada Trainer Board.
Kemudian masukkan script program. Lalu simpan
dan add files tersebut pada project. 3.3.1 TUGAS IV.C.1
Setelah itu, buka Mfile untuk membuat Makefile
Adaptasi makefile dan jalankan avrlcd.pnproj pada
guna melakukan compiling dari script yang telah AVR LCD Lib Demo. Amati keluaran pada LCD
dibuat. Pada Mfile, diatur jenis Mikrokontroller
yang digunakan yaitu ATMega8535, jenis 3.3.2 TUGAS IV.C.2
programmer yaitu usbasp, port programmer yang
digunakan yaitu com1, dan Clock Frequency dari Jalankan main.c yang telah dimodifikasi pada
osilator yang digunakan yaitu 7,378 MHz. modul. Amati keluaran dari penekanan tombol
pada LCD.
Setelah script dan Mfile selesai dibuat, kembali ke
Programmer Notepad, lakukan Make All untuk 3.3.3 TUGAS IV.C.3
meng-compile program. Apabila berhasil, lakukan
download program untuk memasukkan program Modifikasi file main.c sehingga LCD menampilkan
ke mikrokontroller. keypad 2x2 yang ditekan. Amati keluaran dari
penekanan tombol pada LCD.
3.1 TUGAS IV.A – SCANNING SEVEN
SEGMENT 3.3.1 TUGAS IV.C.4
Hubungkan PORT A ATMega8535 dengan DATA Modifikasi file main.c sehingga LCD menampilkan
7S pada Trainer Board dan PORT D ATMega 8535 keypad 3x3 yang ditekan. Amati keluaran dari
dengan I/P S KEY pada Trainer Board. penekanan tombol pada LCD.

3.1.1 TUGAS IV.A.1


Lakukan download program yang telah terdapat 4. HASIL DAN ANALISIS
pada modul. Amati keluaran pada seven segment.
Program yang dibuat akan menampilkan “7.2” 4.1 TUGAS IV.A – SCANNING SEVEN
pada seven segment. SEGMENT

3.1.2 TUGAS IV.A.2 4.1.1 TUGAS IV.A.1


Lakukan modifikasi pada program A.1. program Pada percobaan ini akan dilakukan scanning seven
akan menampilkan “50.”, “40.”, hingga “10.” segment. Akan ditampilkan digit 7.2 pada dua
Masing-masing selama 1 detik, kemudian seven segment. Program yang digunakan terdapat
menampilkan “FF.” Yang berkedip dengan selang pada lampiran. Berikut flowchart dari program
waktu 0.5 detik. yang digunakan.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


4.1.2 TUGAS IV.A.2
start
Pada percobaan ini dilakukan modifikasi dari
tugas A.1. program diinginkan menampilkan “50.”
selama 1 detik, kemudian “40.” selama satu detik,
DDRA = 0xFF dan begitu seterrusnya hingga menampilkan “10.”
DDRD = 0xFF
Setelah itu program akan menampilkan “F.F.”
yang berkedip-kedip 3x dengan selang waktu
setengah detik lalu padam. Untuk itu dibuat
PORTD = (0<<PD7)|(1<<PD6) program dengan menggunakan timer1. Timer1
PORTA = Ssegmen( 7 )|(1<<7)
digunakan untuk menghitung waktu satu detik
dan setengah detik. Hasil modifikasi program yang
digunakan terdapat dalam lampiran. Berikut
Delay 1 ms flowchart dari program yang dimodifikasi.
start
i=1;i<=3;i++
TIFR|=(0<<OCF1A)
DDRA=0xFF PORTD=(0<<PD7)|(1<<PD6)
PORTA=Ssegmen( 3 ) OCR1AH=0x1e
DDRD=0xFF
OCR1AL=0x10
TIMSK|=(1<<TOIE1)
TCCR1A=0
TCCR1B=0 Delay 1 ms
TIFR|=(0<<OCF1A)
TCNT1H=0
PORTD = (1<<PD7)|(0<<PD6) TCNT1L=0
PORTD=(1<<PD7)|(0<<PD6)
PORTD=(0<<PD7)|(1<<PD6)
PORTA=Ssegmen( 1 )
PORTA=Ssegmen( 0 )|(1<<7)
PORTA = Ssegmen( 2 ) OCR1AH=0x1c
OCR1AL=0x20 Delay 1 ms
Delay 1 ms
TIFR|=(0<<OCF1A)
PORTD=(1<<PD7)|(0<<PD6)
PORTD=(0<<PD7)|(1<<PD6)
PORTA=Ssegmen( 0 )|(1<<7)
PORTA=Ssegmen( 5 ) OCF1A=0

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)

Gambar 4 - 1 Flowchart main Tugas A.1 Delay 1 ms


TIFR|=(0<<OCF1A)
PORTD=(0<<PD7)|(1<<PD6)
PORTA=Ssegmen( 4 )
OCF1A=0
Kodehex = 0x3f
Delay 1 ms
TIFR|=(0<<OCF1A)
PORTD=(0<<PD7)|(1<<PD6)
Kodehex = 0x06 PORTD=(1<<PD7)|(0<<PD6)
PORTA=Ssegmen( 0 )|(1<<7)
PORTA=Ssegmen( 1 )

Delay 1 ms
Delay 1 ms

Kodehex = 0x56 PORTD=(1<<PD7)|(0<<PD6)


OCF1A=0 PORTA=Ssegmen( 0 )|(1<<7)

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”.

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, menampilkan string
pada LCD
- LCDdefinechar, untuk menulis sebuah
char ke LCD CGRAM
- LCDshiftRight, menggeser sejumlah n
karakter ke kanan
Gambar 4- 6 Flowchart main C.1
- LCDshiftLeft, menggeser sejumlah n
karakter ke kiri
- 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 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.

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
Gambar 4- 9 Flowchart demoanimation ditampilkan “4”. Jumlah karakter yang
ditampilkan hanya 3 karakter, setelah terdapat tiga
Hasil dari percobaan ini merupakan tampilan pada karakter, dilakukan penggeserean ke kiri 2
LCD yang menampilkan judul, kemudian karakter.
melakukan proses loading.
4.3.4 TUGAS IV.C.4
4.3.2 TUGAS IV.C.2
Pada percobaan ini dilakukan modifikasi untuk
Pada percobaan ini dilakukan modifikasi untuk menampilkan pada LCD karakter yang ditekan
menampilkan pada LCD karakter yang ditekan melalui keypad 4x4. Program hasil modifikasi
melalui keypad 2x2. Program hasil modifikasi yang terdapat dalam lampiran. Modifikasi dilakukan
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 6
dengan menambah jumlah scanning karena kali ini - Untuk menghemat penggunaan port pada
terdapat 4x4 tombol. Terdapat empat pin sebagai mikrokontroller ATMega, dalam proses
output yang akan diberi logika “0” secara pembacaan masukan maupun
bergantian, dan terdapat empat pin yang akan menampilkan keluaran digunakan sebuah
dicek apakah memiliki logika “0” teknik scanning. Dnegan teknik ini,
scanning dilakukan secara bergantian
Hasil yang diperoleh belum sesuai yang
untuk setiap komponen sehingga jumlah
diharapkan. Hal ini karena konfigurasi pin dari
pin yang digunakan hanya sedikit.
keypad 4x4 yang belum diketahui. Pengecekan
berhasil dilakukan untuk 2 baris yangberisi digit 1, - Untuk menggunakan LCD, telah tersedia
2, 3, a, 4, 5, 6, b. Namun masih terjadi kesalahan library yang dapat langsung digunakan
karena jika tombol 1 ditekan yang ditampilkan beserta dnegan prosedur-prosedur di
adalah 4, dan jika tombol 4 ditekan yang dalamnya.
ditampilkan adalah 7.

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.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 7


LAMPIRAN

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;
}

unsigned int SSegmen(char 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; 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;
}

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');

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 9


_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('F')|(1<<7);
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
do{
TIFR|=(0<<OCF1A);
PORTD =(0<<PD7)|(1<<PD6);
PORTA = 0x00;
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA = 0x00;
_delay_ms(1);
}while(bit_is_clear(TIFR,OCF1A));
}
}
return 0;

unsigned int SSegmen(char 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; 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;}
case 'F': {kodehex = 0x71; break;}
}
return kodehex;
}

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))

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 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 <avr/io.h>
#include <util/delay.h>

char angka, kodehex;

unsigned int SSegmen(char angka);

int main (void)


{
char state = 0;
DDRA=0xFF;
PORTA=0x00;
DDRD=(1<<PD4)|(1<<PD5);
SFIOR=(0<<PUD);
while(1)
{
switch(state)
{
case 0 : {
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('0');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('0');
_delay_ms(1);
break;
}
case 1 : {
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('1');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('1');
_delay_ms(1);
break;
}
case 2 : {
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('2');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('2');
_delay_ms(1);
break;
}
case 3 : {
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('3');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 11


PORTA =SSegmen('3');
_delay_ms(1);
break;
}
case 4 : {
PORTD =(0<<PD7)|(1<<PD6);
PORTA =SSegmen('4');
_delay_ms(1);
PORTD =(1<<PD7)|(0<<PD6);
PORTA =SSegmen('4');
_delay_ms(1);
break;
}
}
PORTD=(1<<PD4)|(0<<PD5);
if(bit_is_clear(PIND,0)) state = 1;
if(bit_is_clear(PIND,1)) state = 4;
PORTD=(0<<PD4)|(1<<PD5);
if(bit_is_clear(PIND,0)) state = 2;
if(bit_is_clear(PIND,1)) state = 3;
}
return 0;
}

unsigned int SSegmen(char 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; 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;}
case 'F': {kodehex = 0x71; break;}
}
return kodehex;
}

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 <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 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 <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

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, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, // 1. 1/5 full
progress block
0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, // 2. 2/5 full
progress block
0x00, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x00, // 3. 3/5 full
progress block
0x00, 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1F, 0x00, // 4. 4/5 full
progress block
0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, // 5. 5/5 full
progress block
0x03, 0x07, 0x0F, 0x1F, 0x0F, 0x07, 0x03, 0x00, // 6. rewind arrow
0x18, 0x1C, 0x1E, 0x1F, 0x1E, 0x1C, 0x18, 0x00 // 7. fast-forward
arrow
};

void LCDsendChar(uint8_t ch) //Sends Char to LCD


{

#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

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 15


LDP=cmd;
LCP|=1<<LCD_E;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
#endif
}
void LCDinit(void)//Initializes LCD
{
#ifdef LCD_4bit
//4 bit part
_delay_ms(15);
LDP=0x00;
LCP=0x00;
LDDR|=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4;
LCDR|=1<<LCD_E|1<<LCD_RW|1<<LCD_RS;
//---------one------
LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4; //4 bit mode
LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
//-----------two-----------
LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4; //4 bit mode
LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
//-------three-------------
LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|0<<LCD_D4; //4 bit mode
LCP|=1<<LCD_E|0<<LCD_RW|0<<LCD_RS;
_delay_ms(1);
LCP&=~(1<<LCD_E);
_delay_ms(1);
//--------4 bit--dual line---------------
LCDsendCommand(0b00101000);
//-----increment address, invisible cursor shift------
LCDsendCommand(0b00001100);
//init 8 custom chars
uint8_t ch=0, chn=0;
while(ch<64)
{
LCDdefinechar((LcdCustomChar+ch),chn++);
ch=ch+8;
}

#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-----------

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 16


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);
//-------three-------------
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);
//--------8 bit dual line----------
LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4|1<<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);
//-----increment address, invisible cursor shift------
LDP=0<<LCD_D7|0<<LCD_D6|0<<LCD_D5|0<<LCD_D4|1<<LCD_D3
|1<<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(5);
//init custom chars
uint8_t ch=0, chn=0;
while(ch<64)
{
LCDdefinechar((LcdCustomChar+ch),chn++);
ch=ch+8;
}

#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;

// check to make sure we have a good pointer


if (!data) return;

// 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)

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<<LCD_DDRAM | DDRAMAddr);

}
//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<n;i++)
{
LCDsendCommand(0x1E);
}
}
void LCDshiftRight(uint8_t n) //Scrol n of characters Left
{
for (uint8_t i=0;i<n;i++)
{
LCDsendCommand(0x18);
}
}

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 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<n;i++)
{
LCDsendCommand(0x10);
}
}
void LCDcursorRight(uint8_t n) //Moves cursor by n poisitions left
{
for (uint8_t i=0;i<n;i++)
{
LCDsendCommand(0x14);
}
}
//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<length; 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 <inttypes.h>

//Uncomment this if LCD 4 bit interface is used


//******************************************
#define LCD_4bit
//***********************************************

#define LCD_RS 0 //define MCU pin connected to LCD RS


#define LCD_RW 1 //define MCU pin connected to LCD R/W
#define LCD_E 2 //define MCU pin connected to LCD E
#define LCD_D0 0 //define MCU pin connected to LCD D0
#define LCD_D1 1 //define MCU pin connected to LCD D1
#define LCD_D2 2 //define MCU pin connected to LCD D1

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


0
#define LCD_D3 3 //define MCU pin connected to LCD D2
#define LCD_D4 4 //define MCU pin connected to LCD D3
#define LCD_D5 5 //define MCU pin connected to LCD D4
#define LCD_D6 6 //define MCU pin connected to LCD D5
#define LCD_D7 7 //define MCU pin connected to LCD D6
#define LDP PORTC //define MCU port connected to LCD data pins
#define LCP PORTC //define MCU port connected to LCD control pins
#define LDDR DDRC //define MCU direction register for port connected to
LCD data pins
#define LCDR DDRC //define MCU direction register for port connected to
LCD control pins

#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


// <progress> is the value the bargraph should indicate
// <maxprogress> is the value at the end of the bargraph
// <length> is the number of LCD characters that the bargraph should
cover
//adapted from AVRLIB - displays progress only for 8 bit variables
void LCDprogressBar(uint8_t progress, uint8_t maxprogress, uint8_t
length);

#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();

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


2
LCDGotoXY(8, 1);
LCDsendChar('a');
delay1s();
LCDclr();
}
_delay_ms(50);
PORTD =(0<<PD4)|(1<<PD5);
if(bit_is_clear(PIND,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;
}

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();

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


3
while(1)//loop demos
{

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;
}

10. Tugas C.4


#include <avr/io.h>
#include <avr/pgmspace.h>

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


4
#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();

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++;

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


5
LCDsendChar('3');
delay1s();

}
_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();

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


6
}
_delay_ms(50);

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();

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


7
_delay_ms(50);
if(bit_is_clear(PIND,1))
{
if(counter%2==1 && counter!=1)
{
LCDshiftRight(2);
}
counter++;
LCDsendChar('0');
delay1s();
}
_delay_ms(50);
if(bit_is_clear(PIND,2))
{
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;
}

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


8