#include "stm32c0xx.h"
// Hàm delay chống dội phím
void delay_ms_custom(uint32_t ms) {
for (uint32_t i = 0; i < ms * 4000; i++) {
__NOP();
}
}
void init_leds(void) {
// Vẫn dùng thanh ghi để cấp xung và cấu hình PA5, PA6, PA7 làm Output
RCC->IOPENR |= (1 << 0);
GPIOA->MODER &= ~((3 << 10) | (3 << 12) | (3 << 14));
GPIOA->MODER |= (1 << 10) | (1 << 12) | (1 << 14);
GPIOA->OTYPER &= ~((1 << 5) | (1 << 6) | (1 << 7));
}
// Tự tạo một hàm bình thường để xử lý dịch trái (Thay cho hàm Ngắt)
void dich_trai_PA0() {
if (GPIOA->ODR & (1 << 5)) {
GPIOA->ODR &= ~(1 << 5);
GPIOA->ODR |= (1 << 6);
}
else if (GPIOA->ODR & (1 << 6)) {
GPIOA->ODR &= ~(1 << 6);
GPIOA->ODR |= (1 << 7);
}
else if (GPIOA->ODR & (1 << 7)) {
GPIOA->ODR &= ~(1 << 7);
GPIOA->ODR |= (1 << 5);
}
delay_ms_custom(150);
}
// Tự tạo một hàm bình thường để xử lý dịch phải
void dich_phai_PA1() {
if (GPIOA->ODR & (1 << 5)) {
GPIOA->ODR &= ~(1 << 5);
GPIOA->ODR |= (1 << 7);
}
else if (GPIOA->ODR & (1 << 6)) {
GPIOA->ODR &= ~(1 << 6);
GPIOA->ODR |= (1 << 5);
}
else if (GPIOA->ODR & (1 << 7)) {
GPIOA->ODR &= ~(1 << 7);
GPIOA->ODR |= (1 << 6);
}
delay_ms_custom(150);
}
void setup() {
init_leds();
// Bật LED 1 lúc khởi động bằng thanh ghi
GPIOA->ODR |= (1 << 5);
// Chấp nhận dùng lệnh của Arduino để cấu hình ngắt phần cứng trên Wokwi
// PA0 và PA1 là tên chân chuẩn trên board Nucleo
pinMode(PA0, INPUT_PULLUP);
pinMode(PA1, INPUT_PULLUP);
// Gắn hàm dịch trái/phải vào sự kiện sườn xuống (FALLING)
attachInterrupt(digitalPinToInterrupt(PA0), dich_trai_PA0, FALLING);
attachInterrupt(digitalPinToInterrupt(PA1), dich_phai_PA1, FALLING);
}
void loop() {
delay(10);
}