举例stm32f103识别矩阵键盘的程序
时间: 2023-10-23 16:09:56 浏览: 86
以下是一个使用STM32F103芯片识别4x4矩阵键盘的程序示例:
```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 Delay(__IO uint32_t nCount);
int main(void)
{
GPIO_Configuration();
uint8_t key = 0;
while (1)
{
GPIO_ResetBits(GPIOB, COL1);
if (GPIO_ReadInputDataBit(GPIOB, ROW1) == RESET)
{
key = 1;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW2) == RESET)
{
key = 4;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW3) == RESET)
{
key = 7;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW4) == RESET)
{
key = 10;
break;
}
GPIO_SetBits(GPIOB, COL1);
GPIO_ResetBits(GPIOB, COL2);
if (GPIO_ReadInputDataBit(GPIOB, ROW1) == RESET)
{
key = 2;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW2) == RESET)
{
key = 5;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW3) == RESET)
{
key = 8;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW4) == RESET)
{
key = 0;
break;
}
GPIO_SetBits(GPIOB, COL2);
GPIO_ResetBits(GPIOB, COL3);
if (GPIO_ReadInputDataBit(GPIOB, ROW1) == RESET)
{
key = 3;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW2) == RESET)
{
key = 6;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW3) == RESET)
{
key = 9;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW4) == RESET)
{
key = 11;
break;
}
GPIO_SetBits(GPIOB, COL3);
GPIO_ResetBits(GPIOB, COL4);
if (GPIO_ReadInputDataBit(GPIOB, ROW1) == RESET)
{
key = 12;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW2) == RESET)
{
key = 13;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW3) == RESET)
{
key = 14;
break;
}
if (GPIO_ReadInputDataBit(GPIOB, ROW4) == RESET)
{
key = 15;
break;
}
GPIO_SetBits(GPIOB, COL4);
}
while (1)
{
if (GPIO_ReadInputDataBit(GPIOB, ROW1) == RESET ||
GPIO_ReadInputDataBit(GPIOB, ROW2) == RESET ||
GPIO_ReadInputDataBit(GPIOB, ROW3) == RESET ||
GPIO_ReadInputDataBit(GPIOB, ROW4) == RESET)
{
Delay(50000);
if (GPIO_ReadInputDataBit(GPIOB, ROW1) == RESET ||
GPIO_ReadInputDataBit(GPIOB, ROW2) == RESET ||
GPIO_ReadInputDataBit(GPIOB, ROW3) == RESET ||
GPIO_ReadInputDataBit(GPIOB, ROW4) == RESET)
{
continue;
}
}
else
{
break;
}
}
return key;
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = ROW1 | ROW2 | ROW3 | ROW4;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = COL1 | COL2 | COL3 | COL4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, COL1 | COL2 | COL3 | COL4);
}
void Delay(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
```
该程序使用GPIO来控制矩阵键盘的行和列,通过检测行和列的状态来确定按下的按键。当按下按键时,该程序将返回相应的键值。
阅读全文