stm32f10系列矩阵键盘标准库
时间: 2023-09-11 14:06:28 浏览: 35
STM32F10系列的矩阵键盘标准库包括了GPIO和中断的使用。以下是一个简单的例子,用于检测矩阵键盘上的按键是否按下:
```c
#include "stm32f10x.h"
#define ROW1 GPIO_Pin_0
#define ROW2 GPIO_Pin_1
#define ROW3 GPIO_Pin_2
#define ROW4 GPIO_Pin_3
#define COL1 GPIO_Pin_4
#define COL2 GPIO_Pin_5
#define COL3 GPIO_Pin_6
#define COL4 GPIO_Pin_7
void GPIO_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
GPIO_Configuration();
NVIC_Configuration();
while (1)
{
GPIO_SetBits(GPIOB, ROW1);
GPIO_ResetBits(GPIOB, ROW2);
GPIO_ResetBits(GPIOB, ROW3);
GPIO_ResetBits(GPIOB, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0)
{
//按键1按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0)
{
//按键2按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0)
{
//按键3按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0)
{
//按键4按下
}
GPIO_ResetBits(GPIOB, ROW1);
GPIO_SetBits(GPIOB, ROW2);
GPIO_ResetBits(GPIOB, ROW3);
GPIO_ResetBits(GPIOB, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0)
{
//按键5按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0)
{
//按键6按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0)
{
//按键7按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0)
{
//按键8按下
}
GPIO_ResetBits(GPIOB, ROW1);
GPIO_ResetBits(GPIOB, ROW2);
GPIO_SetBits(GPIOB, ROW3);
GPIO_ResetBits(GPIOB, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0)
{
//按键9按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0)
{
//按键10按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0)
{
//按键11按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0)
{
//按键12按下
}
GPIO_ResetBits(GPIOB, ROW1);
GPIO_ResetBits(GPIOB, ROW2);
GPIO_ResetBits(GPIOB, ROW3);
GPIO_SetBits(GPIOB, ROW4);
if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0)
{
//按键13按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0)
{
//按键14按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0)
{
//按键15按下
}
if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0)
{
//按键16按下
}
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = ROW1 | ROW2 | ROW3 | ROW4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = COL1 | COL2 | COL3 | COL4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line5);
}
if(EXTI_GetITStatus(EXTI_Line6) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line6);
}
if(EXTI_GetITStatus(EXTI_Line7) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line7);
}
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line8);
}
}
```
在以上代码中,ROW1~ROW4是行引脚,COL1~COL4是列引脚。对于每一行引脚,将其设置为高电平,然后轮询检测每一列引脚是否被按下。如果检测到按键按下,则执行相应的操作。最后将所有的行引脚都设置为低电平,以便下一轮的扫描。
此外,为了更好地处理中断,需要在NVIC_Configuration函数中进行中断配置。在这个例子中,将EXTI线5~8与中断进行关联,并在EXTI9_5_IRQHandler函数中处理中断。