- 7 Segment ve 4 Haneli 7 Segment Görüntüleme Modülü:
- PIC Mikrodenetleyiciyle 4 Haneli Yedi Segment Modülü Bağlama:
- PIC16F877A kullanarak programlama:
- Donanım Kurulumu ve Testi:
Bu, MPLAB ve XC8 kullanarak PIC mikro denetleyicilerini öğrenmeye ilişkin 8. öğreticimizdir. MPLABX kurulumundan PIC MCU ile bir LCD kullanmaya kadar tüm yolu bulduk. Eğer burada yeniyseniz, zamanlayıcıları, yanıp sönen LED'i, LCD arayüzünü vb. Öğrenebileceğiniz önceki eğitimlere bakın. Tüm PIC Öğreticilerimizi burada bulabilirsiniz. Son eğitimimizde 16 * 2 LCD ekranımızla Özel karakterleri nasıl oluşturabileceğimizi gördük, şimdi kendimizi 7 segmentli ekran adı verilen başka bir ekran modülüyle donatalım ve PIC Mikrodenetleyici ile arayüz oluşturalım.
16x2 LCD, 7 segmentli ekrandan çok daha rahat olmasına rağmen, 7 segmentli bir ekranın bir LCD ekrandan daha kullanışlı olacağı birkaç senaryo vardır. LCD, küçük karakter boyutuna sahip olmanın dezavantajından muzdariptir ve sadece bazı sayısal değerleri görüntülemeyi planlıyorsanız, projeniz için gereğinden fazla olacaktır. 7 segment ayrıca zayıf aydınlatma koşullarına karşı avantaja sahiptir ve normal bir LCD ekrana göre daha büyük açılardan görüntülenebilir. Öyleyse, bilmeye başlayalım.
7 Segment ve 4 Haneli 7 Segment Görüntüleme Modülü:
7 Segment Ekranın içinde yedi segment vardır ve her segmentte karşılık gelen segmentleri aydınlatarak sayıları görüntülemek için bir LED bulunur. Örneğin, 7 segmentin "5" sayısını görüntülemesini istiyorsanız, ilgili pimleri yüksek yaparak a, f, g, c ve d segmentlerini parlatmanız gerekir. İki tür 7 segmentli ekran vardır: Ortak Katot ve Ortak Anot, burada Ortak Katot yedi segmentli ekranı kullanıyoruz. Burada 7 segment görüntüleme hakkında daha fazla bilgi edinin.
Artık tek bir 7 segmentli ekranda istediğimiz sayısal karakterin nasıl görüntüleneceğini biliyoruz. Ancak, birden fazla rakam içeren herhangi bir bilgiyi iletmek için birden fazla 7 segmentli ekrana ihtiyacımız olacağı oldukça açıktır. Dolayısıyla, bu eğitimde aşağıda gösterildiği gibi 4 basamaklı 7 Segmentli Görüntüleme Modülü kullanacağız.
Gördüğümüz gibi birbirine bağlı Dört Yedi Segment Ekran var. Her 7 segmentli modülün 10 pinli olacağını ve 4 yedi segmentli ekran için toplamda 40 pin olacağını biliyoruz ve herhangi birinin bunları bir nokta kartında lehimlemesinin telaşlı olacağını biliyoruz, bu yüzden herhangi birinin bir modül satın almasını şiddetle tavsiye ederim veya 4 basamaklı 7 segmentli bir ekran kullanmak için kendi PCB'nizi yapın. Aynısı için bağlantı şeması aşağıda gösterilmiştir:
4 basamaklı yedi bölümlü modülün nasıl çalıştığını anlamak için yukarıdaki şemalara bakmalıyız, gösterildiği gibi dört ekranın tümünün A pinleri bir A olarak toplanır ve B, C…. için DP'ye kadar aynıdır. Yani, temelde A'yı tetiklerse, dört A'nın tümü yüksek olmalı, değil mi?
Ancak bu olmaz. D0'dan D3'e (D0, D1, D2 ve D3) dört pimden hangisinin yüksek çıkması gerektiğini kontrol etmek için kullanılabilecek ek dört pimimiz var. Örneğin: Çıktımın yalnızca ikinci ekranda mevcut olmasına ihtiyacım varsa, diğer pinleri (D0, D2 ve D3) düşük tutarken yalnızca D1 yüksek yapılmalıdır. Basitçe, D0'dan D3'e pinleri kullanarak hangi ekranın aktif hale gelmesi gerektiğini ve A'dan DP'ye pinleri kullanarak hangi karakterin görüntüleneceğini seçebiliriz.
PIC Mikrodenetleyiciyle 4 Haneli Yedi Segment Modülü Bağlama:
Burada PIC mikro denetleyici PIC16F877A kullandık ve devre için şematik aşağıda gösterilmiştir.
Modülden 12 çıkış pinimiz var, bunlardan 8'i karakterleri görüntülemek için, dördü ise dört ekrandan birini seçmek için kullanılıyor. Bu nedenle, tüm 8 karakterli pinler PORTD'ye atanır ve ekran seçim pinleri PORTC'nin ilk dört pinine atanır.
Not: Modülün toprak pimi de burada gösterilmeyen MCU'nun topraklamasına bağlanmalıdır.
PIC16F877A kullanarak programlama:
Şimdi, bu modülün gerçekte nasıl çalıştığını bildiğimize göre, PIC16F877A'yı 4 haneli bir sayı göstermesi için nasıl programlayacağımızı öğrenelim. Bir değişkeni 0'dan 1000'e çıkaralım ve 7 segmentli ekranda yazdıralım. MPLABX programını başlatın ve yeni proje oluşturun, yapılandırma bitleriyle başlayalım.
#pragma config FOSC = HS // Osilatör Seçim bitleri (HS osilatörü) #pragma config WDTE = KAPALI // Watchdog Zamanlayıcı Etkin bit (WDT devre dışı) #pragma config PWRTE = AÇIK // Güç Zamanlayıcı Etkinleştirme biti (PWRT etkin) # pragma config BOREN = ON // Brown-out Reset Etkinleştirme biti (BOR etkin) #pragma config LVP = OFF // Düşük Voltaj (Tek Besleme) Devre İçi Seri Programlama Etkinleştirme biti (RB3 dijital G / Ç, HV açık MCLR, programlama için kullanılmalıdır) #pragma config CPD = OFF // Veri EEPROM Hafıza Kodu Koruma biti (Veri EEPROM kod koruması kapalı) #pragma config WRT = OFF // Flash Program Hafızası Yazmayı Etkinleştir bitleri (Yazma koruması kapalı; tüm program hafızası EECON kontrolü ile yazılabilir) #pragma config CP = OFF // Flash Program Hafıza Kodu Koruma biti (Kod koruması kapalı)
Her zamanki gibi, bu bitleri ayarlamak için yapılandırma bitlerini ayarla penceresini kullanırız. Ne anlama geldiklerinden emin değilseniz, buradaki LED yanıp sönme eğitimini ziyaret edin.
Ardından, ekranın her bir rakamı arasında geçiş yapmak için çıkış pinlerini tanımlayalım.
// *** Dört ekranın tümünün sinyal pinlerini tanımlayın *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Tanım sonu ** ////
Burada RC0, RC1, RC2 ve RC3 pinleri, 7 segmentli ekran modülümüzün dört hanesi arasında seçim yapmak için kullanılır. Bu pinler sırasıyla s1, s2, s3 ve s4 olarak tanımlanır.
Sonra , içinde aşağıdaki değişken bildirimine sahip olduğumuz void main () 'e atlayalım:
int i = 0; // görüntülenecek 4 basamaklı değer int bayrak = 0; // işaretsiz gecikme oluşturmak için int a, b, c, d, e, f, g, h; // sadece değişkenler işaretsiz int seg = {0X3F, // 0 0X06 sayısını görüntülemek için Hex değeri, // 1 sayısını görüntülemek için Hex değeri 0X5B, // 2 sayısını görüntülemek için Hex değeri 0X4F, // Gösterilecek Hex değeri 3 0X66 sayısı, // 4 sayısını görüntülemek için Hex değeri 0X6D, // 5 sayısını görüntülemek için Hex değeri 0X7C, // 6 sayısını görüntülemek için Hex değeri 0X07, // Hex değeri 7 0X7F sayısını görüntülemek için, / / 8 sayısını görüntülemek için onaltılık değer 0X6F // 9 sayısını görüntülemek için onaltılık değer}; // 0'dan 9'a kadar sayıları görüntülemek için Dizi Sonu
Burada i ve bayrak değişkenleri, sırasıyla gösterilecek değerlerin depolanması ve bir gecikme yaratılması için kullanılır. H işaretsiz bir tamsayı değişkenler tek haneli olarak dört haneli sayılar kırmak ve (daha sonra burada açıklanacak olan) saklamak için kullanılır.
Burada dikkat edilmesi gereken önemli bir nokta, "seg" dizi bildirimi. Bu programda, Array adlı yeni bir veri türü kullanıyoruz. Dizi, benzer veri türü değerlerinin bir koleksiyonundan başka bir şey değildir. Burada, bu diziyi, 0'dan 9'a kadar bir sayıyı görüntülemek için tüm eşdeğer onaltılı değerleri depolamak için kullandık.
Dizinin adresi her zaman sıfırdan başlar. Dolayısıyla bu dizi, aşağıda gösterilen sayı ile aynı adreste saklanan sayısal bir sayının (0-9) onaltılık değerine sahip olacaktır.
Değişken: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
Hex Kodu: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Eq. Sayısal sayı: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Yani basitçe, 7-segmentinizde 0 rakamını görüntülemek istiyorsanız, segmenti arayabilirsiniz , aynı şekilde 6 rakamını görüntülemek istiyorsanız, sadece segment'i kullanmanız gerekir .
HEX değerinin gerçekte nasıl elde edildiğini anlamak için aşağıdaki tabloya bakalım. Her bir ondalık sayı için eşdeğer HEX değeri dizisinin depolanan belirli bir sayıda görüntülemek için çağrılabilir şekilde.
Şimdi, kodun G / Ç konfigürasyonu olan bir sonraki kısmına geçelim:
// ***** G / Ç Yapılandırması **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** G / Ç yapılandırmasının sonu ** ///
G / Ç konfigürasyonu basittir çünkü 7 segmentimizdeki tüm pinler çıkış pinleridir ve bağlantılar yukarıdaki devre şemasında gösterilmektedir, bu yüzden onları çıkış olarak ilan edin ve sıfır olarak başlatın.
Şimdi sonsuz döngümüze atlayalım (while (1)). Burada "i" nin değerini dört haneye bölmek ve bunları 7 segmentte göstermek zorundayız. Önce "i" nin değerini bölerek başlayalım.
// *** "i" yi dört haneye bölmek *** // a = i% 10; // 4. rakam buraya kaydedilir b = i / 10; c = b% 10; // 3. rakam buraya kaydedilir d = b / 10; e = d% 10; // 2. rakam buraya kaydedilir f = d / 10; g = f% 10; // 1. rakam buraya kaydedilir h = f / 10; // *** Bölmenin sonu *** //
Basit modül ve bölme işlemi kullanılarak 4 basamaklı sayı (i) ayrı ayrı sayılara ayrılır. Bizim durumumuzda "i" değerinin 4578 olduğu bir örnek alalım. O zaman bu sürecin sonunda g = 4, e = 5, c = 7 ve a = 8 değişkeni. Yani şimdi her bir rakamı sadece o değişkeni kullanarak görüntülemek kolay olacak.
PORTD = segment; s1 = 1; // Ekran 1'i açın ve 4. rakamı yazdırın __delay_ms (5); s1 = 0; // 5ms gecikmeden sonra 1. ekranı kapat PORTD = seg; s2 = 1; // Ekran 2'yi açın ve 3. rakamı yazdır __delay_ms (5); s2 = 0; // 5ms gecikmeden sonra 2. ekranı kapat PORTD = seg; s3 = 1; // Gösterge 3'ü açın ve 2. basamağı yazdırın __delay_ms (5); s3 = 0; // 5 ms gecikmeden sonra 3'ü KAPAT PORTD = seg; s4 = 1; // display 4'ü aç ve 1. rakamı yazdır __delay_ms (5); s4 = 0; // 5 ms gecikmeden sonra ekranı 4 kapat
Burası, MCU'nun 7-segment ile konuştuğu gerçek yerdir. Bildiğimiz gibi , bir seferde yalnızca bir rakam görüntüleyebiliyoruz, ancak görüntülenecek dört rakamımız var ve yalnızca dört hanenin tümü Açık ise, dört rakamın tamamı kullanıcı tarafından görülebilir.
Peki bununla nasıl gideceğiz?
Şanslıyız ki, MCU'muz insan gözünden çok daha hızlı, yani aslında yaptığımız şey: her seferinde bir rakam görüntülüyoruz ama yukarıda gösterildiği gibi bunu çok hızlı yapıyoruz.
MCU ve 7-segmentin işleyebilmesi için 5ms beklediği bir hane ekranı seçip ardından o rakamı kapatıp bir sonraki rakama geçip son rakama ulaşana kadar aynısını yapıyoruz. Bu 5 ms'lik gecikme insan gözü tarafından görülemez ve dört hanenin tümü aynı anda Açık olarak görünür.
İşte bu, son olarak, aşağıda gösterildiği gibi bir gecikme kullanarak görüntülenen hanenin değerini artırıyoruz.
if (bayrak> = 100) // bayrak 100'e ulaşana kadar bekleyin {i ++; bayrak = 0; // sadece bayrak yüz ise "i" artırılır} bayrak ++; // her flaş için artış işareti
Gecikme, bir numaradan diğerine geçmek için geçen sürenin, değişikliği fark etmemize yetecek kadar uzun olması için kullanılır.
Tam kod aşağıda verilmiştir ve süreci de açıklanmıştır video sonunda.
Donanım Kurulumu ve Testi:
Her zaman olduğu gibi, donanımımıza geçmeden önce Proteus kullanarak programı simüle etmemize izin verin. Simülasyon başarılıysa bunun gibi bir şey görmelisiniz
Bu proje karmaşık bir donanım kurulumuna sahip değil, yine LED yanıp sönme Eğitiminde oluşturduğumuz aynı PIC Mikroişlemci kartını kullanıyoruz. Bağlantı şemasına göre 7 segmentli Modülü PIC Mikrodenetleyici kartınıza bağlamanız yeterlidir. Bağlantıları bitirdikten sonra, PicKit 3 programlayıcınızı kullanarak kodu boşaltın ve çıktınızın keyfini çıkarın.