Lập trình điều khiển hiển thị LED 7 thanh trên STM32F103C8T6
Cao cấp hơn LED đơn một tí, hôm nay mình sẽ lập trình để hiển thị từ 1 đến 10 trên LED 7 thanh
Linh kiện sử dụng: STM32F103C8T6, ST-Link V2, LED 7 thanh anode chung, bread board, 7 điện trở 220 ohm, dây nối
I. LED 7 thanh
Mình thấy mọi người hay dùng loại 0.51 inch (hai hàng chân ở trên và dưới, viền dưới có mã 51BS), còn mình dùng loại 0.36 inch (2 hàng chân ở 2 bên trái và phải, cạnh sườn có mã 3611BS). À, đuôi BS là của loại anode (cực dương) chung, đuôi AS là của loại cathode chung.
Cách nối mạch
Nối chân A1 -> A7 của vi điều khiển qua trở 220 đến chân a -> g của LED 7 thanh.
II. Cấu hình trên CubeMX
-
Xem video cho trực quan tại đây
-
Thiết lập đầu ra cho chân A1 - A7, đặt tên (user lable) để dù đổi mạch, nối chân khác thì vẫn dùng được hàm viết ở phần CubeIDE
III. Code trên CubeIDE
- Khai báo mảng mã hex để điều khiển LED 7 thanh anode chung
/* USER CODE BEGIN PV */
char numbers[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
/* USER CODE END PV */
- Viết hàm điều khiển LED 7 thanh (đối số là mã hex của số cần sáng)
/* USER CODE BEGIN PFP */
void SevSeg(char num) {
HAL_GPIO_WritePin(a_GPIO_Port, a_Pin, num & 1);
HAL_GPIO_WritePin(b_GPIO_Port, b_Pin, (num >> 1) & 1);
HAL_GPIO_WritePin(c_GPIO_Port, c_Pin, (num >> 2) & 1);
HAL_GPIO_WritePin(d_GPIO_Port, d_Pin, (num >> 3) & 1);
HAL_GPIO_WritePin(e_GPIO_Port, e_Pin, (num >> 4) & 1);
HAL_GPIO_WritePin(f_GPIO_Port, f_Pin, (num >> 5) & 1);
HAL_GPIO_WritePin(g_GPIO_Port, g_Pin, (num >> 6) & 1);
}
/* USER CODE END PFP */
- Viết vào vòng lặp while (1):
for(uint8_t i = 0; i < 10; i++) {
SevSeg(numbers[i]);
HAL_Delay(1000);
}
IV. Mình đã từng thắc mắc
Vì sao cần trở hạn dòng cho LED 7 thanh?
Vì trong datasheet có nói dòng điện tối đa đi qua một thanh LED là 30mA (với loại màu đỏ), và để LED sống lâu trăm tuổi thì dòng điện peak khuyến nghị là 20mA. Suy ra thông thường nó nên làm việc với dòng nhỏ hơn 20mA, nhỉ? Đọc trên mấy web thì mỗi nơi một kiểu, mấy ông Tây bảo 15mA, còn mấy ông Trung bảo 5 - 10mA. Vì linh kiện Tàu, không biết cái datasheet kia có đúng là của nó không, thôi thì cứ lấy 15mA cho nó sáng nhá. Chân dương chung mình nối lên 3.3V, vậy 3.3/0.015 = 220 ohm (vừa đẹp luôn)
Sao không dùng một trở vào chân chung thay vì 7 trở riêng?
Đây, đại ca này cũng thắc mắc giống mình và đã được một vị đại hiệp khai sáng: nếu mắc một trở vào chân chung thì khi có vài thanh LED tắt, dòng sẽ chảy dồn về thanh LED sáng, thế thì còn trở hạn dòng cái gì nữa. Còn nếu mắc riêng cho mỗi chân một trở thì dù các chân hàng xóm bật hay tắt, dòng điện trên một chân luôn không đổi.
Vì lúc đầu chưa load ra được, nên mình đã mô phỏng trên Proteus để hiểu.
V. Tài liệu
All rights reserved