Embedtronix Build Your Embedded System

Tampilkan postingan dengan label Tutorial. Tampilkan semua postingan
Tampilkan postingan dengan label Tutorial. Tampilkan semua postingan
Led DOT matriks sebuah display yang tersusun dari lampu led sejumlah baris dan kolom. Susunan led ini dapat diatur penyalaannya sehingga bisa membuat tampilan sesuai yang kita harapkan, misalnya menampilkan angka / huruf. Untuk menghidupkan led ke (x,y) dibutuhkan kombinasi tegangan antara pin baris dan kolom.

Kombinasi susunan pin baris dan kolom pada dot matriks bisa dilihat pada data sheet yang tersedia sesuai seri dari dot matriks itu sendiri. Namun sebelum kita melihat data sheet, kita cari tahu dulu mana pin nomor 1 – 16 (Di sini saya menggunakan contoh Dot Matriks 8 x 8 seri BS). Untuk mengidentifikasi nomor pin, bisa dilihat dari tanda seri, tanda ini berarti bahwa pin 1 berada di kaki ujung kiri pada bagian yang bertanda / seri. Lihat gambar :



Jika sudah mengetahui nomor pin 1 – 16, kita lihat susunan displaynya (dapat dilihat di data sheet).




Terlihat pada gambar di atas, yang mana kolom (C1-C8) dan baris (R1 – R8). Kombinasi penyalaannya adalah dengan memberi tegangan ke anode dan ground ke katode pada masing-masing kaki led. Bagaimana susunan anode – katodenya bisa dilihat pada gambar berikut :




Kesimpulan pada gambar diatas, untuk menyalakan led baris pertama – kolom pertama adlah : ketika pin 9 diberi tegangan positif dan pin 13 diberi tegangan negatif. Maka led (C1, R1) akan menyala seperti terlihat pada gambar :





Itu adalah cara untuk menyalakan 1 led. Untuk selanjutnya, jika ingin membuat bentuk huruf / angka, kita tinggal memberikan logika 1 untuk anoda dan 0 untuk katoda yang ingin dinyalakan, misal untuk huruf A.





Untuk penyalaan seperti di atas, bisa dilakukan secara manual dengan memberi masing-masing logika tegangan dan ground. Namun untuk mempermudah penggantian logika, kita menggunakan proses scanning.


Apa itu scanning akan dibahas di tutorial selanjutnya tentang mikrokontroller.
LCD karakter yang paling umum digunakan adalah LCD yang berbasis HD44780 controller dari Hitachi atau produsen lainnya yang kompatibel dengan HD44580. Dalam tutorial ini, kita akan membahas tentang LCD berbasis karakter, interfacing LCD dengan mikrokontroler, interfacing LCD sistem 8-bit dan 4-bit serta pemrogramannya.
Untuk Spesifikasi dan kontroler HD44780 informasi teknis bisa dilihat disini
Konfigurasi Pin
LCD paling umum digunakan dan ditemukan di pasaran saat ini adalah 1 Line, 2 Line atau 4 Line LCD yang hanya memiliki 1 controller dan sebagian besar mendukungan 80 karakter, sedangkan LCD mendukung lebih dari 80 karakter menggunakan 2 controller HD44780.
 LCD-pinout
Gambar 1 : diagram pin LCD tipe HD44780

No.
Nama Pin
Deskripsi
1 GND 0V
2 VCC +5V
3 VEE Kontras LCD
4 RS Register Select
5 R/W 1 = Read ; 0 = Write
6 EN Enable LCD, 1=enable
7 D0 Data Bus 0
8 D1 Data Bus 1
9 D2 Data Bus 2
10 D3 Data Bus 3
11 D4 Data Bus 4
12 D5 Data Bus 5
13 D6 Data Bus 6
14 D7 Data Bus 7
15 Anoda Anoda Backlight LED
16 Katoda Katoda Backlight LED
Tabel 1 : Konfigurasi Pin LCD
DDRAM - Display Data RAM
Display Data RAM (DDRAM) menyimpan data LCD yang direpresentasikan dalam 8-bit kode karakter, kapasitasnya adalah 80 x 8bit, atau 80 karakter. DDRAM merupakan tempat untuk menyimpan  data yang akan ditampilkan pada LCD. Walaupun kapasitasnya sampai 80 karakter, tapi untuk LCD seperti 1x16, hanya 16 karakter yang terlihat.
Gambar berikut menunjukkan alamat DDRAM dari 1 Line, 2 Line dan 4 Line LCD.
clip_image001
Gambar 2a : Alamat DDRAM untuk LCD 1 baris
clip_image001[9]Gambar 2b : Alamat DDRAM untuk LCD 2 baris
clip_image001[11]Gambar 2c : Alamat DDRAM untuk LCD 4 baris
Misalnya kita menuliskan karakter ‘A’ (41hex) pada alamat 00, maka huruf ‘A’ tersebut akan ditampilkan pada baris pertama kolom pertama pada LCD, tapi jika karakter ‘A’ itu disimpan di alamat 40, maka huruf ‘A’ akan ditampilkan pada baris kedua kolom pertama pada LCD.

