Halaman 267
dengan benar sedangkan A-F akan ditampilkan sesuai Gambar 9.20. Misalnya, jika
tombol 'F' ditekan, maka semua segmen LED akan DIMATIKAN.
C-program untuk antarmuka PIC18F4321-Keyboard disediakan di bawah ini:
#termasuk <P18F4321.h>
#definisikan BENAR 1
#definisikan SALAH 0
#define setbit(var,bit) ((var) = (1<<(bit)))
// #1 atur bit var = var I (1 <<<bit)
#define clearbit (var,bit)((var) &= ~(1<<(bit))) #define testbit(var,bit) ((var) &
(1<<(bit)))
// #2 clear a bit var = var & ~(1<<bit) // #3 test a bit return var & (1<<bit) // #4
semua baris awalnya tinggi
baris karakter yang tidak ditandatangani = 0x0F:
int i=0,j=0;
unsigned char Matrix[4][4] =
#1 #5 membuat matriks untuk menyimpan // nomor kunci Hex yang sesuai
(0x0F, 0x0E, 0x0D, 0x0C), [0x0B, 0x0A, 0x09, 0x08), (0x07, 0x06, 0x05, 0x04).
(0x03, 0x02, 0x01, 0x00]]; void delay_ms(waktu int tidak ditandatangani); void
main()
// fungsi delay #6 untuk memberikan delay 2ms
{
OSCCON=0x60;
ADCON1 = 0x0F;
TRISB = 000;
TRISC=0x00;
TRISD = 0xFF:
PORTB=0x00;
sementara (1) {
PORTC= 0x00;
while(PORTD! = 0x0F);
while(PORTD == 0x0F);
untuk(i=0; i<4; i++)
untuk(j=0; j<4;j++)
clearbit(baris.j);
PORTC= baris:
jika(testbit(PORTD,i)==0)
// jam 4MHz
// #8 ANO-AN12 semua masukan digital
// #9 konfigurasikan PORTB sebagai keluaran untuk dekoder 7 seg
// #10 konfigurasikan PORTC sebagai output untuk keyboard matriks // #11
konfigurasikan PORTD sebagai input untuk tombol yang ditekan ##12 output
awalnya disetel ke 0 pada PORTB
// keluaran #13 awalnya disetel ke 0 di PORTC
// #14 tunggu dalam while loop jika tombol ditekan
// #15 tunggu while loop jika tidak ada tombol yang ditekan // #16 Scan keyboard
FOR COLUMN
##17 Pindai BARIS
// #18 Hapus sedikit untuk baris yang sesuai j
##19 Menghasilkan rendah untuk baris itu
// #20 Mendeteksi jika tombol ditekan di colunin i
{
delay_ms(20);
// #21 Penundaan selama 20ms
jika(testbit(PORTD,i) == 0)
// #22 Periksa lagi untuk debouncing
PORTB = Matriks[j][i];
// #23 hasil keluaran dari tabel pencarian ke PORTB
}
}
setbit(baris,j);
// #24 Atur bit nol kembali ke variabel baris
}
Halaman 268
}
}
}
void delay_ms(unsigned int time) // fungsi delay #25 2ms
}
unsigned int i, j;
untuk(i=0; i<waktu; i++)
untuk(j=0; j<255; j++);
}
Pada Gambar 9.21, empat baris dan empat kolom keyboard hex dihubungkan ke
PIC18F4321 melalui PORTC dan PORTD. Baris atas (baris 0) keyboard
disambungkan ke RCO, baris berikutnya (baris 1) ke RCI, baris berikutnya (baris
2) ke RC2, dan baris berikutnya (baris 3) ke C3. Di sisi lain, kolom paling kanan
(kolom 0) terhubung. ke RD3, kolom berikutnya ke kiri (kolom 1) ke RD2, kolom
berikutnya ke kiri (kolom 2) ke RD1, dan kolom berikutnya ke kiri (kolom 3) ke
RDO. Pada gambar, kolom keyboard yang terhubung ke +5V, biasanya TINGGI.
Matriks kunci pada baris #5 pada program disusun berbeda dengan Keyboard pada
Gambar 9.21. Misalnya, dalam program Kunci 'P' terletak di baris 0 dan kolom 0.
Oleh karena itu, kunci 'F' terletak di paling kanan baris atas matriks kunci.
Baris #18 mengosongkan sedikit untuk baris j, dan baris #19 menampilkan
RENDAH pada baris tersebut. Baris #20 mendeteksi jika kunci ditekan di kolom i
yang terhubung ke baris itu. Setelah kunci ditemukan, kunci tersebut didebounce
(Baris #21). Dengan i dan j. kunci diperoleh dari matriks kunci [i][i], dan
kemudian dikeluarkan ke PORTB pada tampilan tujuh segmen (Baris #23).
Layar 7-seg anoda umum
Sebagai contoh, coba tekan tombol nomor 2. Perhatikan bahwa "2" terletak di baris
3(-3) dan di kolom 1 (i = 1). Dalam program, j = 0 dan i = 0 pada awalnya. Fungsi
"clearbit" (Baris #1) menghapus sedikit, lalu "PORTC= baris;" (Baris #19)
menampilkan '0' pada baris. Ini berarti bahwa untuk j = 0 dan i = 0, PORTC
mengeluarkan OxE (1110). Fungsi "testbit" (Baris #20) memeriksa apakah input
pada PORTD adalah 0. Jika 0, kunci ditemukan. Kuncinya dilepas (Baris #21) dan
kemudian dikeluarkan ke PORTB. Dengan demikian, tombol yang ditekan akan
ditampilkan pada tampilan tujuh segmen. Jika tombol '2' ditekan, kuncinya belum
ditemukan. Oleh karena itu, proses berlanjut sampai j = 3 dan i = 1.
Ketika j=3 dan i = 1, fungsi "clearbit" pada baris #18 menghapus sedikit untuk
baris 3 = 3) dan menghasilkan 0x7 (0111) pada PORTC empat bit rendah. Ketika
pernyataan "if" dengan fungsi "testbit" dijalankan (Baris #20), kolom 1 (i = 1)
diperoleh. Koordinat dengan j = 3 (baris 3) dan i = 1 (kolom 1) menyediakan
tombol "2" yang ditekan. Kunci tersebut kemudian dilepas dan dikeluarkan ke
PORTB. Oleh karena itu, tampilan tujuh segmen akan menampilkan "2"
9.10 (a) Ulangi Soal 9.9 menggunakan Interrupt I/O dengan menghubungkan
output komparator ke INTI. Perhatikan bahwa RBI juga dimultipleks dengan INTI.
Tulis program utama pada 0x80 dan rutin layanan interupsi pada 0x150 dalam
bahasa rakitan PIC18F. Program utama akan mengonfigurasi port I/O,
mengaktifkan interupsi INTI, menginisialisasi STKPTR ke 0x10, mematikan LED,
dan kemudian menunggu interupsi. Rutin layanan interupsi akan menyalakan LED
dan kembali ke program utama di lokasi yang sesuai sehingga LED menyala terus
hingga interupsi berikutnya.
(b) Ulangi (a) menggunakan C kecuali inisialisasi STKPTR tidak diperlukan dan
juga alamat awal untuk rutin utama dan layanan tidak perlu ditetapkan.
9.11 Pada Gambar P9.11, jika VM > 12 V. hidupkan LED yang terhubung pada bit
3 dari PORTA. Jika VM < 11 V, matikan LED. Menggunakan port, register, dan
lokasi memori sesuai kebutuhan dan interupsi INTO:
(a) Gambarlah diagram blok rapi yang menunjukkan mikrokontroler PIC18F4321
dan koneksi ke port dalam diagram yang ditunjukkan pada Gambar P9.11.
(b) Tulis program utama pada 0x150 dan service routine pada 0x200 dalam bahasa
rakitan PICISE. Program utama akan menginisialisasi port dan menunggu
interupsi. Rutinitas layanan akan menyelesaikan tugas dan berhenti.
Ulangi (b) menggunakan bahasa C. Perhatikan bahwa alamat awal untuk program
utama dan rutinitas layanan seperti dalam bahasa rakitan tidak diperlukan.
9.12 Apa kegunaan pin RS, R/W, dan EN pada LCD Hitachi HD44780 Jelaskan
secara singkat bagaimana sinyal ini digunakan untuk menampilkan data pada LCD
melalui pin D0-D7
9.13 Asumsikan antarmuka LCD PIC181-4321- Hitachi HD4-1780 dari Gambar
9.1-4
(a) Tulis program dalam program bahasa rakitan PIC18F untuk menampilkan frasa
"PIC18F" pada LCD segera setelah empat sakelar input yang terhubung ke PORT
C semuanya TINGGI.
(b) Ulangi (a) menggunakan C.
9.14 Apa faktor yang harus dipertimbangkan untuk menghubungkan keyboard hex
ke mikrokontroler?
9.15 Diinginkan untuk menerapkan sistem berbasis PIC18F4321 seperti yang
ditunjukkan pada Gambar P9.15. Sistem akan memindai keyboard hex dengan 16
tombol, dan menggerakkan tiga layar tujuh segmen. PIC18F4321 akan
memasukkan setiap tombol yang ditekan, dan menggulirnya dari sisi kanan layar,
dan terus menggulir saat setiap tombol ditekan. Digit paling kiri dibuang begitu
saja. Sistem berlanjut tanpa batas waktu. Tulis program bahasa C untuk mencapai
hal di atas.
9.16 Rancang sistem berbasis PIC18F4321 (Gambar P9.16) sebagai berikut:
Sistem akan menggerakkan dua digit tujuh segmen dan memantau dua sakelar
kunci. Sistem akan mulai menampilkan 00. Jika tombol pertambahan ditekan,
maka akan menambah tampilan satu per satu. Demikian pula, jika tombol
pengurangan ditekan, tampilan akan berkurang satu. Tampilan akan berubah dari
00 menjadi 99, dan sebaliknya. Tulis program bahasa C untuk mencapai hal di atas.
Gunakan jam internal 4MHz. Hubungkan Sakelar kenaikan ke INTI (RBI) dan
Sakelar penurunan ke INT2 (RB2). Konfigurasikan INTI sebagai prioritas tinggi
dan INT2 sebagai Prioritas Rendah. Hubungkan tampilan 7-segmen tinggi melalui
RC3-RCO dari PORTC sementara tampilan 7-segmen Rendah melalui RD3-RDO
dari PORTD. Gunakan dua 7447 untuk tampilan.
Penghitung waktu ini juga dapat digunakan sebagai penghitung acara. Perhatikan
bahwa penghitung peristiwa pada dasarnya adalah register dengan jam yang
diganti dengan peristiwa seperti sakelar. Penghitung bertambah atau berkurang
setiap kali sakelar diaktifkan. Dengan demikian, berapa kali sakelar diaktifkan
(terjadinya peristiwa) dapat ditentukan.
Timero dapat beroperasi sebagai timer 8-hit atau timer 16-bit. Timero
memanfaatkan jam internal saat digunakan sebagai pengatur waktu, dan jam
eksternal saat digunakan sebagai penghitung. Timeri hanya dapat digunakan
sebagai timer 16-bit atau pencacah 16-bit, tidak dapat digunakan sebagai timer 8-
bit atau pencacah 8-bit.
Seperti Timer, Timer1 menggunakan jam internal saat digunakan sebagai pengatur
waktu, dan jam eksternal saat digunakan sebagai penghitung. Timer2 dapat
digunakan sebagai timer 8-bit menggunakan jam internal. Itu tidak dapat
digunakan sebagai penghitung. Terakhir, Timer3 dapat beroperasi sebagai timer 16-
bit atau pencacah 16-bit. Itu tidak dapat digunakan sebagai timer 8-bit atau
penghitung 8-bit.Di bagian ini, topik yang terkait dengan bagaimana Timero
melalui Timer3 dapat digunakan sebagai pengatur waktu untuk memberikan
penundaan waktu akan dibahas. Penggunaan pengatur waktu ini sebagai
penghitung tidak akan disediakan. Timer1, Timer2, dan Timer3 digunakan untuk
operasi CCP (Capture/Compare/Pulse Width Modulation). Misalnya, PIC18F4321
menggunakan Timer1 atau Timer3 untuk mode tangkap dan bandingkan, dan
Timer2 untuk mode PWM. Perhatikan bahwa Timer tidak digunakan oleh modul
CCP. Topik-topik ini akan dibahas nanti dalam bab ini
Singkatnya, timer pada dasarnya adalah pencacah biner (register Timer) yang dapat
diprogram untuk menghitung pulsa clock. Setelah register timer mencapai nilai
maksimum (0xFF untuk 8-bit, 0xFFFF untuk 16-bit), itu akan kembali ke 0
mengatur bendera luapan ke satu pada siklus berikutnya, dan juga menghasilkan
interupsi jika diaktifkan. Berikut ini, fitur dasar timer PIC18F akan dibahas.
Polling Timer menandai Timer menghitung hingga nilai maksimum 0xFF saat
beroperasi sebagai timer 8-bit dan kemudian meluap ke 0. Selain itu, Timer0 atau
Timer1 atau Timer3 menghitung hingga nilai maksimum 0xFFFF saat beroperasi
sebagai timer 16-bit , dan kemudian meluap ke 0.
PIC18F4321 Timer2 berisi register timer 8-bit (TMR2) dan register periode 8-bit
(PR2). Timer2 meluap ke 0 untuk pertandingan TMR2-ke-PR2. Overflow
ditunjukkan secara otomatis oleh PIC18F4321 dengan menyetel bit flag (bit
TMRxIF di mana x = 0, 1, 2, 3) yang terkait dengan masing-masing pengatur
waktu ini. Bit bendera ini dapat disurvei dalam perangkat lunak untuk
menyediakan fungsi terkait waktu. Keempat pengatur waktu menyertakan bit
bendera
10.1Timer PIC18F4321 beserta fitur dasarnya dirangkum dalam TABEL
Timer menyela Masalah dengan polling bit flag timer adalah bahwa PIC18F4321
harus menunggu dalam satu lingkaran untuk memeriksa bit TMRXIF menjadi
TINGGI. Dalam hal ini, PIC18F4321 tidak akan dapat melakukan tugas lainnya.
Oleh karena itu, interupsi pengatur waktu dapat digunakan. Konsep ini mirip
dengan keuntungan menggunakan I/O interupsi dibandingkan I/O yang disurvei.
Karena pengatur waktu dianggap sebagai perangkat periferal, satu bit interupsi
periferal (PEIE) disediakan dalam register INTCON untuk keempat pengatur
waktu. Setiap pengatur waktu (TMRx dengan x=0.1.2.3) juga dilengkapi dengan
bit pengaktif interupsi (TMRXIE dengan x = 0,1,2,3) dan bit bendera interupsi
(TMRXIF dengan x = 0,1,2,3) .
Selanjutnya, untuk mendapatkan interupsi yang digerakkan oleh timer dengan
salah satu dari empat timer (Timer) melalui Timer 3), diperlukan inisialisasi
register tertentu. Misalnya, perhatikan Gambar 10.1 untuk Timero. Bit berikut
terkait dengan Timer dapat diinisialisasi melalui pemrograman sebagai berikut:
TMROIF 0, TMROIE 1, PEIE = 1, GIE = 1 Hal ini dapat dilakukan dengan
menggunakan perakitan PIC18F sebagai berikut:
BCF
INTCON, TMROIF
INTCON, TMROIE
BSF
BSF
INTCON, PEIE
BSF
INTCON, GIE
Kode-C yang setara disediakan di bawah ini:
Register
Timer Size Counter register
(Enable and Flag bits)
TMR0IE, TMR0IF TMR0L for 8-bit
Timer0 8-bit or 16-bit in
INTCON TMR0H:TMR0L for 16-bit
TMR1IE in PIE1
Timer1 16-bit TMR1H:TMR1L
TMR1IF in PIR1
TMR2IE in PIE1
Timer2 8-bit TMR2IF in PIR1 TMR2
TMR3IE in PIE2
Timer3 16-bit TMR3H:TMR3L
TMR3IF in PIR2
GAMBAR 10.1 Interupsi Timero
INTCONbits.TMROIF = 0;
INTCONbits TMROIE = 1; INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
Segera setelah Timero menyela PIC18F4321, mikrokontroler menyelesaikan
eksekusi instruksi saat ini dan memuat PC dengan alamat 0x000008 (dengan
asumsi mode default). Rutin layanan dapat ditulis di alamat ini untuk melakukan
fungsi yang berhubungan dengan pengatur waktu. Perhatikan bahwa pengatur
waktu yang digerakkan interupsi menggunakan Timer1 hingga Timer3 bekerja
dengan cara yang sama.
Timer Prescaler dan Postscaler disediakan dengan opsi prescaler dan postscaler
yang dapat diprogram melalui register kontrol pengatur waktu. Opsi prescaler
membagi jam PIC18F dengan bilangan bulat, dan mengurangi periode jam.
Pengurangan periode jam ini memberikan penundaan waktu yang lebih tinggi pada
pengatur waktu. Misalnya, pertimbangkan jam internal 4 MHz. Karena timer
PIC18F bekerja dengan kristal bagi-oleh-4, frekuensi timer = (4 MHz/4) = 1 MHz.
Menggunakan nilai prescaler 1:4, Frekuensi clock pengatur waktu (IMHz/4) =0,25
MHz= 250 kHz. Oleh karena itu, frekuensi clock yang lebih rendah akan
meningkatkan periode clock yang memberikan waktu tunda yang lebih tinggi.
Perhatikan bahwa prescaler berarti frekuensi clock pengatur waktu dibagi sebelum
frekuensi digunakan oleh pengatur waktu. Pada PIC18F4321, Timero, Timer1, dan
Timer3 dilengkapi dengan prescaler. Timer ini tidak memiliki opsi postscaler.
Postscaler juga membagi jam dengan bilangan bulat setelah timer digunakan. Jam
ini kemudian digunakan untuk memperlambat pengaturan bit bendera interupsi
pengatur waktu. Dalam PIC18F4321, Timer2 dilengkapi dengan opsi prescaler dan
postscaler. Seperti yang akan ditunjukkan nanti. Opsi prescaler Timer2 dapat
digunakan untuk mendapatkan lebih banyak waktu tunda sedangkan opsi
postscaler Timer2 dapat diprogram untuk menunda pembuatan TMR2IF (Timer
Interrupt Flag).
0.1.1 Timer0
Timer dapat beroperasi sebagai pengatur waktu atau sebagai penghitung dalam
mode 8-bit atau 16-bit. Timer menggunakan clock internal saat digunakan sebagai
timer, dan clock eksternal (TOCK1) saat digunakan sebagai counter.
Timero sebagai timer Timero dapat digunakan sebagai timer dengan menyetel
TMROON (bit 7 dari TOCON register Gambar 10.2) ke 1 menggunakan instruksi
perakitan PIC18F "BSF TOCON, TMOON" atau setara dengan C
"TOCONbits.TMROON=1 ;". Setelah Timer dimulai, ia menghitung dengan
menambah isi register (TMROL untuk mode pengatur waktu 8-bit atau
TMROH:TMROL untuk mode pengatur waktu 16-bit) dengan 1 pada setiap siklus
instruksi. TMROL menghitung hingga TMROL mencapai 0xFF dalam mode 8-bit.
TMROIF (interupsi saat luapan)