Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

THỰC HÀNH VI ĐIỀU KHIỂN - TUẦN 2

Họ tên: Nguyễn Quang Huy


MSSV: 22207039

BÁO CÁO THỰC HÀNH


Bài 1: Xây dựng hàm con nhập 4 chữ số ( từ 0 đến 9999) để hiển thị lên
LED 7 đoạn 4 chữ số trên kit học tập.
//Định nghĩa các số 0-9 tương ứng với các chân của LED 7 đoạn
const uint8_t digitPatterns[10] = {
0b00111111, // tương ứng LED hiển thị số 0
0b00000110, // tương ứng LED hiển thị số 1
0b01011011, // tương ứng LED hiển thị số 2
0b01001111, // tương ứng LED hiển thị số 3
0b01100110, // tương ứng LED hiển thị số 4
0b01101101, // tương ứng LED hiển thị số 5
0b01111101, // tương ứng LED hiển thị số 6
0b00000111, // tương ứng LED hiển thị số 7
0b01111111, // tương ứng LED hiển thị số 8
0b01101111 , // tương ứng LED hiển thị số 9
};
// Tách các chữ số
void nhap_so(uint16_t number) {
uint8_t digit4 = number % 10; // lấy chữ số cuối cùng của number
uint8_t digit3 = (number / 10) % 10; // lấy chữ số hàng chục
uint8_t digit2 = (number / 100) % 10; // lấy chữ số hàng trăm
uint8_t digit1 = (number / 1000) % 10; // lấy chữ số hàng nghìn
// Hiển thị từng chữ số lên LED 7 đoạn
HAL_GPIO_WritePin(SEGMENT_A_PORT, SEGMENT_A_PIN, digitPatterns[digit1] &
0x01); //lấy ra bit thấp nhất của giá trị digitPatterns[digit1]
HAL_GPIO_WritePin(SEGMENT_B_PORT, SEGMENT_B_PIN, (digitPatterns[digit1] >>
1) & 0x01); // lấy ra bit tiếp theo của giá trị digitPatterns[digit1].
HAL_GPIO_WritePin(SEGMENT_C_PORT, SEGMENT_C_PIN, (digitPatterns[digit1] >>
2) & 0x01);
HAL_GPIO_WritePin(SEGMENT_D_PORT, SEGMENT_D_PIN, (digitPatterns[digit1]
>> 3) & 0x01);
HAL_GPIO_WritePin(SEGMENT_E_PORT, SEGMENT_E_PIN, (digitPatterns[digit1]
>> 4) & 0x01);
HAL_GPIO_WritePin(SEGMENT_F_PORT, SEGMENT_F_PIN, (digitPatterns[digit1]
>> 5) & 0x01);
HAL_GPIO_WritePin(SEGMENT_G_PORT, SEGMENT_G_PIN, (digitPatterns[digit1]
>> 6) & 0x01);
HAL_GPIO_WritePin(SEGMENT_DP_PORT, SEGMENT_DP_PIN,
(digitPatterns[digit1] >> 7) & 0x01);

Bài 2: Đếm số lần nhấn nút SW1 sử dụng LED 7 đoạn để hiển thị
//Định nghĩa các số 0-9 tương ứng với các chân của LED 7 đoạn
const uint8_t digitPatterns[10] = {
0b00111111, // tương ứng LED hiển thị số 0
0b00000110, // tương ứng LED hiển thị số 1
0b01011011, // tương ứng LED hiển thị số 2
0b01001111, // tương ứng LED hiển thị số 3
0b01100110, // tương ứng LED hiển thị số 4
0b01101101, // tương ứng LED hiển thị số 5
0b01111101, // tương ứng LED hiển thị số 6
0b00000111, // tương ứng LED hiển thị số 7
0b01111111, // tương ứng LED hiển thị số 8
0b01101111 , // tương ứng LED hiển thị số 9
};
volatile uint32_t buttonPressCount = 0; // Biến đếm số lần nhấn nút
// Hàm kiểm tra trạng thái nút và cập nhật hiển thị
void check (void) {
if (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET) {
// Nếu nút đang được nhấn, tăng biến đếm và hiển thị lên LED 7 đoạn
buttonPressCount++;
displayNumber(buttonPressCount);
// Đợi cho đến khi nút được nhả ra
while (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) ==
GPIO_PIN_RESET);
}
}
// Tách các chữ số
void nhap_so(uint16_t number) {
uint8_t digit4 = number % 10; // lấy chữ số cuối cùng của number
uint8_t digit3 = (number / 10) % 10; // lấy chữ số hàng chục
uint8_t digit2 = (number / 100) % 10; // lấy chữ số hàng trăm
uint8_t digit1 = (number / 1000) % 10; // lấy chữ số hàng nghìn
// Hiển thị từng chữ số lên LED 7 đoạn
HAL_GPIO_WritePin(SEGMENT_A_PORT, SEGMENT_A_PIN, digitPatterns[digit1] &
0x01); //lấy ra bit thấp nhất của giá trị digitPatterns[digit1]
HAL_GPIO_WritePin(SEGMENT_B_PORT, SEGMENT_B_PIN, (digitPatterns[digit1] >>
1) & 0x01); // lấy ra bit tiếp theo của giá trị digitPatterns[digit1].
HAL_GPIO_WritePin(SEGMENT_C_PORT, SEGMENT_C_PIN, (digitPatterns[digit1] >>
2) & 0x01);
HAL_GPIO_WritePin(SEGMENT_D_PORT, SEGMENT_D_PIN, (digitPatterns[digit1]
>> 3) & 0x01);
HAL_GPIO_WritePin(SEGMENT_E_PORT, SEGMENT_E_PIN, (digitPatterns[digit1]
>> 4) & 0x01);
HAL_GPIO_WritePin(SEGMENT_F_PORT, SEGMENT_F_PIN, (digitPatterns[digit1]
>> 5) & 0x01);
HAL_GPIO_WritePin(SEGMENT_G_PORT, SEGMENT_G_PIN, (digitPatterns[digit1]
>> 6) & 0x01);
HAL_GPIO_WritePin(SEGMENT_DP_PORT, SEGMENT_DP_PIN,
(digitPatterns[digit1] >> 7) & 0x01);
Bài 3: Cho LED 7 đoạn tự động đếm xuống từ 9999 về 0. Khi hiển thị thì
chỉ hiển thị vừa đủ các chữ số có nghĩa của số đó.
//Định nghĩa các số 0-9 tương ứng với các chân của LED 7 đoạn
const uint8_t digitPatterns[10] = {
0b00111111, // tương ứng LED hiển thị số 0
0b00000110, // tương ứng LED hiển thị số 1
0b01011011, // tương ứng LED hiển thị số 2
0b01001111, // tương ứng LED hiển thị số 3
0b01100110, // tương ứng LED hiển thị số 4
0b01101101, // tương ứng LED hiển thị số 5
0b01111101, // tương ứng LED hiển thị số 6
0b00000111, // tương ứng LED hiển thị số 7
0b01111111, // tương ứng LED hiển thị số 8
0b01101111 , // tương ứng LED hiển thị số 9
};
// Tách các chữ số
void nhap_so(uint16_t number) {
uint8_t digit4 = number % 10; // lấy chữ số cuối cùng của number
uint8_t digit3 = (number / 10) % 10; // lấy chữ số hàng chục
uint8_t digit2 = (number / 100) % 10; // lấy chữ số hàng trăm
uint8_t digit1 = (number / 1000) % 10; // lấy chữ số hàng nghìn
// Hiển thị từng chữ số lên LED 7 đoạn
HAL_GPIO_WritePin(SEGMENT_A_PORT, SEGMENT_A_PIN, digitPatterns[digit1] &
0x01);
HAL_GPIO_WritePin(SEGMENT_B_PORT, SEGMENT_B_PIN, (digitPatterns[digit1]
>> 1) & 0x01);
HAL_GPIO_WritePin(SEGMENT_C_PORT, SEGMENT_C_PIN, (digitPatterns[digit1]
>> 2) & 0x01);
HAL_GPIO_WritePin(SEGMENT_D_PORT, SEGMENT_D_PIN, (digitPatterns[digit1]
>> 3) & 0x01);
// Tắt LED 7 đoạn không cần thiết
HAL_GPIO_WritePin(SEGMENT_A_PORT, SEGMENT_A_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEGMENT_B_PORT, SEGMENT_B_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEGMENT_C_PORT, SEGMENT_C_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEGMENT_D_PORT, SEGMENT_D_PIN, GPIO_PIN_RESET);
uint16_t count = 9999;
while (count >= 0) {
displayNumber(count);
HAL_Delay(1000); // Đợi 1 giây
count--;
}
while (1) {
// Lặp vô hạn sau khi kết thúc đếm

You might also like