CGROM - Character generator ROM
Ketika kita mengirimkan suatu nilai ASCII ke DDRAM, lalu bagaimana karakter ini bisa ditampilkan pada LCD? jawabannya adalah dengan CGROM. Character generator ROM ini menyimpan 5 x 8 dot atau 5 x 10 dot pola karakter dari kode karakter 8-bit (lihat Gambar 3 dan Gambar 4 untuk lebih rinci). Dengan demikian, maka CGROM dapat menghasilkan sebanyak 208 pola karakter 5x8 dot dan 32 pola karakter 5x10 dot.
cgrom1
Gambar 3 : Code Map LCD characters 5x8 dots

cgrom2
Gambar 4 : Code Map LCD characters 5x10 dots
Misalnya kita mengirimkan kode 0010-0011b (23h) ke DDRAM LCD maka karakter atau patteren ‘#’ akan ditampilkan pada LCD.
CGRAM – Character Generator RAM
CGRAM merupakan memori untuk menyimpan pola sebuah karakter yang bentuknya dapat dibuat sendiri sesuai keinginan. Namun memori ini akan hilang saat power supply tidak aktif, sehingga pola karakter pun akan turut hilang.
Selanjutnya akan dibahas mengenai Busy Flag, Register dan Instruction Set…

image_thumb14

Tampilan tujuh segmen dinamakan demikian karena terdiri dari tujuh segmen yang berbeda yang dapat diaktifkan atau dimatikan. Kombinasi yang berbeda dari segmen ini diaktifkan menghasilkan angka yang berbeda.

Tujuh segmen disusun dalam bentuk persegi panjang terdiri dari dua segmen vertikal pada setiap sisi dengan satu segmen horisontal di tengah, atas, dan bawah. Selain itu, segmen ketujuh membagi dua persegi panjang horizontal. Ada juga konfigurasi empat belas-segmen yang menampilkan enam belas-segmen (untuk menampilkan alphanumeric) dan konfigurasi lain berupa kumpulan titik-titik segmen dengan susunan 5 kolom x 8 baris yang disebut dengan dot-matrix display.

Setiap segmen diberi nama dengan huruf mulai dari segmen A, B, C sampai dengan segmen G. Ditambah sebuah segmen opsional (‘segmen kedelapan’) berupa sebuah titik (Dot Point – DP) di sebelah kanan bawah yang bisa berfungsi sebagai titik desimal pada saat menampilkan nomor non-integer.

image_thumb3

Tampilan tujuh segmen (7-segment LED display) adalah tampilan yang terdiri dari 7 LED yang diposisikan dalam bentuk angka 8. Dengan cara menyalakan atau mematikan LED (segmen) yang sesuai sedemikian rupa sehingga bisa menampilkan angka 0 sampai 9 serta beberapa huruf lainnya. image_thumb8Sebagai contoh jika Anda ingin menampilkan angka 3, maka segmen yang akan 'on' adalah {a, b, c, d, g} sedangkan sisanya adalah 'off'. Pada dasarnya 7 segmen ini adalah tujuh buah lampu LED (Light Emiting Diode) yang semua pin anoda atau katodanya tersambung pada sebuah titik yang disebut common.

Common Anode dan Common Cathode

Ada dua konfigurasi umum tampilan 7 segmen ini, yaitu Common Anode dan Common Cathode. Jika semua anoda dari LED terhubung dengan anoda – anoda LED lain pada satu titik, konfigurasi ini disebut Common-Anode. Konfigurasi lain adalah kebalikannya, yaitu semua katoda dihubungkan pada suatu titik, konfigurasi ini disebut Common-Cathode.

image_thumb2 Gambar Konfigurasi 7segmen

Untuk mode common anode, maka untuk menyalakan 7-segmen harus aktif low (logika 0) atau dengan memberikan tegangan mendekati GND pada segment yang yang akan dinyalakan dan pin common dihubungkan dengan tegangan positif. sementara untuk mode common cathode, berarti tampilan 7 segmen adalah aktif high (logika 1) yaitu dengan memberikan tegangan mendekati VCC pada segmen yang akan dinyalakan dan pin common dihubungkan dengan tegangan negatif (GND).

Animasi berikut adalah contoh tampilan dari 7 segmen yang menampilkan sepuluh angka desimal dan enam heksadesimal ‘huruf digit’ (A-F). Perhatikan variasi antara huruf besar dan huruf kecil untuk A-F, hal ini dilakukan agar tidak terjadi ambigu untuk setiap huruf, karena jika tidak, maka tampilan huruf D akan terlihat identik dengan angka 0 (atau mungkin juga sama dengan huruf O) dan tampilan B akan terlihat identik dengan angka 8.

Tampilan 7 segmen menampilkan angka 0-9 dan A - F

Untuk menampilkan angka dan huruf pada 7 segmen cukup dengan mengkonfigurasi satu byte hexa. Urutan kode segmennya bisa abcdefg atau bisa juga dibalik menjadi gfedcba. Modenya bisa active-high maupun active-low tergantung konfigurasi 7 segmen yang digunakan.

Tabel Contoh pengkodean heksadesimal untuk menampilkan angka 0 sampai 9 pada 7 segmen Common Anode :

Digit .gfedcba abcdefg. a b c d e f g .
0 0xC0 0x03 on on on on on on off off
1 0xF9 0x9F off on on off off off off off
2 0xA4 0x2A on on off on on off on off
3 0xB0 0x0D on on on on off off on off
4 0x99 0x99 off on on off off on on off
5 0x92 0x49 on off on on off on on off
6 0x82 0x41 on off on on on on on off
7 0xF8 0x1F on on on off off off off off
8 0x80 0x01 on on on on on on on off
9 0x90 0x09 on on on on off on on off

Common Cathode :

Digit .gfedcba abcdefg. a b c d e f g .
0 0x3F 0x4C on on on on on on off off
1 0x06 0x60 off on on off off off off off
2 0x5B 0xDA on on off on on off on off
3 0x5F 0xFA on on on on off off on off
4 0x66 0x66 off on on off off on on off
5 0x6D 0xB6 on off on on off on on off
6 0x7D 0xBE on off on on on on on off
7 0x07 0xE0 on on on off off off off off
8 0x7F 0xFE on on on on on on on off
9 0x6F 0xF6 on on on on off on on off
 

Untuk common anode, karena aktif low, maka on=0, off=1 sementra untuk common cathode, karena aktif high, maka on=1, off=0. Nilai hexa pada tabel diatas adalah untuk segmen DP yang tidak dinyalakan, sementara jika segmen DP akan dinyalakan, maka nilainya harus diubah menjadi ON.

 

Interfacing dengan MCU

image_thumb7

Konfigurasi Pin 7 Segmen

Untuk menghubungkan 7 segmen dengan mikrokontroler dibutuhkan 7 pin MCU untuk mengontrol setiap segmen (8 pin jika DP ikut dikontrol), jadi cukup dengan menggunakan 1 port untuk mengontrol sebuah tampilan 7 segmen. image

Gambar Interfacing 7 segmen dengan mikrokontroler

Contoh skema diatas adalah menghubungkan sebuah 7 segmen dengan mikrokontoler melalui PORTA, dengan urutan PA=segmenA, PB=segmenB …dst sementara segment DP dihubungkan ke PA7 (berhubung komponen simulasi 7segmen dari Proteus tidak menyertakan DP, maka segmen DP digantikan dengan sebuah indikator LED). 

Contoh aplikasi 7 segemen pada Sasakala Board bisa dilihat pada posting Aplikasi 7-segmen  pada Sasakala-M32

 

Refferensi :

http://extremeelectronics.co.in/category/avr-tutorials/

http://www.play-hookey.com/digital/experiments/seven_seg_led.html

Digital Input / Output (Digital IO) adalah komponen yang paling mendasar dari sebuah MCU (Main Control Unit) yang menghubungkan mikrokontroler dengan dunia luar. Antarmuka dengan dunia luar tersebut dikenal dengan istilah PORT. Port adalah titik di mana data internal dari chip MCU keluar atau data eksternal berjalan masuk. Port terdiri dari beberapa PIN, Port pada mikrokontroler biasanya diberi nama PortA, PORTB, PORTC, PORTD dan sebagainya. Contoh konfigurasi pin dari MCU ATmege16 ditunjukkan pada gambar berikut :image

Gambar Konfigurasi pin MCU ATmega16

Setiap MCU AVR memiliki beberapa port IO bernama PORTA, PORTB, PORTC dll. Kita dapat mengetahui lokasi fisik port tersebut dengan melihat konfigurasi pin pada gambar diatas. Misalnya bit 0 Port C berada pada PIN 22 dari IC.

Setiap port terdiri dari 8 bit register, misalnya PORTA terdiri dari PA0, PA1, PA2…PA7.  Setiap pin bisa di set ‘1’ (high) atau ‘0‘ (low) secara terpisah, tapi bisa juga dengan cara memberikan nilai pada port tersebut, misalnya PORTB diberi nilai F3h (hexa) atau 11110111 dalam biner, itu berarti semua pin pada port B diset ‘high’ kecuali pin PB3 yang diset ‘low’.

Pin di set ‘1’ (high) berarti tegangan pada pin tersebut mendekati VCC (+5V) dan bila di set ‘0‘ (low) berarti tegangan pada pin tersebut mendekati GND (0V). Port memiliki batasan arus, sehingga tidak disarankan untuk menghubungkan pin ini dengan perangkat (komponen) lain yang memerlukan arus cukup tinggi.

Digial IO bisa digunakan untuk menyalakan LED misalnya, atau men-drive sebuah transistor untuk keperluan pengontrolan dengan arus yang lebih tinggi. Digital IO bisa juga digunakan untuk membaca data dari luar (sebagai input), misalnya untuk membaca status tombol, switch atau membaca data dari keypad.

 

Port sebagai Input dan Output

Secara keseluruhan, setiap port memiliki tiga register:


  • PORT - untuk menentukan nilai input / output dari bus.
  • PIN - untuk membaca input pada bus atau mengeluarkan output dari bus.
  • DDR - untuk pengaturan arah bus.

Data Direction Register (DDR) merupakan register yang berfungsi untuk mengatur arah data dari PORT. Bit-bit dalam register ini juga mengatur arah data PIN secara individu. Arah untuk setiap PIN dapat menjadi input atau output. Pin PORT dijadikan input bila ingin membaca data misalnya dari saklar (switch) atau sensor. Sementra PORT dijadikan output ketika ingin menggunakannya untuk membuat LED berkedip atau mengontrol sebuah motor.

