stm8s103抢答器代码
时间: 2023-11-12 15:04:53 浏览: 40
以下是一个简单的基于STM8S103的抢答器代码示例:
```c
#include "stm8s.h"
#define BUTTON_PIN GPIO_PIN_3
#define BUTTON_PORT GPIOB
#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA
void delay_ms(uint16_t ms)
{
for (uint16_t i = 0; i < ms; i++) {
for (uint16_t j = 0; j < 2000; j++) {
// 延时大概 1ms
}
}
}
int main(void)
{
// 初始化 GPIO
GPIO_Init(BUTTON_PORT, BUTTON_PIN, GPIO_MODE_IN_FL_IT);
GPIO_Init(LED_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
// 初始化 EXTI
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);
// 初始化中断
enableInterrupts();
while (1) {
// 等待按下按钮
while (GPIO_ReadInputPin(BUTTON_PORT, BUTTON_PIN) == RESET);
// 点亮 LED
GPIO_WriteHigh(LED_PORT, LED_PIN);
// 延时 500ms
delay_ms(500);
// 熄灭 LED
GPIO_WriteLow(LED_PORT, LED_PIN);
// 延时 500ms
delay_ms(500);
}
}
// 中断处理函数
#ifdef _COSMIC_
void EXTI_PORTB_IRQHandler(void) __interrupt(EXTI_PORTB_IRQHANDLER)
#else
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, EXTI_PORTB_IRQHANDLER)
#endif
{
// 关闭中断
disableInterrupts();
// 点亮 LED
GPIO_WriteHigh(LED_PORT, LED_PIN);
// 延时 500ms
delay_ms(500);
// 熄灭 LED
GPIO_WriteLow(LED_PORT, LED_PIN);
// 延时 500ms
delay_ms(500);
// 清除中断标志位
EXTI_ClearITPendingBit(EXTI_IT_PORTB);
// 打开中断
enableInterrupts();
}
```
该代码使用 PB3 作为按钮输入,PA5 作为 LED 输出。当按下按钮时,LED 会闪烁一次。在中断处理函数中,再次闪烁 LED。注意在中断处理函数中要关闭中断,避免多重中断的问题。