Lập trình STM32 quét led 7 thanh hiển thị nhiều số

lap trinh stm32 quét led 7 thanh

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ĩ.

7 Segment Display Number Formation Segment Contol

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ẻ.
Common Anode 7 Segment Display Internal Working
Led 7 thanh Anot chung
Common Cathode 7 Segment Display Internal Working
Led 7 thanh Katot chung

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:

bang su that kathot chung
Bảng sự thật Katot chung
bang su that anot chung
Bảng sự thật Anot chung

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.

STM32 Led 7 thanh

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.

STM32 led 7 seg 1

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

STM32 led 7 seg 2

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

STM32 led 7 seg 3

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

STM32 led 7 seg 6

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.

STM32 led 7 seg 4

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

STM32 led 7 seg 5

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.

quet led 7
Quét led 7 với tốc độ tăng dần

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ý

7 Segment Display Interfacing With STM32

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.

STM32 led 7 seg 7

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.

STM32 led 7 seg 8

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.

STM32 led 7 seg 9

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).

STM32 led 7 seg 10

Để 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.

STM32 led 7 seg 11

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ị.

STM32 led 7 seg 12

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í đó.

STM32 led 7 seg 13

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

5/5 - (2 bình chọn)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *