Bài viết này giới thiệu cách ghép nối và lập trình điều khiển LED 7-đoạn với bo mạch FRDM-KL46Z bằng phương pháp quét động để tiết kiệm số chân điều khiển và công suất tiêu thụ của hệ thống.
Bạn đọc có thể tìm mua bo mạch ở đây (Đang có chương trình khuyến mại giảm giá 15%).
Một thiết bị đầu ra để hiển thị thông tin dùng đèn LED phổ biến khác là đèn LED bảy đoạn. Đèn LED 7-đoạn có 2 loại là loại cực dương chung (common anode) và cực âm chung (common cathode). Với loại có cực dương chung, cực chung này của đèn LED 7-đoạn được điều khiển bởi nguồn cung cấp dương và vi điều khiển điều khiển các cực âm riêng lẻ tới mức logic 0 để tạo dòng điện làm từng đoạn LED phát sáng. Trong cấu hình này, khả năng tạo nguồn nhận dòng của vi điều khiển là rất quan trọng. Với loại cực âm chung, cực chung này của đèn LED 7-đoạn được nối đất và vi điều khiển điều khiển các cực dương riêng lẻ tới mức logic 1 để làm sáng từng đoạn LED. Trong cấu hình này, chân vi điều khiển phải cung cấp đủ nguồn dòng cho từng đoạn LED. Trong cả hai cấu hình, nếu vi điều khiển không có đủ khả năng phát dòng điện hoặc nhận dòng điện, chúng ta phải chèn thêm một bộ đệm giữa đèn LED 7-doạn và vi điều khiển. Bộ đệm cho đèn LED 7-đoạn có thể là vi mạch tích hợp hoặc các transistor rời.
Bảy thanh LED của đèn LED 7-đoạn được gán các tên lần lượt là a, b, c, d, e, f và g như chỉ ra trong Hình 3‑13. Như vậy, một byte dữ liệu là đủ để điều khiển tất cả các thanh LED của LED 7-đoạn. Trong ví dụ dưới (Hình 3‑14), thanh a được gán tới chân D0, thanh b được gán tới chân D1, … trong đó D0-D7 là các chân của một cổng trên vi điều khiển. Chú ý chân D7 được gán cho LED dấu phẩy thập phân.
Hình 3‑13. Cấu tạo đèn LED 7-đoạn.
Hình 3‑14. Gán các chân vi điều khiển tới mỗi thanh của LED 7-đoạn.
Bảng 3‑5 chỉ ra các mẫu điều khiển LED 7-đoạn cực âm chung để hiển thị các chữ số từ 0-9.
Bảng 3‑5. Mẫu điều khiển LED 7-đoạn cực âm chung hiển thị 10 chữ số thập phân.
Số | D7 (.) | D6 (g) | D5 (f) | D4 (e) | D3 (d) | D2 (c) | D1 (b) | D0 (a) | Giá trị HEX |
0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0x3F |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0x06 |
2 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0x5B |
3 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0x4F |
4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0x66 |
5 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0x6D |
6 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0X7D |
7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0x07 |
8 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0x7F |
9 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0x6F |
Hình 3‑15 và Hình 3‑16 minh họa cách ghép nối 2 LED 7-đoạn loại cực âm chung tới vi điều khiển. Mã nguồn chương trình điều khiển hiển thị một số nguyên gồm hai chữ số trên hai LED 7-đoạn được mô tả trong Chương trình 3‑7.
Hình 3‑15. Ghép nối vi điều khiển với LED 7-đoạn.
Hình 3‑16. Ghép nối vi điều khiển với LED 7-đoạn thông qua bộ đêm.
Lưu ý rằng, vì các đoạn giống nhau (cùng tên) trong 2 LED 7-đoạn được kết nối với cùng một chân cổng I/O, cực âm chung của mỗi LED 7-đoạn phải được điều khiển riêng sao cho tại một thời điểm xác định chỉ có một LED 7-đoạn được nối tới đất. Nói cách khác, hai LED 7-đoạn được điều khiển cho nối đất một cách luân phiên. Ví dụ, nếu chúng ta muốn hiển thị số “25” trên các đèn LED 7-đoạn, chương trình điều khiển phải thực hiện theo các bước sau:
- Cho phép cấp xung nhịp hệ thống tới các cổng thành PORTD và PORTE,
- Cấu hình cổng PORTD làm cổng đầu ra để điều khiển các đoạn LED,
- Cấu hình cổng PORTE làm cổng đầu ra để chọn một trong 2 LED được cấp nguồn,
- Viết mẫu điều khiển ứng với số 2 từ Bảng 3‑5 đến cổng PORTD,
- Đặt chân PTE1 thành CAO để cấp nguồn cho LED 7-đoạn ở vị trí chữ số hàng chục,
- Tạo một khoảng thời gian trễ,
- Viết mẫu điều khiển ứng với số 5 từ Bảng 3‑5 đến cổng PORTD,
- Đặt chân PTE0 thành CAO để cấp nguồn cho LED 7-đoạn ở vị trí chữ số hàng đơn vị,
- Tạo một khoảng thời gian trễ,
- Lặp lại từ bước 4 đến 9.
Lưu ý là trong thuật toán trên các LED 7-đoạn được điều khiển cấp nguồn một cách luân phiên ở một tần số quét nào đó. Nếu tần số quét quá thấp các chữ số sẽ xuất hiện nhấp nháy. Để loại bỏ hiện tượng nhấp nháy này thì ít nhất phải bật và tắt từng chữ số 60 lần mỗi giây. Như vậy, độ trễ cho bước 6 và 9 trong thuật toán trên nên khoảng là 8 mili = 1 giây/60/2 giây hoặc ít hơn.
Chương trình 3‑7: Hiển thị số 25 trên 2 LED 7-đoạn | |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/* LED7SEG.c: Display number 25 on a 2-digit 7-segment LED.
* Two common cathode 7-segment LEDs are used. * PTD0-6 are connected to segment A-G respectively. * PTE0 is used to control right digit (low for digit on). * PTE1 is used to control left digit (low for digit on). */ #include <MKL46Z4.H> void delayMs(int n); int main(void) { unsigned char digitPattern[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; /*from Bảng 3‑5*/ SIM->SCGC5 |= 0x1000; /* enable clock to Port D */ SIM->SCGC5 |= 0x2000; /* enable clock to Port E */ PORTD->PCR[0] = 0x100; /* make PTD0 pin as GPIO */ PORTD->PCR[1] = 0x100; /* make PTD1 pin as GPIO */ PORTD->PCR[2] = 0x100; /* make PTD2 pin as GPIO */ PORTD->PCR[3] = 0x100; /* make PTD3 pin as GPIO */ PORTD->PCR[4] = 0x100; /* make PTD4 pin as GPIO */ PORTD->PCR[5] = 0x100; /* make PTD5 pin as GPIO */ PORTD->PCR[6] = 0x100; /* make PTD6 pin as GPIO */ PTD->PDDR |= 0x7F; /* make PTD6-0 as output pins */ PORTE->PCR[0] = 0x100; /* make PTE0 pin as GPIO */ PORTE->PCR[1] = 0x100; /* make PTE1 pin as GPIO */ PTE->PDDR |= 0x03; /* make PTE1-0 as output pin */ for(;;) { PTD->PDOR = digitPattern[2]; /* drive pattern of 2 on the segments */ PTE->PSOR = 0x01; /* turn off right digit */ PTE->PCOR = 0x02; /* turn on left digit */ /* delay 8 ms will result in 16 ms per loop or 62.5 Hz */ delayMs(8); PTD->PDOR = digitPattern[5]; /* drive pattern of 5 on the segments */ PTE->PCOR = 0x01; /* turn on right digit */ PTE->PSOR = 0x02; /* turn off left digit */ delayMs(8); } } /* Delay n milliseconds * The CPU core clock is set to MCGFLLCLK at 41.94 MHz in SystemInit(). */ void delayMs(int n) { int i; int j; for(i = 0 ; i < n; i++) for (j = 0; j < 7000; j++) {} } |
Lưu ý trong Hình 3‑15, một chân đơn được sử dụng để chọn từng LED 7-đoạn. Điều đó có nghĩa là nếu chúng ta muốn có 4 chữ số, chúng ta phải sử dụng tổng cộng 12 chân. Đó là 8 chân cho các đoạn từ a đến g, dấu thập phân và 4 chân để chọn từng LED 7-đoạn. Điều này có thể không khả thi trong các ứng dụng mà chúng ta có số lượng chân vi điều khiển hạn chế.
Một giải pháp là sử dụng bộ giải mã cho việc lựa chọn các LED 7-đoạn. Ví dụ, bộ giải mã 74LS138 có thể được sử dụng cho hệ thống gồm 8 đèn LED 7-đoạn với chỉ ba chân lựa chọn được yêu cầu. Một phương pháp khác là sử dụng chip điều khiển LED 7-đoạn chuyên dụng chẳng hạn như MAX 7221 với chỉ một giao diện ghép nối 2 chân được yêu cầu. Một lợi thế nữa của MAX7221 là việc làm tươi các đoạn LED được xử lý bởi bản thân nó, vì vậy vi điều khiển không phải mất thời gian để làm tươi thông tin hiển thị trên các LED 7-đoạn và do đó có thể tập trung vào các tác vụ quan trọng khác. MAX7221 sử dụng giao diện ghép nối là I2C, đây là giao diện ghép nối mà phần lớn các bộ vi điều khiển đều tích hợp sẵn trên chip. Chúng ta sẽ thảo luận về giao diện I2C trong một chương riêng.