- Modul Paparan 7-Segmen dan 4-Digit 7-Segmen:
- Menyambungkan 4-Digit Seven Segment Module dengan PIC Microcontroller:
- Pengaturcaraan menggunakan PIC16F877A:
- Penyediaan dan Ujian Perkakasan:
Ini adalah tutorial ke-8 pembelajaran mikrokontroler PIC menggunakan MPLAB dan XC8. Kami telah hadir dari pemasangan MPLABX hingga menggunakan LCD dengan PIC MCU. Sekiranya anda baru di sini, lihat tutorial sebelumnya di mana anda boleh belajar pemasa, LED berkedip, LCD antara muka dan lain-lain. Anda boleh mendapatkan semua Tutorial PIC kami di sini. Dalam tutorial terakhir kami, kami melihat bagaimana kami dapat menghasilkan watak-watak Custom dengan paparan LCD 16 * 2 kami, sekarang marilah kami melengkapkan diri dengan jenis modul paparan lain yang disebut paparan 7 segmen dan menghubungkannya dengan PIC Microcontroller.
Walaupun LCD 16x2 jauh lebih selesa daripada paparan 7 segmen tetapi terdapat beberapa senario di mana paparan 7 segmen akan lebih berguna daripada paparan LCD. LCD mengalami kekurangan kerana mempunyai saiz watak yang rendah dan akan berlebihan untuk projek anda jika anda hanya merancang untuk memaparkan beberapa nilai angka. 7-segmen juga mempunyai kelebihan berbanding keadaan pencahayaan yang buruk dan dapat dilihat dari sudut lager daripada layar LCD biasa. Oleh itu, marilah kita mula mengenalinya.
Modul Paparan 7-Segmen dan 4-Digit 7-Segmen:
7 Segmen Display mempunyai tujuh segmen di dalamnya dan setiap segmen mempunyai satu LED di dalamnya untuk menampilkan nombor dengan menerangi segmen yang sesuai. Seperti jika anda mahu segmen 7 memaparkan nombor "5" maka anda perlu menyalakan segmen a, f, g, c, dan d dengan menjadikan pin yang sesuai tinggi. Terdapat dua jenis paparan 7 segmen: Common Cathode dan Common Anode, di sini kita menggunakan paparan Common Cathode tujuh segmen. Ketahui lebih lanjut mengenai paparan 7 segmen di sini.
Sekarang kita tahu bagaimana memaparkan watak angka yang kita inginkan pada paparan 7 segmen tunggal. Tetapi, cukup jelas bahawa kita memerlukan lebih dari satu paparan 7 segmen untuk menyampaikan maklumat yang lebih daripada satu digit. Jadi, dalam tutorial ini kita akan menggunakan Modul Paparan 7-Segmen 4-digit seperti yang ditunjukkan di bawah.
Seperti yang kita lihat terdapat Empat Tujuh Segmen Paparan dihubungkan bersama. Kami tahu bahawa setiap modul 7-segmen akan mempunyai 10 pin dan untuk 4 paparan tujuh segmen akan ada 40 pin secara keseluruhan dan sangat sukar bagi siapa saja untuk memasangnya pada papan titik, jadi saya sangat mengesyorkan kepada sesiapa sahaja untuk membeli modul atau buat PCB anda sendiri untuk menggunakan paparan 7-segmen 4-digit. Skema sambungan untuk yang sama ditunjukkan di bawah:
Untuk memahami bagaimana modul tujuh segmen 4 digit berfungsi, kita harus melihat skema di atas, seperti yang ditunjukkan pin A dari keempat-empat paparan disambungkan untuk berkumpul sebagai satu A dan sama untuk B, C…. hingga DP. Jadi, pada dasarnya jika pencetus A aktif, maka keempat-empat A harus naik tinggi bukan?
Tetapi, itu tidak berlaku. Kami mempunyai empat pin tambahan dari D0 hingga D3 (D0, D1, D2 dan D3) yang dapat digunakan untuk mengawal paparan mana dari keempat yang seharusnya tinggi. Sebagai contoh: Sekiranya saya memerlukan output saya hanya hadir pada paparan kedua, maka hanya D1 yang harus dibuat tinggi sambil memastikan pin lain (D0, D2, dan D3) rendah. Cukup kita dapat memilih paparan mana yang harus aktif menggunakan pin dari D0 hingga D3 dan watak apa yang akan dipaparkan menggunakan pin dari A hingga DP.
Menyambungkan 4-Digit Seven Segment Module dengan PIC Microcontroller:
Di sini kita telah menggunakan mikrokontroler PIC PIC16F877A dan skema untuk litar ditunjukkan di bawah.
Kami mempunyai 12 pin output dari modul di mana 8 digunakan untuk memaparkan watak dan empat digunakan untuk memilih satu paparan daripada empat. Oleh itu semua 8 pin aksara ditugaskan untuk PORTD dan pin pemilihan paparan diberikan kepada empat pin pertama PORTC.
Catatan: Pin ground modul juga harus disambungkan ke ground MCU yang tidak ditunjukkan di sini.
Pengaturcaraan menggunakan PIC16F877A:
Sekarang, setelah kita mengetahui bagaimana modul ini berfungsi, mari kita pelajari cara memprogram PIC16F877A untuk menjadikannya memaparkan nombor 4 digit. Mari kita tambah pemboleh ubah dari 0 hingga 1000 dan mencetaknya pada paparan 7 segmen. Lancarkan program MPLABX dan buat projek baru, mari kita mulakan dengan bit konfigurasi.
#pragma config FOSC = HS // Oscillator Selits bit (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDTabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT diaktifkan) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Voltan Rendah (Bekalan Tunggal) In-Circuit Serial Programming Enable bit (RB3 digital I / O, HV aktif MCLR mesti digunakan untuk pengaturcaraan) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bit (Hapus perlindungan; semua memori program boleh ditulis oleh kawalan EECON) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
Seperti biasa kami menggunakan tetingkap bit konfigurasi set untuk menetapkan bit ini. Sekiranya anda tidak pasti maksudnya, lawati tutorial berkelip LED di sini.
Seterusnya mari kita tentukan pin output untuk beralih antara setiap digit paparan.
// *** Tentukan pin isyarat keempat-empat paparan *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Akhir definisi ** ////
Di sini pin RC0, RC1, RC2 dan RC3 digunakan untuk memilih antara empat digit modul paparan 7 segmen kami. Pin ini ditakrifkan sebagai s1, s2, s3 dan s4 masing-masing.
Seterusnya mari kita masuk ke kekosongan utama (), di mana kita mempunyai pernyataan pemboleh ubah berikut:
int i = 0; // nilai 4 digit yang akan dipaparkan int flag = 0; // kerana membuat kelewatan yang tidak ditandatangani int a, b, c, d, e, f, g, h; // hanya pemboleh ubah tidak bertanda int seg = {0X3F, // Nilai hex untuk memaparkan nombor 0 0X06, // Nilai hex untuk memaparkan nombor 1 0X5B, // Nilai hex untuk memaparkan nombor 2 0X4F, // Nilai hex untuk dipaparkan nombor 3 0X66, // Nilai hex untuk memaparkan nombor 4 0X6D, // Nilai hex untuk memaparkan nombor 5 0X7C, // Nilai hex untuk memaparkan nombor 6 0X07, // Nilai hex untuk memaparkan nombor 7 0X7F, / / Nilai hex untuk memaparkan nombor 8 0X6F // Nilai hex untuk memaparkan nombor 9}; // Akhir Array untuk memaparkan nombor dari 0 hingga 9
Di sini pemboleh ubah i dan flag digunakan untuk menyimpan nilai yang akan dipaparkan dan membuat kelewatan masing-masing. The pembolehubah integer tidak bertanda a hingga h digunakan untuk memecahkan nombor empat digit ke dalam digit tunggal dan menyimpan mereka (yang akan diterangkan kemudian di sini).
Satu perkara penting yang perlu diperhatikan di sini ialah deklarasi array "seg" . Dalam program ini kita menggunakan jenis data baru yang disebut Array. Array tidak lain hanyalah kumpulan nilai jenis data yang serupa. Di sini, kami telah menggunakan susunan ini untuk menyimpan semua nilai heksar yang setara untuk memaparkan nombor dari 0 hingga 9.
Alamat array selalu bermula dari sifar. Oleh itu, array ini akan mempunyai nilai hex bagi nombor berangka (0-9) yang tersimpan di alamat yang sama dengan nombor seperti yang ditunjukkan di bawah
Pembolehubah: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
Kod Hex: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Persamaan Nombor nombor: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Oleh itu, jika anda ingin memaparkan nombor 0 pada segmen 7 anda, anda boleh memanggil seg, begitu juga jika anda ingin memaparkan nombor 6 anda hanya perlu menggunakan seg.
Untuk memahami bagaimana sebenarnya nilai HEX diperolehi mari kita lihat jadual di bawah. Yang nilai HEX setara bagi setiap nombor perpuluhan disimpan dalam tatasusunan supaya ia boleh dipanggil untuk dipaparkan satu nombor tertentu.
Sekarang, mari kita beralih ke bahagian seterusnya kod yang merupakan konfigurasi I / O:
// ***** Konfigurasi I / O **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** Akhir konfigurasi I / O ** ///
Konfigurasi I / O mudah kerana semua pin pada segmen 7 kami adalah pin output, dan sambungannya ditunjukkan dalam gambarajah litar di atas, jadi nyatakannya sebagai output dan mulakannya menjadi sifar.
Sekarang mari kita beralih ke gelung tak terbatas kita (sementara (1)). Di sini kita harus membahagikan nilai "i" menjadi empat digit dan memaparkannya pada segmen 7. Mula-mula mari kita mulakan dengan membahagikan nilai pada "i"
// *** Membahagi "i" menjadi empat digit *** // a = i% 10; // 4 digit disimpan di sini b = i / 10; c = b% 10; // 3 digit disimpan di sini d = b / 10; e = d% 10; // Digit ke-2 disimpan di sini f = d / 10; g = f% 10; // digit pertama disimpan di sini h = f / 10; // *** Akhir perpecahan *** //
Dengan menggunakan modulus sederhana dan operasi pembahagian nombor 4 digit (i) dipisahkan menjadi nombor individu. Dalam kes kita, mari kita ambil contoh di mana nilai "i" adalah 4578. Kemudian pada akhir proses ini pemboleh ubah g = 4, e = 5, c = 7, dan a = 8. Jadi sekarang akan mudah untuk memaparkan setiap digit dengan hanya menggunakan pemboleh ubah tersebut.
PORTD = seg; s1 = 1; // Hidupkan paparan 1 dan cetak digit ke-4 __delay_ms (5); s1 = 0; // Matikan paparan 1 selepas kelewatan 5ms PORTD = seg; s2 = 1; // Hidupkan paparan 2 dan cetak digit ke-3 __delay_ms (5); s2 = 0; // Matikan paparan 2 selepas kelewatan 5ms PORTD = seg; s3 = 1; // Hidupkan paparan 3 dan cetak digit ke-2 __delay_ms (5); s3 = 0; // Matikan paparan 3 selepas kelewatan 5ms PORTD = seg; s4 = 1; // Hidupkan paparan 4 dan cetak digit pertama __delay_ms (5); s4 = 0; // Matikan paparan 4 selepas kelewatan 5ms
Ini adalah tempat sebenar MCU bercakap dengan segmen 7. Seperti yang kita ketahui, kita dapat memaparkan hanya satu digit pada satu masa, tetapi kita mempunyai empat digit untuk dipaparkan dan hanya jika keempat-empat digit itu berada di nombor empat digit lengkap akan dapat dilihat oleh pengguna.
Jadi, bagaimana kita melakukannya?
Beruntung bagi kami MCU kami jauh lebih pantas daripada mata manusia, jadi apa yang sebenarnya kami lakukan: kami memaparkan satu digit pada satu masa tetapi kami melakukannya dengan pantas seperti yang ditunjukkan di atas.
Kami memilih paparan satu digit sehingga menunggu 5ms sehingga MCU dan segmen 7 dapat memprosesnya dan kemudian mematikan digit itu dan beralih ke digit seterusnya dan melakukan perkara yang sama sehingga kita mencapai digit terakhir. Kelewatan 5ms ini tidak dapat dilihat oleh mata manusia dan keempat-empat digit nampaknya Hidup pada masa yang sama.
Itu sahaja, akhirnya kami hanya menambah nilai digit yang dipaparkan menggunakan kelewatan seperti yang ditunjukkan di bawah
if (flag> = 100) // tunggu sehingga bendera mencapai 100 {i ++; flag = 0; // hanya jika bendera seratus "i" akan bertambah} bendera ++; // bendera kenaikan untuk setiap denyar
Kelewatan digunakan sehingga masa yang diperlukan untuk menukar dari satu nombor ke nombor lain cukup lama untuk kita perhatikan perubahannya.
The kod lengkap adalah seperti di bawah dan proses ini juga dijelaskan dalam Video pada akhir.
Penyediaan dan Ujian Perkakasan:
Seperti biasa mari kita mensimulasikan program menggunakan Proteus sebelum kita benar-benar menggunakan perkakasan kita. Sekiranya simulasi berjaya, anda mesti melihat sesuatu seperti ini
Projek ini tidak mempunyai persediaan perkakasan yang rumit, kami sekali lagi menggunakan papan Mikrokontroler PIC yang sama yang telah kami buat dalam Tutorial berkedip LED. Cukup sambungkan Modul 7 segmen dengan papan Mikrokontroler PIC anda mengikut gambarajah sambungan. Setelah selesai dengan sambungan, hilangkan kod menggunakan pengaturcara PicKit 3 anda dan semoga ia menikmati output anda.