Jadi, untuk mengatur port sebagai input atau output, register DDR inilah yang mengaturnya. Nilai bit ‘1’ menandai port sebagai output dan ‘0’ sebagai input.

 

Fungsi tambahan

Selain berfungsi sebagai digital IO, beberapa pin juga memiliki fungsi alternatif. Misalnya PB6, selain sebagai PIN 6 dari PORTB, juga sebagai MISO untuk keperluan SPI. PA0 selain sebagai PIN 0 dari PORTA, juga sebagai input ADC 0 dan lainnya.

 

Periperal

MCU AVR memiliki beberapa built-in hardware yang disebut peripheral. Periperal merupakan perangkat tambahan yang disertakan dalam sebuah MCU untuk mendukung beberapa fungsi khusus misalnya :

  • USART untuk komunikasi serial dengan PC dan perangkat lain. Misalnya mengontrol sebuah lengan robot melalaui PC lewat port serial. Komunikasi serial ini hanya menggunakan 3 kabel.
  • ADC – Analog to Digital Convertion, berfungsi untuk mengubah data analog menjadi data digital. Misalnya untuk membaca nilai suhu atau jumlah cahaya yang jatuh pada sensor.
  • SPI - Serial Peripheral interface. Digunakan untuk komunikasi serial antara perangkat digital (misalnya EEPROMs, Data Flash, LDC modul dll)

 

Mengakses Digital IO dalam bahasa C

Seperti telah dijelaskan sebelumnya, setiap PORT dalam AVR memiliki tiga Registers terkait, yaitu PORT, DDR dan PIN. Misalnya untuk PORTD sebagai contoh, untuk membuat PIND-0 (PD0) sebagai output, maka instruksinya adalah sebagai berikut :

//set PD0 sebagai output

DDRD=0b00000001;



perintah diatas maksudnya adalah menjadikan PD0 sebagai output dan PD1…PD7 dibiarkan sebagai input.



Secara default semua pin port IO adalah input yaitu '0 '



Digital Output



Setelah mengatur arah pin untuk output, berikutnya kita bisa memberikan nilai pada register yang hasilnya akan terlihat pada pin tersebut. Contoh kode program :



//membuat PD0 ‘high’
PORTD=0b00000001;

//tunggu beberapa saat …
_delayms(500);

//ubah PD0 menjadi ‘low’
PORTD=0b00000000;



pada program diatas, pertama pin PD0 diset high (1), lalu dibiarkan beberapa saat, kemudian diset kembali menjadi low (0).



Contoh Aplikasi Digital Output



image Gambar Contoh Aplikasi Digital Output



Pada aplikasi A, untuk menyalakan LED caranya adalah dengan memberikan nilai low (0) pada PD2, sementara pada aplikasi B, untuk menyalakan LED adalah dengan memberikan nilai high (1). Jadi untuk aplikasi A, mode LED tersebut dalam adalah active low dan pada aplikasi B, mode LED nya adalah active-high.



Digital Input



Bila PIN di-set sebagai input, maka statusnya bisa dibaca melalui nilai register. Misalnya PD2 dihubungkan dengan sebuah tombol (push button) seperti gambar berikut :



image



Gambar Aplikasi Tombol Push-Button sebagai Digital Input



karena default dari port adalah sebagai input, jadi DDR tidak perlu inisialisasi. Untuk membaca status tombol, caranya adalah dengan membaca status dari PIND2 tersebut. Pin ini akan menjadi '0' ketika tombol ditekan dan '1' jika dilepas. Contoh kode programnya adalah sebagai berikut :



...
if (PIND & 0b00000100)
{
... //rutin jika tombol tidak ditekan
}
else
{
... //rutin jika tombol ditekan
}
...


Contoh kode program Digital Input Output



Contoh kode program untuk membuat PB0 - PB3 sebagai input dan PB4 - PB7 output, kemudian mengatur PB5 di-set high dan membaca nilai dari PB0 - PB3 ke variabel. Kode program dalam bahasa C untuk aplikasi tersebut adalah sebagai :



#include <avr/io.h>  
int main()
{
unsigned char x;
DDRB = 0xF0; //pin 0-3 sebagai input, pin 4-7 sebagai output
PORTB |= (1 << PIN5); //set pin ke-5 menjadi high
x = PINB & 0x0F; //membaca data dari input 0-3
}
//Catatan :
//alternatif instruksi yang sama dengan
//instruksi PORTB |= (1 << PIN5); adalah PORTB |= 0x20;



Dalam contoh diatas, input digunakan dalam mode Hi-Z (high impedance). Mode ini mungkin diperlukan jika pin digunakan sebagai data bus. Disarankan untuk menggunakan sebuah resistor pull-up pada input jika pin digunakan untuk tombol, switch atau input lain, dimana input dihubungkan ke ground.



Untuk itu, bit output dari pin yang bersangkutan harus di set high dalam mode input, resistor pull-up ditempatkan antara tegangan suplai dan input, yang menjaga tegangan input yang tinggi (kecuali aplikasi yang memerlukan pull-down). Tujuan dari sebuah resistor pull-up adalah untuk mencegah input mengambang karena listrik statis atau gangguan lainnya. (Lihat gambar Aplikasi Tombol Push-Button sebagai Digital Input)



