[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#ifndef __MATRIX_KEY_H
#define __MATRIX_KEY_H
#include "common.h"
//默认配置到E口0-7脚,如需要自己修改
#define MatrixPin1_1 0x0u
#define MatrixPin1_2 0x2u
#define MatrixPin1_3 0x4u
#define MatrixPin1_4 0x6u
#define MatrixPin2_1 0x1u
#define MatrixPin2_2 0x3u
#define MatrixPin2_3 0x5u
#define MatrixPin2_4 0x7u
void matrix_key_init(void);//初始化矩阵键盘
void Matrix_key_Init_1(void);
void Matrix_key_Init_2(void);
uint8_t MatrixKeyScan(void); //扫描
#endif
}
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include "MatrixKey.h"
#include "common.h"
#include "gpio.h"
/*
author@李维强
适合周老师发的黑色开发板,4*4键盘,E0,E2,E4,E6端口接一排,E1,E3,E5,E7端口接一排
该代码看起简单,但是有大量重复调用流程,追求效率的同学慎用!!!
*/
void matrix_key_init(void)
{
GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_IPD);
}
void Matrix_key_Init_1(void)
{
GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_IPD);
}
void Matrix_key_Init_2(void)
{
GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_OPP);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_IPD);
GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_IPD);
}
uint8_t MatrixKeyScan(void)
{
uint8_t key=0;
Matrix_key_Init_1();
DelayUs(1);
PEout(MatrixPin1_1)=1Eout(MatrixPin1_2)=1Eout(MatrixPin1_3)=1Eout(MatrixPin1_4)=1;
DelayUs(1);
if(PEin(MatrixPin2_1)==1 || PEin(MatrixPin2_2)==1 || PEin(MatrixPin2_3)==1 || PEin(MatrixPin2_4)==1)
{
DelayMs(10);
if(PEin(MatrixPin2_1)==1){key=1;}
else if(PEin(MatrixPin2_2)==1){key=2;}
else if(PEin(MatrixPin2_3)==1){key=3;}
else if(PEin(MatrixPin2_4)==1){key=4;}
Matrix_key_Init_2();
DelayMs(10);
PEout(MatrixPin2_1)=1Eout(MatrixPin2_2)=1Eout(MatrixPin2_3)=1Eout(MatrixPin2_4)=1;
DelayUs(1);
if(PEin(MatrixPin1_1)==1){key+=0;}
else if(PEin(MatrixPin1_2)==1){key+=4;}
else if(PEin(MatrixPin1_3)==1){key+=8;}
else if(PEin(MatrixPin1_4)==1){key+=12;}
else{key=0;}
}
return key;
}