stm32f103c8按键产生中断oled显示键值
时间: 2023-10-19 09:19:06 浏览: 103
以下是使用STM32F103C8单片机进行按键中断和OLED显示键值的示例代码:
```c
#include "stm32f10x.h"
#include "ssd1306.h" // OLED库
int main(void)
{
// 初始化按键GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化OLED
SSD1306_Init();
while(1)
{
static uint8_t key_pressed = 0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0 && key_pressed == 0)
{
// 按键按下,产生中断
key_pressed = 1;
NVIC_EnableIRQ(EXTI0_IRQn); // 开启外部中断0
}
else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1 && key_pressed == 1)
{
// 按键松开,清除中断标志
key_pressed = 0;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// 按键中断处理
uint8_t key_value = 0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
{
key_value = 1;
}
else
{
key_value = 0;
}
// 在OLED上显示按键值
char str[20];
sprintf(str, "key value: %d", key_value);
SSD1306_Clear();
SSD1306_GotoXY(0, 0);
SSD1306_Puts(str, &Font_7x10, SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}
}
```
这段代码中,我们首先初始化了PA0作为输入上拉的按键引脚。在主循环里,我们检测按键是否按下,如果按下就开启外部中断0。在中断处理函数里,我们读取按键值,然后在OLED上显示出来。
需要注意的是,这里使用的OLED库是SSD1306驱动的,你需要根据你的OLED型号选择相应的库。同时,你也需要根据你的开发板和OLED模块的连接方式修改引脚定义和OLED初始化函数。
阅读全文