Setelah proses booting, semua bus IO berada dalam mode input high impedance secara default.




Selamat Belajar !



Reff:



http://www.extremeelectronics.co.in/avrtutorials/



http://home.roboticlab.eu/en/avr

BF – Busy Flag

Busy Flag merupakan indikator status untuk LCD. Ketika kita mengirim perintah atau data ke LCD untuk diproses, flag ini akan diset (yaitu BF = 1) dan segera setelah instruksi berhasil dieksekusi flag ini akan dihapus (BF = 0). Hal ini membantu dalam menghitung delay untuk LCD.
Untuk membaca Busy Flag, kondisi RS = 0 dan R / W = 1 dan MSB dari data bus LCD (D7) bertindak sebagai busy flag. Ketika BF=1 berarti LCD sibuk dan tidak akan menerima perintah atau data berikutnya dan ketika BF=0 berarti LCD siap untuk perintah atau data selanjutnya untuk diproses.

Register
HD44780, mempunyai dua buah Register yang aksesnya diatur dengan menggunakan pin RS.

  • Pada saat RS berlogika 1, maka register yang diakses adalah Data Register
  • Pada saat RS berlogika 0, maka register yang diakses adalah Instruction Register

Data Register (DR)

Data register digunakan untuk menyimpan data yang akan ditampilkan pada LCD. Data Register tidak hanya digunakan untuk mengirim data ke DDRAM tetapi juga untuk CGRAM. Alamat di mana kita ingin mengirim data ditentukan oleh instruksi yang dikirimkan ke LCD.

Instruction Register (IR)
Instruction Register berfungsi untuk mengirimkan perintah ke LCD misalnya perintah shift LCD, clear LCD, dan address LCD.

Proses penulisan data ke Instruction Register dapat dilakukan dengan 2 mode, yaitu mode 4 bit interface atau 8 bit interface.

 

image

Gambar 5 : Timing diagram Penulisan Data ke Instruction Register Interface Mode 4 bit

Gambar diatas menunjukkan proses penulisan data ke Instruction Register dengan menggunakan mode 4 bit interface. Kondisi RS berlogika 0 menunjukkan akses data ke Instruction Register. RW berlogika 0 yang menunjukkan proses penulisan data akan dilakukan. Nibble tinggi (bit 7 sampai bit 4) terlebih dahulu dikirimkan dengan diawali pulsa logika 1 pada E Clock. Kemudian Nibble rendah (bit 3 sampai bit 0) dikirimkan dengan diawali pulsa logika 1 pada E Clock lagi.
Untuk mode 8 bit interface, proses penulisan dapat langsung dilakukan secara 8 bit (bit 7 … bit 0) dan diawali sebuah pulsa logika 1 pada EN Clock.

Proses pembacaan data pada Instruction Register biasa digunakan untuk melihat status busy dari LCD atau membaca Address Counter. RS diatur pada logika 0 untuk akses ke Instruction Register, R/W diatur pada logika 1 yang menunjukkan proses pembacaan data. 4 bit nibble tinggi dibaca dengan diawali pulsa logika 1 pada EN Clock dan kemudian 4 bit nibble rendah dibaca dengan diawali pulsa logika 1 pada EN Clock. Untuk Mode 8 bit interface, pembacaan 8 bit (nibble tinggi dan rendah) dilakukan sekaligus dengan diawali sebuah pulsa logika 1 pada EN Clock.

Instruction Set

Perintah selengkapnya untuk proses dan pengaturan LCD bisa dililat pada tabel berikut:

LCD-commands Tabel 2: Perintah dan Instruction set untuk LCD tipe HD44780

Di bawah ini adalah daftar singkat dari Instruksi yang sering digunakan pada saat  pemograman LCD.

No.

Instruction

Hex

Decimal

1

Function Set: 8-bit, 1 Line, 5x7 Dots

0x30

48

2

Function Set: 8-bit, 2 Line, 5x7 Dots

0x38

56

3

Function Set: 4-bit, 1 Line, 5x7 Dots

0x20

32

4

Function Set: 4-bit, 2 Line, 5x7 Dots

0x28

40

5

Entry Mode

0x06

6

6

Display off Cursor off
(clearing display without clearing DDRAM content)

0x08

8

7

Display on Cursor on

0x0E

14

8

Display on Cursor off

0x0C

12

9

Display on Cursor blinking

0x0F

15

10

Shift entire display left

0x18

24

12

Shift entire display right

0x1C

30

13

Move cursor left by one character

0x10

16

14

Move cursor right by one character

0x14

20

15

Clear Display (also clear DDRAM content)

0x01

1

16

Set DDRAM address or coursor position on display

0x80+add*

128+add*

17

Set CGRAM address or set pointer to CGRAM location

0x40+add**

64+add**

Table 3 : Kumpulan Instruksi untuk LCD

* Alamat DDRAM, lihat gambar 2a, 2b dan 2c pada postingan sebelumnya 
** Alamat CGRAM dari 0x00 sampai 0x3F, 0x00 sampai 0x07 untuk karakter-1 danselanjutnya...

