PERCOBAAN IV
SERIALTO PARALEL IO
TM1638
Disusun Oleh:
I. Tujuan
Setelah melaksanakan praktikum saya mampu:
1. Mengimplementasi algoritma ke program dari datasheet
2. Membuat program bahasa ‘C’ untuk membuat tampilan pada modul
3. Mengatur tampilan display
4. Menggunakan modul serial to parallel io tm1638
Board hanya memiliki 3 pin kontrol plus power dan ground. Pin kontrol adalah strobe,
clock dan data. Pin strobe dan clock hanya OUTPUT sedangkan pin data bisa OUTPUT dan
INPUT. Pin strobe digunakan saat mengirim data ke board, mengatur pin strobe ke LOW
sebelum mulai mengirim data satu atau lebih byte dan kemudian mengatur pin strobe kembali
ke HIGH. Perhatikan bahwa hanya ada satu pin data yang berarti data sedang dikirim 1 bit
setiap kali. Di sinilah pin clock berperan. Saat mengirim data, Anda mengatur pin clock ke
LOW maka Anda mengatur pin data dan mengatur pin clock kembali ke HIGH untuk
mengkomit nilai bit. Anda mungkin sudah terbiasa dengan pola ini adalah cara standar untuk
mengirim data dengan register geser dan oleh karena itu kami hanya dapat menggunakan
fungsi shiftOut standar untuk mengirim 8 bit data hanya dengan satu baris kode. Data yang
dikirim ke board mengikuti protokol di mana byte pertama memberi tahu board apa yang
ingin kita lakukan dan diikuti oleh nol atau lebih byte yang merupakan argumen untuk fungsi
yang dipilih. Argumen dikirim secara terpisah (mis. Pin strobe harus diatur ke HIGH setelah
mengirim perintah dan sekali lagi ke LOW sebelum mengirim argumen). Board memiliki 4
fungsi:
Mengaktifkan / menonaktifkan board dan menginisialisasi layar
Tulis byte di alamat tertentu
Tulis byte mulai dari alamat tertentu
Tombol baca
Untuk mengaktifkan board dan mengatur kecerahan layar kami menggunakan perintah
1000abbb (0x8?) Di mana bit yang ditandai sebagai a digunakan untuk mengaktifkan /
menonaktifkan board dan bit yang ditandai sebagai bbb digunakan untuk mengatur kecerahan
layar. Misalnya untuk mengaktifkan board dan mengatur kecerahan tampilan ke nilai
maksimum yang kita perlu kirim 0x8f. Fungsi ini tidak memiliki argumen. Untuk menulis
byte pada alamat tertentu, kami mengirim perintah 010000100 (0x44) diikuti dengan alamat
dalam bentuk 1100aaaa (aaaa bit menunjukkan lokasi yang ingin kami tulis) diikuti dengan
nilainya. Sebagai contoh untuk menulis nilai 0x45 pada alamat 0x0a kita harus mengirim
urutan byte berikut: 0x44 0xca 0x45.
Jika kita ingin menulis nilai pada alamat yang berurutan (sangat membantu untuk mereset
board) kita akan mengirim 01000000 (0x40) diikuti dengan alamat awal (lagi dalam bentuk
1100aaaa) diikuti oleh nilai yang ingin kita tulis. Misalnya jika kita mengirim 0x40 0xc0
0x00 0x01 0x02 0 akan ditulis di alamat 0, 1 akan ditulis di alamat 1 dan 2 akan ditulis di
alamat 2. Perhatikan bahwa kita memiliki 4 bit untuk memilih alamat yang berarti ada enam
belas lokasi yang dapat ditulis. Jika Anda terus menulis setelah mencapai alamat 0x0f itu
akan dibungkus dan Anda akan mulai lagi dari alamat 0x00. Untuk membaca tombol, kami
mengirim perintah 010000010 (0x42), mengatur pin data sebagai INPUT dan membaca 4
byte yang berisi status tombol.
Sekarang kita tahu bahwa kita dapat menulis nilai ke salah satu dari 16 lokasi. Ini adalah
cara kita menyalakan LED dan mengontrol tampilan. Board ini memiliki dua tampilan LED 7
segmen 7 digit dan 8 LED. Masing-masing dari mereka memiliki alamat khusus yang
nilainya perlu ditulis untuk mengontrol item yang sesuai. Misalnya jika menyalakan LED
pertama kita akan menulis 1 pada alamat 0x01. Di bawah ini adalah daftar lokasi dengan
penjelasan singkat.
Pertama-tama kita perlu menghubungkan board berbasis TM1638 ke board Arduino kita.
Beginilah cara saya melakukannya:
Fungsi pengaturan perlu mengaktifkan dan mengatur ulang board. Agar mudah dibaca,
dibuat fungsi pembantu untuk mengirim perintah dan fungsi terpisah untuk pengaturan.
Inilah cara kerjanya. Kode mulai dijalankan dari fungsi pengaturan. Pertama-tama kita
menetapkan pin 7, 8, 9 sebagai pin keluaran. Selanjutnya kita mengaktifkan board dan
mengatur kecerahan ke nilai maksimum dengan mengirim 0x8f. Akhirnya mereset board
dengan membersihkan semua lokasi memori. Dengan mengatur board ke mode kenaikan
otomatis alamat (0x40), memilih 0 sebagai alamat awal (0xc0) dan mengirim 0 enam belas
kali. Sekarang board siap bekerja dengan menampilkan sesuatu. Yang mudah ditampilkan
adalah 8, pada posisi digit pertama dan terakhir pada layar dan menyalakan LED ke-3 dan ke-
6. Untuk melakukan itu kita akan menggunakan mode alamat tunggal karena lokasi yang
akan kita tulis tidak berurutan.
Menampilkan 8 akan lebih baik jika kita tahu hubungan antara nilai yang dikirim ke board
dan apa yang akan ditampilkan. Board menggunakan pengkodean 7 segmen standar, sehingga
nilai yang dikirim ke board adalah byte dengan bit kode sebagai berikut: [DP] GFEDCBA.
Setiap bit akan menyalakan satu segmen sesuai gambar di bawah ini:
Jadi, misalnya jika ingin menampilkan A harus menulis 0x77 di lokasi yang sesuai.
Sekarang kita tahu cara mengontrol LED dan tampilan. Tapi ada satu hal lagi yang
ditawarkan board - tombol. Membaca tombol apa yang ditekan bekerja sedikit berbeda dari
apa yang telah kita lihat sejauh ini. Pertama kita perlu mengirim perintah 0x42, kemudian kita
mengatur pin data sebagai pin input. Akhirnya kita perlu membaca 4 byte dari board (sedikit
demi sedikit). Byte pertama berisi status untuk tombol S1 (bit 1) dan S5 (bit 4), byte kedua
berisi status untuk tombol S2 (bit 2) dan S6 (bit 5) dan seterusnya. Jika kita | (mis. logis
`atau`) semua byte kita akan berakhir dengan byte di mana setiap bit berhubungan dengan
satu tombol - jika bit diatur ke satu berarti bahwa tombol yang sesuai ditekan. Ini adalah
sedikit program di mana board akan menyalakan LED di atas tombol yang ditekan.
IV. Alat dan Komponen yang digunakan
1. Komputer PC/ Laptop
2. WinAVR
3. Usbasp
4. Usbasp driver
5. Arduino Pro mini atau Arduino Uno
6. Kabel penghubung secukupnya
1. #ifndef tm1638_h
2. #define tm1638_h
3. #define SET_DISP 0x88
4. #define INC_ADD 0x40
5. #define FIX_ADD 0x44
6. #define SEL_ADD(x) 0xc0+x
7. void send_data(char);
8. void send_command(char);
9. void clear(void);
10. void running_led(void);
11. void send_data(char data)
{
12. char i;
13. for(i=0;i<8;i++)
{
a) clrbit(PORTB,dio);
b) clrbit(PORTB,clk);
c) if(bit_is_set(data,i))
d) setbit(PORTB,dio);
e) setbit(PORTB,clk);
}
}
4. Membuat C file dan beri nama dengan isi sebagai berikut kemudian
menambahkannya ke project
1. #include <avr/io.h>
2. #include <util/delay.h>
3. #define setbit(port,bit) port |= _BV(bit)
4. #define clrbit(port,bit) port &= ~(_BV(bit))
5. #define dio 0
6. #define clk 1
7. #define stb 2
8. #include "tm1638.h"
9. int main(void)
{
10. int i;
11. PORTB=0;
12. DDRB=0xff;
13. PORTB |=0x06;
14. send_command(SET_DISP);
15. clear();
16. while(1)
{
17. for(i=1;i<16;i+=2)
{
a. clrbit(PORTB,stb);
b. send_data(SEL_ADD(i));
c. send_data(1);
d. setbit(PORTB,stb);
e. _delay_ms(15);
f. clrbit(PORTB,stb);
g. send_data(SEL_ADD(i));
h. send_data(0);
i. setbit(PORTB,stb);
j. _delay_ms(3);
}
18. for(i=13;i>2;i-=2)
{
a. clrbit(PORTB,stb);
b. send_data(SEL_ADD(i));
c. send_data(1);
d. setbit(PORTB,stb);
e. _delay_ms(15);
f. clrbit(PORTB,stb);
g. send_data(SEL_ADD(i));
h. send_data(0);
i. setbit(PORTB,stb);
j. _delay_ms(3);
}
}
19. return 0;
}
1. #include <avr/io.h>
2. #include <util/delay.h>
3. #define setbit(port,bit) port |= _BV(bit)
4. #define clrbit(port,bit) port &= ~(_BV(bit))
5. #define dio 0
6. #define clk 1
7. #define stb 2
8. #include "tm1638.h"
9. char s[16]={1,2,4,8,16,32,64,128};
10. int main(void)
{
11. int i,j;
12. PORTB=0;
13. DDRB=0xff;
14. PORTB |=0x06;
15. send_command(SET_DISP);
16. while(1)
{
a. clear();
b. for(j=0;j<16;j+=2)
c. {
d. send_command(FIX_ADD);
e. clrbit(PORTB,stb);
f. send_data(SEL_ADD(j));
g. for(i=0;i<8;i++)
{
1. send_data(s[i]);
2. _delay_ms(500);
}
h. setbit(PORTB,stb);
}
17. }
18. return 0;
19. }
1. #include <avr/io.h>
2. #include <util/delay.h>
3. #define setbit(port,bit) port |= _BV(bit)
4. #define clrbit(port,bit) port &= ~(_BV(bit))
5. #define dio 0
6. #define clk 1
7. #define stb 2
8. #include "tm1638.h"
9. char s[16]={0,0,115,0,63,0,56,0,124,1,95,1,84,1,0,1};
10. char t[16]={0,1,115,1,63,1,56,1,124,0,95,0,84,0,0,0};
21. for(i=0;i<16;i++)
a. send_data(s[i]);
22. setbit(PORTB,stb);
23. _delay_ms(1000);
24. send_command(INC_ADD);
25. clrbit(PORTB,stb);
26. send_data(SEL_ADD(0));
27. for(i=0;i<16;i++)
28. send_data(t[i]);
29. setbit(PORTB,stb);
30. _delay_ms(1000);
}
31. return 0;
}
#include <avr/io.h>
#include <util/delay.h>
#define setbit(port,bit) port |= _BV(bit)
#define clrbit(port,bit) port &= ~(_BV(bit))
#define dio 0
#define clk 1
#define stb 2
#include "tm1638.h"
char s[16]={0,0,118,0,121,0,102,0,124,1,80,1,63,1,0,1};
char t[16]={0,1,118,1,121,1,102,1,124,0,80,0,63,0,0,0};
int main(void)
{
int i;
PORTB=0;
DDRB=0XFF;
PORTB |=0x06;
send_command(SET_DISP);
while(1)
{
send_command(INC_ADD);
clrbit(PORTB,stb);
send_data(SEL_ADD(0));
for(i=0;i<16;i++)
send_data(s[i]);
setbit(PORTB,stb);
_delay_ms(1000);
send_command(INC_ADD);
clrbit(PORTB,stb);
send_data(SEL_ADD(0));
for(i=0;i<16;i++)
send_data(t[i]);
setbit(PORTB,stb);
_delay_ms(1000);
}
return 0;
}
b) Output
Pada percobaan ini pada display akan menampilkan tulisan “Hey br0” sesuai
yang ditulis dalam program dimana board menggunakan pengkodean 7 segmen
standar, sehingga nilai yang dikirim ke board adalah byte dengan bit kode dan
dengan keempat LED diatasnya bergeser bergiliran.
VI. Kesimpulan
Pada percobaan ini dapat disimpulkan bahwa:
Dapat menggunakan TM1638 dalam komunikasi serial to parallel
Untuk mengatur tampilan display perlu mengubah isi pada char s dan char t dengan
menggunakan pengkodean 7 segmen standar