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.
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 fungsifungsi untuk menampilkan dalam LCD.

2. STUDI PUSTAKA
2.1

SCANNING SEVEN SEGMENT

Salah satu teknik untuk menggunakan seven


segment adalah teknik scanning. Dengan
menggunakan teknik ini, sejumlah seven
segment dapat dijalankan secara bergantian
dengan frekuensi tertentu. Hal ini akan
menghemat jumlah port.

Gambar 2- 1 Tampilan Seven Segment

2.2

SCANNING KEYPAD

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

2.3

LCD

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.

kemudian menampilkan FF. Yang berkedip


dengan selang waktu 0.5 detik.

3.2

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 TUGAS IV.B.1

3. LANGKAH 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

TUGAS IV.B SCANNING KEYPAD

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.

Lakukan download program yang telah


terdapat pada modul. Lakukan percobaan
masukan melalui keypad 2x2, amati keluaran
pada LED.

3.2.2 TUGAS IV.B.2


Lakukan
modifikasi
sehingga
program
menampilkan keluaran pada seven segment.

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.

TUGAS IV.C.4

Modifikasi
file
main.c
sehingga
LCD
menampilkan keypad 3x3 yang ditekan. Amati
keluaran dari penekanan tombol pada LCD.

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

4. HASIL DAN ANALISIS


4.1

TUGAS IV.A SCANNING SEVEN


SEGMENT
4.1.1 TUGAS IV.A.1

3.1.2 TUGAS IV.A.2


Lakukan modifikasi pada program A.1.
program akan menampilkan 50., 40.,
hingga 10. Masing-masing selama 1 detik,

Pada percobaan ini akan dilakukan scanning


seven segment. Akan ditampilkan digit 7.2
pada dua seven segment. Program yang

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

digunakan terdapat pada lampiran. Berikut


flowchart dari program yang digunakan.

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.

4.1.2 TUGAS IV.A.2


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.

Gambar 4 - 1 Flowchart main Tugas A.1

Gambar 4 - 3 Flowchart main Tugas A.2

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

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

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

menampilkan 50., 40., 30., 20., 10.


Masing-masing selama 1 detik. Kemudian
ditampilkan FF. Yang berkedip dengan
selang waktu 0.5 detik.

4.2

TUGAS IV.B SCANNING KEYPAD


4.2.1 TUGAS IV.B.1

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
modifikasi program yang digunakan terdapat
dalam lampiran. Berikut flowchart yang
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.

Gambar 4- 5 Flowchart main Tugas B.2

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
sesuai dengan yang diharapkan. Jika
ditekan LED bit 0 akan menyala, SW2
menyalakan LED bit 0 dan 1, SW 3
menyalakan LED bit 0, 1, dan 2, dan
akan menyalakan LED bit 0, 1, 2, dan 3.

telah
SW1
akan
akan
SW4

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

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

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

LCDsendCommand,
LCDsendChar

LCDinit, untuk menginisialisasi LCD

LCDclr,
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

LCDshiftLeft, menggeser sejumlah n


karakter ke kiri

LCDcursorOn,
mengaktifkan
kursor dengan underline

LCDcursorOnBlink, mengaktifkan posisi


kursor dengan underline yang berkedip

LCDcursorOFF,
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

untuk

sama

mengosongkan

mematikan

seperti

layar

Gambar 4- 6 Flowchart main C.1

posisi

posisi

Gambar 4- 7 Flowchart delay 1s C.1

4.3.1 TUGAS IV.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

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

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.2 TUGAS IV.C.2


Pada percobaan ini dilakukan modifikasi untuk
menampilkan pada LCD karakter yang ditekan
melalui keypad 2x2. Program hasil modifikasi

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

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.

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 prosedurprosedur di dalamnya.

5. KESIMPULAN
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.

DAFTAR PUSTAKA
[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

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

'0':
'1':
'2':
'3':
'4':
'5':
'6':
'7':
'8':
'9':

kodehex
kodehex
kodehex
kodehex
kodehex
kodehex
kodehex
kodehex
kodehex
kodehex

=
=
=
=
=
=
=
=
=
=

0x3f;
0x06;
0x5b;
0x4f;
0x66;
0x6d;
0x7d;
0x07;
0x7f;
0x6f;

break;
break;
break;
break;
break;
break;
break;
break;
break;
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;
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');
_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 =
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 =

0x3f;
0x06;
0x5b;
0x4f;
0x66;
0x6d;
0x7d;
0x07;
0x7f;
0x6f;

break;}
break;}
break;}
break;}
break;}
break;}
break;}
break;}
break;}
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))
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);
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))
if(bit_is_clear(PIND,1))
PORTD=(0<<PD4)|(1<<PD5);
if(bit_is_clear(PIND,0))
if(bit_is_clear(PIND,1))

}
return 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 =

state = 1;
state = 4;
state = 2;
state = 3;

0x3f;
0x06;
0x5b;
0x4f;
0x66;
0x6d;
0x7d;
0x07;
0x7f;
0x6f;

break;}
break;}
break;}
break;}
break;}
break;}
break;}
break;}
break;}
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
//
//****************************************************************************
*
#include
#include
#include
#include
#include

<avr/io.h>
<avr/pgmspace.h>
<util/delay.h>
"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);
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[]
{
0x00, 0x1F, 0x00, 0x00,
block
0x00, 0x1F, 0x10, 0x10,
block
0x00, 0x1F, 0x18, 0x18,
block
0x00, 0x1F, 0x1C, 0x1C,
block
0x00, 0x1F, 0x1E, 0x1E,
block
0x00, 0x1F, 0x1F, 0x1F,
block
0x03, 0x07, 0x0F, 0x1F,
0x18, 0x1C, 0x1E, 0x1F,
};

PROGMEM=//define 8 custom LCD chars


0x00, 0x00, 0x1F, 0x00, // 0. 0/5 full progress
0x10, 0x10, 0x1F, 0x00, // 1. 1/5 full progress
0x18, 0x18, 0x1F, 0x00, // 2. 2/5 full progress
0x1C, 0x1C, 0x1F, 0x00, // 3. 3/5 full progress
0x1E, 0x1E, 0x1F, 0x00, // 4. 4/5 full progress
0x1F, 0x1F, 0x1F, 0x00, // 5. 5/5 full progress
0x0F, 0x07, 0x03, 0x00, // 6. rewind arrow
0x1E, 0x1C, 0x18, 0x00 // 7. fast-forward arrow

void LCDsendChar(uint8_t ch)


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

//Sends Char to LCD

#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
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----------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)
{
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);
}
}
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
if( ((i*(uint16_t)PROGRESSPIXELS_PER_CHAR)) > pixelprogress
)

}
else
{

// this is an empty block


// use space character?
c = 0;

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

//define MCU pin connected to LCD RS

#define LCD_RW
#define LCD_E
#define LCD_D0
#define LCD_D1
#define LCD_D2
#define LCD_D3
#define LCD_D4
#define LCD_D5
#define LCD_D6
#define LCD_D7
#define LDP PORTC
#define LCP PORTC
#define LDDR DDRC
data pins
#define LCDR DDRC
control pins

1
//define MCU pin connected to LCD R/W
2
//define MCU pin connected to LCD E
0
//define MCU pin connected to LCD D0
1
//define MCU pin connected to LCD D1
2
//define MCU pin connected to LCD D1
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 LCD
//define MCU direction register for port connected to LCD

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