Pada bagian berikutnya dari tutorial ini, kita akan membahas mengenai proses Inisialisasi dengan beberapa contoh program.

Dalam banyak aplikasi, seringkali diperlukan penggunaan tombol (key / button) sebagai media untuk meng-input-kan data angka maupun huruf. Secara interfacing, sederhananya bisa saja semua tombol itu hubungkan secara langsung satu persatu pada pin GPIO dari mikro, namun karena keterbatasan pin yang ada, maka diperlukan sebuah teknik untuk mengatasi masalah keterbatasan pin tersebut namun tetap dapat mengakomodir keperluan untuk memasukan data secara lengkap.

Untuk media input data numerik yang menggunakan 10 hingga 16 buah tombol bisa dilakukan dengan mengunakan teknik Multiplex Matrix Keypad. Tombol – tombol tersebut disusun sedemikian rupa membentuk sebuah matrik sehingga untuk semua tombol tersebut bisa dikontrol hanya dengan mengunakan 7-8 pin saja. 

Berikut contoh susunan matriknya :Keypad-3x4

Skema Keypad Matrix 3x4Keypad-4x4 Skema Keypad Matrix 4x4 

Dengan teknik matrik diatas, maka kita bisa menghemat penggunaaan pin mikro, karena misalnya untuk matrix 4x4 (16 buah tombol) hanya diperlukan 8 pin saja untuk interfacing-nya.

Cara kerjanya cukup sederhana, misalnya ketika tombol S1 ditekan, maka COL1 dan ROW1 akan terhubung, jika S5 yang ditekan, maka COL2 dan ROW2 (matrix 3x4) atau COL1 dan ROW2 (matrix 4x4) akan terhubung. demikian seterusnya untuk tombol lainnya

 

Scanning Matrix Keypad

Ada beberapa teknik untuk membaca data dari matrix keypad tersebut, salah satunya adalah dengan teknik scanning, dimana baris atau kolom selalu dipindai untuk mendeteksi tombol yang ditekan. Caranya yaitu dengan memberikan status ‘0’ (low) pada pin COL secara bergantian, lalu pin ROW dideteksi apakah ada salah satunya yang berkondisi ‘0’ (low).

Untuk contoh penggunaan matrix 3x4, pertama COL1 diberi logika ‘0’, kemudian status ROW dibaca apakah statusnya ‘1’ (high) semua atau ada salah satu yang low.

Keypad-3x4_col1

Jika ROW1 yang Low berarti tombol S1 yang di tekan, jika ROW2 yang Low, berarti tombol S4 yang ditekan, jika High semua, berarti tidak ada tombol yang ditekan dalam kolom ini, scanning dilanjutkan ke kolom berikutnya.

Keypad-3x4_col2

Sekarang COL2 yang diberi logika ‘0’ (low). Jika ROW1 yang Low berarti tombol S2 yang di tekan, jika ROW2 yang Low, berarti tombol S5 yang ditekan, jika High semua, berarti tidak ada tombol yang ditekan dalam kolom ini. Demikian selanjutnya untuk COL3.

Tabel status scanning keypad 3x4

COL1

COL2

COL3

ROW1

ROW2

ROW3

ROW4

CHAR

BIN

0 0 0 1 1 1 1 none 1111
0 1 1 0 1 1 1 1 0001
1 0 1 0 1 1 1 2 0010
1 1 0 0 1 1 1 3 0011
0 1 1 1 0 1 1 4 0100
1 0 1 1 0 1 1 5 0101
1 1 0 1 0 1 1 6 0110
0 1 1 1 1 0 1 7 0111
1 0 1 1 1 0 1 8 1000
1 1 0 1 1 0 1 9 1001
0 1 1 1 1 1 0 * 1010
1 0 1 1 1 1 0 0 0000
1 1 0 1 1 1 0 # 1011

Berikut adalah contoh skematik interfacing AVR32 dengan keypad 3x4. Keypad dihubungkan ke mikrokontroller melalui port B. Port B tersebut dibagi menjadi dua nibble,  pin B0..B3 sebagai input (status ROW) dan pin B5..B7 sebagai output (status COL). Penambahan resistor 4K7 ohm adalah untuk melindungi chip AVR dari hubung-singkat (short-circuit), setiap ada tombol yang ditekan, nilainya akan ditampilkan secara biner pada LED.

Klik disini untuk memperbesar gambar

Berikut contoh kode programnya (menggunakan AVR Studio) :

/*
== Sasakala-M32 - Keypad Demo ==
============================================
Project : Keypad - LCD

Hardware:
--------
- [Sasakala-M32 Board]
- LED
- Matrix Keypad 3x4

KEYPAD Connection :
-----------------
COL1 -> PB5
COL2 -> PB6
COL3 -> PB7

ROW1 -> PB0
ROW2 -> PB1
ROW3 -> PB2
ROW4 -> PB3

LED Connection
LED1 -> PA0
LED2 -> PA1
LED3 -> PA2
LED4 -> PA3

============================================
Embedtronix (C)201012
*/
#define keypadport PORTB
#define keypadddr DDRB
#define keypadpin PINB
#define LEDport PORTA
#define LEDddr DDRA
#include <avr/io.h>

int main()

