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
Nếu bấm 2 lần kiến tục: led sáng tắt 3 lần với chu kỳ sáng tắt 0.5s
Nếu bấm và giữ với thời gian lớn hơn 2s thì led sáng tắt 10 lần với chu kỳ 0.3s
À, 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!