- Mô-đun hiển thị 7 phân đoạn và 4 chữ số 7 phân đoạn:
- Kết nối Mô-đun phân đoạn 4 chữ số 7 với Bộ vi điều khiển PIC:
- Lập trình bằng PIC16F877A:
- Thiết lập và kiểm tra phần cứng:
Đây là hướng dẫn thứ 8 của chúng tôi về Học vi điều khiển PIC sử dụng MPLAB và XC8. Chúng tôi đã đưa ra tất cả các cách từ cài đặt MPLABX đến sử dụng màn hình LCD với PIC MCU. Nếu bạn là người mới ở đây, hãy xem các hướng dẫn trước đây, nơi bạn có thể tìm hiểu bộ hẹn giờ, đèn LED nhấp nháy, màn hình LCD giao diện, v.v. Bạn có thể tìm thấy tất cả các Hướng dẫn PIC của chúng tôi tại đây. Trong hướng dẫn cuối cùng của chúng tôi, chúng tôi đã xem cách chúng tôi có thể tạo các ký tự Tùy chỉnh với màn hình LCD 16 * 2, bây giờ chúng ta hãy tự trang bị cho mình một loại mô-đun hiển thị khác được gọi là màn hình 7 đoạn và giao diện nó với Vi điều khiển PIC.
Mặc dù LCD 16x2 thoải mái hơn nhiều so với màn hình 7 đoạn nhưng có rất ít trường hợp mà màn hình 7 đoạn sẽ thuận tiện hơn màn hình LCD. LCD có nhược điểm là có kích thước ký tự thấp và sẽ quá mức cần thiết cho dự án của bạn nếu bạn chỉ định hiển thị một số giá trị số. 7-phân đoạn cũng có lợi thế trong điều kiện ánh sáng kém và có thể được nhìn từ các góc độ bằng màn hình LCD thông thường. Vì vậy, chúng ta hãy bắt đầu biết nó.
Mô-đun hiển thị 7 phân đoạn và 4 chữ số 7 phân đoạn:
7 Phân đoạn Hiển thị có bảy phân đoạn và mỗi phân đoạn có một đèn LED bên trong để hiển thị các con số bằng cách chiếu sáng các phân đoạn tương ứng. Giống như nếu bạn muốn phân đoạn 7 hiển thị số "5" thì bạn cần làm phát sáng phân đoạn a, f, g, c và d bằng cách làm cao các chân tương ứng của chúng. Có hai loại màn hình 7 đoạn: Cathode chung và Anode chung, ở đây chúng tôi đang sử dụng màn hình hiển thị bảy đoạn Cathode chung. Tìm hiểu thêm về hiển thị 7 đoạn tại đây.
Bây giờ chúng ta biết cách hiển thị ký tự số mong muốn trên một màn hình 7 đoạn. Nhưng, rõ ràng là chúng ta sẽ cần nhiều hơn một màn hình 7 đoạn để truyền tải bất kỳ thông tin nào có nhiều hơn một chữ số. Vì vậy, trong hướng dẫn này, chúng tôi sẽ sử dụng Mô-đun hiển thị 7 phân đoạn gồm 4 chữ số như hình bên dưới.
Như chúng ta thấy có Bốn Màn hình Bảy Phân đoạn được kết nối với nhau. Chúng tôi biết rằng mỗi mô-đun 7 phân đoạn sẽ có 10 chân và đối với 4 màn hình bảy phân đoạn sẽ có tổng cộng 40 chân và sẽ rất bận rộn cho bất kỳ ai hàn chúng trên bảng chấm, vì vậy tôi rất khuyên mọi người nên mua một mô-đun hoặc tạo PCB của riêng bạn để sử dụng màn hình 7 đoạn 4 chữ số. Sơ đồ kết nối cho cùng một được hiển thị bên dưới:
Để hiểu cách hoạt động của mô-đun 4 chữ số bảy phân đoạn, chúng ta phải xem xét các sơ đồ trên, như thể hiện các chân A của cả bốn màn hình được kết nối để tập hợp thành một A và giống nhau cho B, C…. cho đến DP. Vì vậy, về cơ bản nếu kích hoạt A bật, thì cả bốn chữ A sẽ tăng cao phải không?
Nhưng, điều đó không xảy ra. Chúng tôi có thêm bốn chân từ D0 đến D3 (D0, D1, D2 và D3) có thể được sử dụng để điều khiển màn hình nào trong số bốn chân này sẽ tăng cao. Ví dụ: Nếu tôi cần đầu ra của mình chỉ xuất hiện trên màn hình thứ hai thì chỉ nên đặt D1 ở mức cao trong khi giữ các chân khác (D0, D2 và D3) ở mức thấp. Đơn giản, chúng ta có thể chọn màn hình nào phải hoạt động bằng các chân từ D0 đến D3 và ký tự nào sẽ được hiển thị bằng các chân từ A đến DP.
Kết nối Mô-đun phân đoạn 4 chữ số 7 với Bộ vi điều khiển PIC:
Ở đây chúng tôi đã sử dụng vi điều khiển PIC PIC16F877A và sơ đồ cho mạch được hiển thị bên dưới.
Chúng tôi có 12 chân đầu ra từ mô-đun, trong đó 8 chân được sử dụng để hiển thị các ký tự và bốn chân được sử dụng để chọn một hiển thị trong số bốn. Do đó, tất cả 8 chân ký tự được gán cho PORTD và các chân lựa chọn hiển thị được gán cho bốn chân đầu tiên của PORTC.
Lưu ý: Chân nối đất của mô-đun cũng phải được kết nối với đất của MCU không được hiển thị ở đây.
Lập trình bằng PIC16F877A:
Bây giờ, chúng ta đã biết mô-đun này thực sự hoạt động như thế nào, hãy cùng tìm hiểu cách lập trình PIC16F877A để làm cho nó hiển thị một số có 4 chữ số. Hãy để chúng tôi tăng một biến từ 0 đến 1000 và in nó trên màn hình 7 đoạn. Khởi chạy chương trình MPLABX và tạo dự án mới, chúng ta hãy bắt đầu với các bit cấu hình.
#pragma config FOSC = HS // Các bit chọn bộ tạo dao động (bộ tạo dao động HS) #pragma config WDTE = OFF // Bit Enable Watchdog Timer (WDT đã bị vô hiệu hóa) #pragma config PWRTE = ON // Bít bật bộ hẹn giờ bật nguồn (PWRT đã bật) # pragma config BOREN = ON // Brown-out Reset bit Enable bit (BOR enable) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming bit (RB3 là I / O kỹ thuật số, HV bật MCLR phải được sử dụng để lập trình) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Ghi bảo vệ tắt; tất cả bộ nhớ chương trình có thể được ghi vào bởi điều khiển EECON) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code Protection Off)
Như thường lệ, chúng tôi sử dụng cửa sổ đặt các bit cấu hình để đặt các bit này. Nếu bạn không chắc chắn ý nghĩa của chúng thì hãy truy cập hướng dẫn nhấp nháy đèn LED tại đây.
Tiếp theo, chúng ta hãy xác định các chân đầu ra để chuyển đổi giữa mỗi chữ số của màn hình.
// *** Xác định các chân tín hiệu của cả bốn màn hình *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Kết thúc định nghĩa ** ////
Ở đây các chân RC0, RC1, RC2 và RC3 được sử dụng để lựa chọn giữa bốn chữ số của mô-đun hiển thị 7 đoạn của chúng tôi. Các chân này được xác định lần lượt là s1, s2, s3 và s4.
Tiếp theo, chúng ta hãy chuyển đến void main (), bên trong chúng ta có khai báo biến sau:
int i = 0; // giá trị 4 chữ số sẽ được hiển thị int flag = 0; // để tạo delay unsigned int a, b, c, d, e, f, g, h; // chỉ các biến không dấu int seg = {0X3F, // Giá trị hex để hiển thị số 0 0X06, // Giá trị hex để hiển thị số 1 0X5B, // Giá trị hex để hiển thị số 2 0X4F, // Giá trị hex để hiển thị số 3 0X66, // Giá trị hex để hiển thị số 4 0X6D, // Giá trị hex để hiển thị số 5 0X7C, // Giá trị hex để hiển thị số 6 0X07, // Giá trị hex để hiển thị số 7 0X7F, / / Giá trị hex để hiển thị số 8 0X6F // Giá trị hex để hiển thị số 9}; // Cuối Mảng để hiển thị các số từ 0 đến 9
Ở đây, các biến i và cờ được sử dụng để lưu trữ các giá trị được hiển thị và tạo độ trễ tương ứng. Các biến số nguyên không dấu từ a đến h được sử dụng để chia các số có bốn chữ số thành các chữ số duy nhất và lưu trữ chúng (sẽ được giải thích sau ở đây).
Một điều quan trọng cần lưu ý ở đây là khai báo mảng "seg" . Trong chương trình này, chúng tôi đang sử dụng một kiểu dữ liệu mới gọi là Array. Mảng không là gì ngoài một tập hợp các giá trị kiểu dữ liệu tương tự. Ở đây, chúng tôi đã sử dụng mảng này để lưu trữ tất cả các giá trị hex tương đương để hiển thị một số từ 0 đến 9.
Địa chỉ của mảng luôn bắt đầu từ số không. Vì vậy, mảng này sẽ có giá trị hex của một số (0-9) được lưu trữ trong địa chỉ giống với địa chỉ của số như hình dưới đây
Biến đổi: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
Mã Hex: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Phương trình Số: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
số 8 |
9 |
Vì vậy, đơn giản, nếu bạn muốn hiển thị số 0 trên đoạn 7 của mình, bạn có thể gọi seg, tương tự như vậy nếu bạn muốn hiển thị số 6, bạn chỉ cần sử dụng seg.
Để hiểu giá trị HEX thực sự được lấy như thế nào, chúng ta hãy xem bảng dưới đây. Các giá trị HEX tương đương cho mỗi số thập phân được lưu trữ trong mảng để nó có thể được gọi để hiển thị một số cụ thể.
Bây giờ, chúng ta hãy chuyển sang phần tiếp theo của mã là cấu hình I / O:
// ***** Cấu hình I / O **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** Kết thúc cấu hình I / O ** ///
Cấu hình I / O rất đơn giản vì tất cả các chân trên đoạn 7 của chúng ta là chân đầu ra và các kết nối được hiển thị trong sơ đồ mạch ở trên, vì vậy chỉ cần khai báo chúng là đầu ra và khởi tạo chúng bằng 0.
Bây giờ chúng ta hãy nhảy vào vòng lặp vô hạn của chúng ta (while (1)). Ở đây chúng ta phải chia giá trị của "i" thành bốn chữ số và hiển thị chúng trên đoạn 7. Trước tiên, chúng ta hãy bắt đầu bằng cách tách giá trị trên "i"
// *** Tách "i" thành bốn chữ số *** // a = i% 10; // Chữ số thứ 4 được lưu ở đây b = i / 10; c = b% 10; // Chữ số thứ 3 được lưu ở đây d = b / 10; e = d% 10; // Chữ số thứ 2 được lưu ở đây f = d / 10; g = f% 10; // Chữ số 1 được lưu ở đây h = f / 10; // *** Kết thúc quá trình tách *** //
Bằng cách sử dụng mô đun đơn giản và phép chia, số 4 chữ số (i) được tách thành các số riêng lẻ. Trong trường hợp của chúng ta, chúng ta hãy lấy một ví dụ trong đó giá trị của "i" là 4578. Sau đó, ở cuối quá trình này, biến g = 4, e = 5, c = 7 và a = 8. Vì vậy, bây giờ sẽ dễ dàng hiển thị từng chữ số bằng cách sử dụng biến đó.
PORTD = seg; s1 = 1; // BẬT màn hình 1 và in chữ số thứ 4 __delay_ms (5); s1 = 0; // TẮT màn hình 1 sau 5ms trễ PORTD = seg; s2 = 1; // BẬT màn hình 2 và in chữ số thứ 3 __delay_ms (5); s2 = 0; // TẮT màn hình 2 sau 5ms trễ PORTD = seg; s3 = 1; // BẬT màn hình 3 và in chữ số thứ 2 __delay_ms (5); s3 = 0; // TẮT màn hình 3 sau độ trễ 5ms PORTD = seg; s4 = 1; // BẬT màn hình 4 và in chữ số đầu tiên __delay_ms (5); s4 = 0; // TẮT màn hình 4 sau độ trễ 5ms
Đây là nơi thực tế mà MCU nói chuyện với 7 phân đoạn. Như chúng ta biết, chúng ta chỉ có thể hiển thị một chữ số tại một thời điểm, nhưng chúng ta có bốn chữ số được hiển thị và chỉ khi tất cả bốn chữ số đó. Trên bốn chữ số hoàn chỉnh, người dùng sẽ hiển thị.
Vì vậy, làm thế nào để chúng tôi đi với điều này?
May mắn cho chúng tôi là MCU của chúng tôi nhanh hơn mắt người rất nhiều, vì vậy những gì chúng tôi thực sự làm: chúng tôi hiển thị một chữ số tại một thời điểm nhưng chúng tôi thực hiện rất nhanh như được hiển thị ở trên.
Chúng tôi chọn hiển thị một chữ số, đợi 5ms để MCU và 7 phân đoạn có thể xử lý nó, sau đó tắt chữ số đó và chuyển sang chữ số tiếp theo và làm tương tự cho đến khi chúng ta đạt đến chữ số cuối cùng. Mắt người không thể quan sát thấy độ trễ 5ms này và tất cả bốn chữ số dường như được Bật cùng một lúc.
Vậy là xong, cuối cùng chúng ta chỉ tăng giá trị của chữ số được hiển thị bằng cách sử dụng độ trễ như hình dưới đây
if (flag> = 100) // đợi đến khi flag đạt 100 {i ++; flag = 0; // chỉ khi cờ là hàng trăm "i" sẽ được tăng lên} flag ++; // cờ tăng cho mỗi lần nhấp nháy
Độ trễ được sử dụng để thời gian chuyển từ số này sang số khác đủ lâu để chúng tôi nhận thấy sự thay đổi.
Các mã hoàn chỉnh được đưa ra dưới đây và quá trình này cũng được giải thích trong video ở cuối.
Thiết lập và kiểm tra phần cứng:
Như mọi khi, chúng ta hãy mô phỏng chương trình bằng Proteus trước khi chúng ta thực sự sử dụng phần cứng của mình. Nếu mô phỏng thành công, bạn sẽ thấy một cái gì đó như thế này
Dự án này không có bất kỳ thiết lập phần cứng phức tạp nào, chúng tôi lại đang sử dụng cùng một bảng Vi điều khiển PIC mà chúng tôi đã tạo trong Hướng dẫn nhấp nháy đèn LED. Chỉ cần kết nối Mô-đun 7 đoạn với bo mạch Vi điều khiển PIC của bạn theo sơ đồ kết nối. Khi bạn đã hoàn tất các kết nối, chỉ cần kết xuất mã bằng cách sử dụng lập trình PicKit 3 của bạn và đó là nó tận hưởng đầu ra của bạn.