{

//hi-nibble sebagai output(COL) lo-nibble sebagai input(ROW);
keypadddr = 0xF0;
//LEDport sebagai output
LEDddr = 0x0F;

//Port LED untuk indikator
LEDport = 0x00;
//enable internal pull-up untuk keypadpin 0..3
keypadport = 0x0F;
while (1) //program berulang terus menerus

{

//memeriksa status baris (ROW), jika ada tombol
//yang ditekan, nomor tombol ditmapilkan pada
//LEDport

//kolom pertama (COL1)
keypadport =0b11011111;

while (bit_is_clear(keypadpin,0)) {LEDport=1;}

while (bit_is_clear(keypadpin,1)) {LEDport=4;}

while (bit_is_clear(keypadpin,2)) {LEDport=7;}

while (bit_is_clear(keypadpin,3)) {LEDport=11;}

//kolom kedua (COL2)
keypadport =0b10111111;

while (bit_is_clear(keypadpin,0)) {LEDport=2;}

while (bit_is_clear(keypadpin,1)) {LEDport=5;}

while (bit_is_clear(keypadpin,2)) {LEDport=8;}

while (bit_is_clear(keypadpin,3)) {LEDport=0;}

//kolom ketiga (COL3)
keypadport =0b01111111;

while (bit_is_clear(keypadpin,0)) {LEDport=3;}

while (bit_is_clear(keypadpin,1)) {LEDport=6;}

while (bit_is_clear(keypadpin,2)) {LEDport=9;}

while (bit_is_clear(keypadpin,3)) {LEDport=12;}
}
}



 



Penjelasan program



#define keypadport   PORTB 
#define keypadddr DDRB
#define keypadpin PINB
#define LEDport PORTA
#define LEDddr DDRA



mendefinisikan koneksi keypad dan LED indikator terhadap mikrokontroler, keypad dihubungkan melalui port B sementara LED indikator dihubungkan ke port A



//kolom pertama (COL1) 
keypadport =0b11011111;
while (bit_is_clear(keypadpin,0)) {LEDport=1;}
while (bit_is_clear(keypadpin,1)) {LEDport=4;}
while (bit_is_clear(keypadpin,2)) {LEDport=7;}
while (bit_is_clear(keypadpin,3)) {LEDport=11;}


Scanning untuk kolom pertama, COL1 diberi logika ‘0’, kemudian status pin ROW1..ROW3 di periksa apakah ada yang berlogika ‘0’ juga. Jika pin ROW1 ‘low’, berarti tombol nomor 1 yang ditekan, kemudian nomor tombolnya ditampilkan pada LED port (port A).



Jika ROW2 yang ‘low’, maka berarti tombol nomor 4 yang ditekan, lalu nomornya ditampilkan pada LEDport. Jika ROW3 yang ‘low’, maka berarti tombol nomor 7 yang ditekan, lalu nomornya ditampilkan pada LEDport. Demikian juga jika ROW4 yang ‘low’, maka berarti tombol nomor 11 yang ditekan, lalu nomornya ditampilkan pada LEDport.



Jika tidak ada tombol yang ditekan, maka proses scanning dilanjutkan pada kolom kedua.



//kolom kedua (COL2) 
keypadport =0b10111111;
while (bit_is_clear(keypadpin,0)) {LEDport=2;}
while (bit_is_clear(keypadpin,1)) {LEDport=5;}
while (bit_is_clear(keypadpin,2)) {LEDport=8;}
while (bit_is_clear(keypadpin,3)) {LEDport=0;}


Kali ini COL2 yang diberi logika ‘0’. prosesnya sama dengan scanning pada kolom pertama, ROW1 untuk tombol nomor 2, ROW2 untuk tombol nomor 5, ROW3 untuk tombol nomor 8 dan ROW3 untuk tombol nomor 0. Jika tidak ada tombol yag ditekan, proses berlanjut pada scanning kolom ketiga.



//kolom ketiga (COL3) 
keypadport =0b01111111;
while (bit_is_clear(keypadpin,0)) {LEDport=3;}
while (bit_is_clear(keypadpin,1)) {LEDport=6;}
while (bit_is_clear(keypadpin,2)) {LEDport=9;}
while (bit_is_clear(keypadpin,3)) {LEDport=12;}



Penjelasannya sama seperti proses scanning kolom pertama dan kedua.



Jika instruksi ‘while’ diganti dengan instruksi ‘if’, apa yang akan terjadi? silahkan mencobanya sendiri.



Download kode program dan simulasi proteus disini



Referensi :




  • http://www.8051projects.net/keypad-interfacing/avr-programming.php


  • http://winavr.scienceprog.com/example-avr-projects/4x4-keypad-example-using-avr-gcc-c-language.html


  • http://extremeelectronics.co.in/avr-tutorials/4x3-matrix-keypad-interface-avr-tutorial/

Sasakala Board adalah sebuah AVR Development Board dari Embedtronix yang berbasis microcontroler Atmel AVR ATmega32 dilengkapi dengan RS232 Level Converter, jadi tidak perlu converter RS232 lagi bila ingin berkomunikasi dengan PC lewat serial port.

Berikut contoh program USART pada Sasakala Board dengan menggunakan AVR Studio 4 dan WinAVR. Untuk menggunakan AVR Studio dan Win AVR silakan baca tutorialnya disini.

