Trong bài này chúng ta sẽ cùng tìm hiểu cách sử dụng STM32 quét LED 7 thanh (LED 7 seg): tìm hiểu cách hoạt động của LED 7 thanh, phương pháp quét là gì và cách triển khai code với STM32.
Bài 3 phần device trong Serie Học STM32 từ A tới Z
Led 7 thanh là gì?
LED 7 đoạn (7 thanh) là thiết bị hiển thị điện tử dùng để hiển thị số. Mỗi đoạn sáng lên sẽ hiển thị một phần của chữ số. LED 7 đoạn được sử dụng rộng rãi trong đồng hồ số, máy tính bỏ túi hay các thiết bị điện tử khác.
Ngày nay LED 7 thanh vẫn được ưa chuộng bởi đặc tính rẻ, bền và khá thẩm mĩ.

Cấu tạo led 7 thanh
LED 7 đoạn bao gồm 8 LED đơn có chung 1 cực, để có thể thắp sáng hiển thị các số và chữ “0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F, …”.
- Mỗi đoạn LED được đánh dấu từ A tới G.
- Đoạn thứ tám gọi là “chấm thập phân” (Decimal Point), ký hiệu DP, được sử dụng khi hiển thị số không phải là số nguyên
Dựa vào cực chung nối với nguồn, LED 7 thanh được phân thành 2 loại:
- Loại dương chung (Common Anode): cực dương (anode) của tất cả 8 LED được nối với nhau, các cực âm (cathode) đứng riêng lẻ.
- Loại âm chung (Common Cathode): cực âm (cathode) của tất cả 8 LED được nối với nhau, các cực dương (anode) đứng riêng lẻ.


Cách hoạt động của Led 7 thanh
Nguyên tắc chung: muốn LED nào sáng thì LED đó phải được phân cực thuận. Do đó muốn tạo ra chữ số nào, ta chỉ cần cho các đoạn LED ở vị trí tương ứng sáng lên.
Vì LED 7 thanh có 8 đoạn LED, nên chúng ta thường sử dụng 1 byte để điều khiển 1 LED 7 thanh, mỗi bit ứng với 1 đoạn. Byte này thường được biểu diễn dạng HEX, đổi sang dạng nhị phân (BIN) sẽ thấy rõ đoạn nào sáng, đoạn nào tắt.
Để biểu diễn một số tương ứng với mã HEX, chúng ta có bảng sự thật (truth table) như sau:


Kết luận: để LED 7 thanh hiển thị đúng chúng ta cần:
- Nối chân chung vào nguồn: lên VCC với loại Anot chung, xuống GND với loại Katot chung
- Xuất các giá trị trong bảng sự thật ra các chân điều khiển đoạn để hiển thị số tương ứng
Lập trình STM32 hiển thị led 7 thanh
Sơ đồ nguyên lý
Chúng ta sẽ đấu nối theo sơ đồ sau, sử dụng LED 7 thanh Katot chung.

Trên CubeMX chúng ta setup các chân điều khiển ở chế độ Output Push Pull.
Lập trình trên Keil C
Đầu tiên download thư viện LED7 tại đây: https://github.com/nguyenkhue2608/STM32_Device_Lib
Sau đó copy thư mục LED7SEG vào thư mục của project.

Thêm đường dẫn tới thư viện vừa copy.

Trong main.c chúng ta #include "LED7SEG.h" và add LED7SEG.c vào project.

Khởi tạo một LED 7 thanh với lệnh: LED7SEG_Device_Name LED7;

Init LED 7 thanh, truyền vào các chân điều khiển 8 đoạn (A tới G và DP) của LED 7.

Để in dữ liệu ra, chúng ta sử dụng lệnh LED7SEG_WriteOneNumber(&LED7, 1);

Kết quả
Chúng ta đã hiển thị được số ra 1 LED 7 thanh.
Phương pháp quét nhiều Led 7 thanh
Phương pháp quét led 7 thanh là gì?
Quét LED là phương pháp chỉ cho 1 LED 7 thanh sáng trong 1 khoảng thời gian ngắn rồi tắt đi, chuyển sang cho LED tiếp theo sáng, cứ lần lượt như vậy. Nếu việc chuyển đổi đủ nhanh, mỗi LED sẽ được bật lại trước khi mắt kịp nhận ra nó đã tắt (nhờ hiện tượng lưu ảnh của mắt), nên ta có cảm giác tất cả các LED sáng đồng thời, dù thực tế chúng sáng tắt liên tục. Giống như hình ảnh trên màn hình tivi hay rạp chiếu phim, thực chất là các khung hình rời rạc nối tiếp nhau.
Chu kỳ quét là thời gian từ lúc 1 LED bắt đầu sáng tới lúc LED đó sáng lần tiếp theo. Thông thường chỉ cần quét lại mỗi LED nhiều hơn khoảng 24 lần/giây là mắt người đã khó phân biệt sự sáng tắt, trên thực tế nên chọn khoảng 50 – 100 lần/giây để không thấy nhấp nháy.

