基于STM32F103C8T6的4*4矩阵键盘的行扫描法实现

概要:

        从网上找相关代码时,一些代码直接复制粘贴过来之后,可能没法使用,自己为了求效率只好继续从网上找。前一段时间终于避不开矩阵键盘了,于是自己就耐着性子写了一个适配STM32F103C8T6的4*4矩阵键盘函数库。

        我自己在编写这个4*4键盘库时力求简短,可能在细节方面上存在瑕疵,不过整体还能使用。

也许代码被压缩的体积转化为了STM32的算力消耗,但影响应该不算大?如果有大佬能指出改进的方案,这里不胜感激。

4*4矩阵键盘函数库:

1. 头文件:KeyBoard_4_4.h

#ifndef __KEYBOARD_4_4_H
#define __KEYBOARD_4_4_H
#include "stm32f10x.h"                  // Device header

//这个4*4矩阵键盘实现库具有以下特点:
//1、使用行扫描法对键盘进行扫描;
//2、部分按键同时按下不会相互冲突,具体无冲按键作者暂未分析,用户想利用此功能可以枚举尝试(推荐不使用);
//3、代码极简化。
void KeyBoard_4_4_Init(void);
u8 KeyBoard_4_4_Scan(void);

#endif

2. 源文件:KeyBoard_4_4.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

//逐行扫描法。
//引脚定义:
//Row1~4:A0~A3
//Column1~4:A4~A7

uint16_t returnValue = 0x0000;

void KeyBoard_4_4_Init(void)
{	
	//Row
	//A0~A3引脚对应矩阵键盘第1~4行。
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
    //Column
	//A4~7引脚对应矩阵键盘第1~4列。
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

u8 KeyBoard_4_4_Scan(void)
{	
	static uint16_t temp;//中间量
	static uint8_t row,column;
	temp = 0x00F0;
	/*************Scan  Rows************************/
	for(row=0;row<4;row++)
	{
		GPIO_Write(GPIOA,(0x00FF & (~(0x0001<

3. 说明:

        上面展示了函数库的内容,可以复制粘贴到自己工程。用户可以如此使用:

#include "stm32f10x.h"                  // Device header
#include "KeyBoard_4_4.h"


int main(void)
{
	KeyBoard_4_4_Init();

	while(1)
	{
		switch(KeyBoard_4_4_Scan())
		{
			case 1:
				break;
			case 2:
				break;
			case 3:
				break;
			case 4:
				break;
			case 5:		
				break;
			case 6:
				break;
			case 7:
				break;
			case 8:
				break;
			case 9:
				break;
			case 10:
				break;
			case 12:
				break;
			case 13:
				break;
			case 14:
				break;
			case 15:		
				break;
			case 16:		
		}
	}
}

文件提供:

已上传上述三个文件。如果该文章有帮到您,麻烦点个赞,这对我的创作热情很重要!

你可能感兴趣的:(stm32,嵌入式硬件,单片机)