/*
        == AVR-Sasakala Demo ==
************************************************

Hardware:
    [Sasakala Board]
    ATmega32 @16MHz with Level convertor
    on RX/TX line Connected to PC via RS232

PC Software:    
    Hyperterminal @ 19200 baud
    No Parity,1 Stop Bit,
    Flow Control = NONE

************************************************
       Bubaka - Embedtronix (C)2010
*/

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

//Initialize the USART
void USARTInit(uint16_t ubrr_value)
{

   //Set Baud rate
   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*Set Frame Format
   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit
   >> char size 8
   */
   UCSRC=(1<<URSEL)|(3<<UCSZ0);

   //Mengaktifkan receiver and transmitter serial
   UCSRB=(1<<RXEN)|(1<<TXEN);
}

//Membaca data dari buffer USART.
//program akan menunggu hingga ada data.

char USARTReadChar()
{
   
//Menunggu hingga ada data
    while(!(UCSRA & (1<<RXC)))
    {
        //menunggu… 
    }

    //USART sudah mendapatkan data dari host
    //dan tersimpan di buffer

    return UDR;
}

//Fungsi untuk mengirimkan data (huruf) ke host PC
//melalui jalur TX serial RS232
 
void USARTWriteChar(char data)
{
   
//engunggu hingga transmitter siap 
    while(!(UCSRA & (1<<UDRE)))
    {
        //menunggu … 
    }

    //menyimpan data ke buffer USART  
    UDR=data;
}

//Fungsi untuk mengirimkan data (kata) ke host PC
//melalui jalur TX serial RS232
 
void
SerialString(const char *msg)
{
     while(*msg!='\0')
     {
        USARTWriteChar(*msg);
        msg++;
     }
}

//Fungsi untuk mengirimkan judul ke host PC
void
WriteTitle()
{ 
    SerialString("AVR32 USART Demo ");

}   

//Fungsi utama
void
main()
{
    char data;

    /*
    Initialisasi USART untuk Baudrate = 19200bps,
    maka UBRR diberi nilai = 51
    */
    USARTInit(51);        //UBRR = 51

    //dari sini program akan berulang terus menerus 
    while(1)
    {
        //Membaca data dari buffer serial 
        data=USARTReadChar();

        /*  
        Mengirimkan kembali data yang diterima dengan penambahan tanda ‘[‘ 
        serta tulisan judul. Contohnya ‘AVR USART Demo [a]'.
        */
        WriteTitle();
        USARTWriteChar('[');
        USARTWriteChar(data);
        USARTWriteChar(']');

        USARTWriteChar(0x0A);   //Mengirimkan tanda ganti baris 
    }
}

Selamat mencoba…!

Sasakala Board-M32 telah disertai dengan built-in default application, berupa aplikasi Running LED serta aplikasi Serial RS232 Terminal.

Untuk mencoba aplikasi Running LED, terlebih dahulu harus dipersiapkan komponen tambahan berupa 8 buah LED dan 8 buah resistor 470 ohm disamping breadboard dan kabel jumpernya.

Konfigurasi rangkaiannya adalah sebagai berikut :

Klik disini untuk memperbesar gambar

Jika ingin mengubah tampilan, berikut kode programnya:

/*
== AVR-Sasakala - Port I/O Demo ==
************************************************

Hardware:
- [Sasakala-M32 Board]
- LED 8x
- Resistor 470R 8x

************************************************
Embedtronix (C)201009
*/

#include <avr io.h>
#include <inttypes.h>
#include <util delay.h>


// Input/Output Ports initialization
void InitPort()
{
// Port A initialization
PORTA=0x0F; // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
DDRA=0xFF; // State7=0 State6=0 State5=0 State4=0 State3=1 State2=1 State1=1 State0=1

// Port B initialization
PORTB=0x0F; // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
DDRB=0xFF; // State7=0 State6=0 State5=0 State4=0 State3=1 State2=1 State1=1 State0=1

// Port C initialization
PORTC=0x0F; // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
DDRC=0xFF; // State7=0 State6=0 State5=0 State4=0 State3=1 State2=1 State1=1 State0=1

// Port D initialization
PORTD=0x0F; // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
DDRD=0xFF; // State7=0 State6=0 State5=0 State4=0 State3=1 State2=1 State1=1 State0=1
}

void main()
{

InitPort();

while(1)
{
unsigned char j; // LED var

for (j=0x01; j< 0x80; j<<=1)
{ // Blink LED 0,1,2,3,4,5,6
PORTA = j; // Output to LED Port
PORTB = j; // Output to LED Port
PORTC = j; // Output to LED Port
PORTD = j; // Output to LED Port
_delay_ms(750); // Delay for 750 Counts
}

for (j=0x80; j> 0x01; j>>=1)
{ // Blink LED 6,5,4,3,2,1,0
PORTD = j; // Output to LED Port
PORTB = j; // Output to LED Port
PORTC = j; // Output to LED Port
PORTD = j; // Output to LED Port
_delay_ms(750); // call wait function
}
}


Download Source Code



Selamat mencoba ..!

author
Embedtronix
Build Your Embedded System. Belajar bareng ngoprek Microcontroller, Arduino, TPLink, GLiNet dan ilmu Microelectronic lainnya.