Quét led 7 thanh để làm gì?
Khi chúng ta có nhiều LED 7 thanh cần hiển thị, mỗi LED 7 thanh sẽ cần 8 chân điều khiển đoạn. Nếu điều khiển riêng từng LED, số chân vi điều khiển sẽ tăng lên bằng số LED 7 thanh x 8. Điều này là không khả thi khi số chân của vi điều khiển có hạn.
Với phương pháp quét, các LED dùng chung 8 chân đoạn, nên chúng ta chỉ cần 8 chân + số LED 7 thanh cần quét (mỗi LED thêm 1 chân điều khiển cực chung):
VD: nếu bạn quét 4 LED, bạn sẽ chỉ dùng 8 + 4 = 12 chân, thay vì 8 x 4 = 32 chân nếu điều khiển riêng từng LED.
Lập trình STM32 quét led 7 thanh
Sơ đồ nguyên lý

Chúng ta cấu hình thêm 4 chân điều khiển 4 LED tương ứng với các số hàng nghìn, trăm, chục, đơn vị.
Lưu ý: Chân chung của mỗi LED 7 thanh phải chịu dòng của cả 8 đoạn cùng lúc (8 đoạn x 10mA = 80mA), vượt xa giới hạn khoảng 25mA của 1 chân GPIO STM32. Vì vậy hãy dùng transistor (hoặc IC đệm) để đóng cắt chân chung, và luôn có điện trở hạn dòng (khoảng 220Ω – 330Ω) trên mỗi chân đoạn. Nối thẳng chân chung vào GPIO thì LED sẽ mờ và lâu dần làm hỏng chân vi điều khiển.
Lập trình trên Keil C
Khai báo thêm LED7SEG_Num LED_TEMP; để chứa các chân điều khiển của các LED.

Sử dụng hàm LED7SEG_InitScan4Led(&LED_TEMP, LED1_GPIO_Port, LED1_Pin, LED2_GPIO_Port,LED2_Pin, LED3_GPIO_Port,LED3_Pin, LED4_GPIO_Port,LED4_Pin); để truyền vào các chân điều khiển LED.

Trong while sử dụng hàm LED7SEG_Scan4Led(&LED_TEMP, &LED7, 2345); để quét LED, sau đó delay 200, nghĩa là cập nhật LED 7 thanh mỗi 200ms.

Kết quả
Chúng ta đã hiển thị được LED 7 thanh nhiều số.
Lưu ý: Hàm quét phải được gọi đều đặn với chu kỳ ngắn (mỗi LED chỉ nên sáng khoảng 2 – 5ms). Nếu vòng while có delay dài hoặc code khác chạy lâu, các LED sẽ bị nháy, hoặc chữ số được quét cuối cùng sáng hơn hẳn các số còn lại. Cách tốt nhất là đưa hàm quét vào callback ngắt Timer (ví dụ ngắt mỗi 2ms quét 1 LED), để việc hiển thị không bị ảnh hưởng bởi các code khác trong while.
Giải thích thư viện quét led 7 thanh
Chúng ta khai báo bảng sự thật cho LED 7 thanh thông qua 2 mảng (Anot chung và Katot chung).

Để ghi dữ liệu lên các chân đoạn A tới DP, chúng ta sử dụng hàm sau. Biểu thức & 0x01 tới & 0x80 là lấy từng bit của giá trị trong bảng sự thật, sau đó dùng toán tử 3 ngôi ? : để quyết định ghi 0 hay 1 ra chân GPIO.

Hàm chuyển đổi số int thành struct bao gồm các chữ số hàng chục nghìn, hàng nghìn, hàng trăm, hàng chục, hàng đơn vị.

Hàm scan LED sẽ lần lượt bật từng LED (tắt các LED còn lại), sau đó ghi dữ liệu của chữ số ở vị trí đó.

Kết
Vậy là chúng ta đã học được cách sử dụng LED 7 thanh. Các bạn có thể download source code tại: https://github.com/nguyenkhue2608/STM32_Device_Exam
Nếu thấy bài viết này hay, hãy chia sẻ tới những người bạn học hay đồng nghiệp của mình. Và nếu thắc mắc điều gì, hãy để lại bình luận nhé.
Và cùng gia nhập những người nghiện lập trình tại đây nhé: Hội anh em nghiện lập trình

