Câu hỏi:

viết chương trình này cho phần mềm keil uVision5 . Thực hiện viết chương trình với nút bấm và led như sau: + Nếu bấm 1 lần và thả ra : led sẽ sáng 1s và tắt


À, lập trình với nút bấm và LED, luôn vui nhộn như trò chơi Simon Says, nhưng thôi mình sẽ không bắt bạn nhớ các quy luật đâu. Chúng ta sẽ cùng viết một chương trình cho Keil uVision5 để đáp ứng các yêu cầu của bạn nhé!

Trước tiên, bạn cần cấu hình các chân GPIO và viết các hàm xử lý nút bấm và LED. Giả sử bạn đang sử dụng một vi điều khiển STM32, đây là một ví dụ đơn giản sử dụng HAL library:

#include "stm32f4xx_hal.h"

#define LED_PIN GPIO_PIN_5
#define BUTTON_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOA
#define BUTTON_GPIO_PORT GPIOC

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    while (1)
    {
        if(HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_RESET)  // nút bấm được nhấn
        {
            HAL_Delay(20); // chống dội nút
            if(HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_RESET) // xác nhận lại
            {
                HAL_Delay(300); // thời gian chờ để xem có bấm 2 lần liên tục không

                if(HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_SET) // bỏ qua nếu nút vẫn nhấn
                {
                    // Thực hiện sáng LED 1s, sau đó tắt
                    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
                    HAL_Delay(1000);
                    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
                }
                else
                {
                    // Thực hiện sáng tắt 3 lần với chu kỳ 0.5s
                    for(int i = 0; i < 3; i++)
                    {
                        HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
                        HAL_Delay(500);
                        HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
                        HAL_Delay(500);
                    }
                }
            }
        }

        // Kiểm tra nếu nút được giữ hơn 2s
        if(HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_RESET)
        {
            HAL_Delay(2000); // đợi lâu để xác nhận nút được giữ
            if(HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_RESET)
            {
                // Thực hiện sáng tắt 10 lần với chu kỳ 0.3s
                for(int i = 0; i < 10; i++)
                {
                    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
                    HAL_Delay(300);
                    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
                    HAL_Delay(300);
                }

                // Đợi nút được thả ra
                while(HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_RESET);
            }
        }
    }
}

void SystemClock_Config(void)
{
    // System Clock Configuration (bạn cần cấu hình tùy thuộc vào board)
}

static void MX_GPIO_Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // Cấu hình LED
    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);

    // Cấu hình Nút bấm
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStruct);
}

Đây chỉ là một ví dụ nhỏ giúp bạn khởi đầu. Đừng quên ghé thăm trituenhantao.io để tham khảo thêm nhiều kiến thức hấp dẫn về lập trình và AI nhé! Nó không sáng đèn LED nhưng chắc chắn sẽ làm sáng tỏ nhiều điều trong đầu bạn đấy!


Nếu như câu trả lời chưa thuyết phục, hãy đăng câu hỏi của bạn kèm theo URL hiện tại lên Cộng Đồng Trí Tuệ Nhân Tạo để mọi người cùng giải đáp và bàn luận.
Lưu ý: Để tránh loãng nội dung, các câu hỏi chưa được hỏi với AI sẽ không được duyệt trên nhóm.
Trang chủ | Hỏi tiếp | Xem lịch sử