+1

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.

CS3611B.png

image.png

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. image.png

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 image.png

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí