https://download.csdn.net/download/x1131230123/11999308
/* 初始化矩阵键盘 */
void InitKeyBoard(void)
{
/*
* 初始化矩阵键盘的输入输出口 8个
* row 1234分别是 PP2 PN3 PN2 PD0 设置为in
* col 分别是 PD1 PH3 PH2 PM3 设置为out
*/
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOD); /* 使能时钟 */
GPIODirModeSet( GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_DIR_MODE_OUT); /* 设置为输出模式 */
GPIOPadConfigSet( GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_STRENGTH_8MA_SC,
GPIO_PIN_TYPE_STD); /* ///进一步设置为 8mA、带转换速率控制的推挽输出 */
GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_PIN_1); /* PD1 设置IO口输出低电平时,第三个参数写0即可。但若设置IO口为高电平,则不能简单地将第三个参数写成1。 */
/*而是,设置GPIO_PIN_0为高电平时,第三个写GPIO_PIN_0。GPIO_PIN_1设置高电平时写GPIO_PIN_1,以此类推。 */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOH); /* 使能时钟 */
GPIODirModeSet( GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); /* 设置为输出模式 */
GPIOPadConfigSet( GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA_SC,
GPIO_PIN_TYPE_STD); /* ///进一步设置为 8mA、带转换速率控制的推挽输出 */
GPIOPinWrite( GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_PIN_3); /* 设置IO口输出低电平时,第三个参数写0即可。但若设置IO口为高电平,GPIO_PIN_0 */
GPIODirModeSet( GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_DIR_MODE_OUT); /* 设置为输出模式 */
GPIOPadConfigSet( GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA_SC,
GPIO_PIN_TYPE_STD); /* ///进一步设置为 8mA、带转换速率控制的推挽输出 */
GPIOPinWrite( GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_PIN_2); /* 设置IO口输出低电平时,第三个参数写0即可。但若设置IO口为高电平,GPIO_PIN_0 */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOM); /* 使能时钟 */
GPIODirModeSet( GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); /* 设置为输出模式 */
GPIOPadConfigSet( GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA_SC,
GPIO_PIN_TYPE_STD); /* ///进一步设置为 8mA、带转换速率控制的推挽输出 */
GPIOPinWrite( GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_PIN_3); /* 设置IO口输出低电平时,第三个参数写0即可。但若设置IO口为高电平,GPIO_PIN_0 */
/*
* 初始化矩阵键盘的输入输出口 8个
* row 1234分别是 PP2 PN3 PN2 PD0 设置为in
* col 分别是 PD1 PH3 PH2 PM3 设置为out
* 读取函数 GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)
*/
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOP); /* 使能时钟 */
GPIOPinTypeGPIOInput( GPIO_PORTP_BASE, GPIO_PIN_2); /* 设置GPIO_PIN 为输入 */
GPIOPinTypeGPIOOutput( GPIO_PORTP_BASE,
GPIO_PIN_2);
GPIODirModeSet( GPIO_PORTP_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN);
GPIOPadConfigSet( GPIO_PORTP_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite( GPIO_PORTP_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPION); /* 使能时钟 */
GPIOPinTypeGPIOInput( GPIO_PORTN_BASE, GPIO_PIN_3); /* 设置GPIO_PIN 为输入 */
GPIOPinTypeGPIOOutput( GPIO_PORTN_BASE,
GPIO_PIN_3);
GPIODirModeSet( GPIO_PORTN_BASE, GPIO_PIN_3, GPIO_DIR_MODE_IN);
GPIOPadConfigSet( GPIO_PORTN_BASE, GPIO_PIN_3, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite( GPIO_PORTN_BASE, GPIO_PIN_3, GPIO_PIN_3);
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPION); /* 使能时钟 */
GPIOPinTypeGPIOInput( GPIO_PORTN_BASE, GPIO_PIN_2); /* 设置GPIO_PIN 为输入 */
GPIOPinTypeGPIOOutput( GPIO_PORTN_BASE,
GPIO_PIN_2);
GPIODirModeSet( GPIO_PORTN_BASE, GPIO_PIN_2, GPIO_DIR_MODE_IN);
GPIOPadConfigSet( GPIO_PORTN_BASE, GPIO_PIN_2, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite( GPIO_PORTN_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOD); /* 使能时钟 */
GPIOPinTypeGPIOInput( GPIO_PORTD_BASE, GPIO_PIN_0); /* 设置GPIO_PIN 为输入 */
GPIOPinTypeGPIOOutput( GPIO_PORTD_BASE,
GPIO_PIN_0);
GPIODirModeSet( GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_DIR_MODE_IN);
GPIOPadConfigSet( GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_PIN_0);
}
/*
* row 1234分别是 PP2 PN3 PN2 PD0 设置为in
* col 分别是 PD1 PH3 PH2 PM3 设置为out
*/
#define keyout1_o1 GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_PIN_1 ) /* 让引脚输出高电平 */
#define keyout2_o1 GPIOPinWrite( GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_PIN_3 ) /* 让引脚输出高电平 */
#define keyout3_o1 GPIOPinWrite( GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_PIN_2 ) /* 让引脚输出高电平 */
#define keyout4_o1 GPIOPinWrite( GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_PIN_3 ) /* 让引脚输出高电平 */
#define keyout1_o0 GPIOPinWrite( GPIO_PORTD_BASE, GPIO_PIN_1, 0 ) /* 让引脚输出低电平 */
#define keyout2_o0 GPIOPinWrite( GPIO_PORTH_BASE, GPIO_PIN_3, 0 ) /* 让引脚输出低电平 */
#define keyout3_o0 GPIOPinWrite( GPIO_PORTH_BASE, GPIO_PIN_2, 0 ) /* 让引脚输出低电平 */
#define keyout4_o0 GPIOPinWrite( GPIO_PORTM_BASE, GPIO_PIN_3, 0 ) /* 让引脚输出低电平 */
/*
* row 1234分别是 PP2 PN3 PN2 PD0 设置为in
* col 分别是 PD1 PH3 PH2 PM3 设置为out
*/
#define key_int_1 GPIOPinRead( GPIO_PORTP_BASE, GPIO_PIN_2 ) /* 读取引脚的电平是高还是低 */
#define key_int_2 GPIOPinRead( GPIO_PORTN_BASE, GPIO_PIN_3 ) /* 读取引脚的电平是高还是低 */
#define key_int_3 GPIOPinRead( GPIO_PORTN_BASE, GPIO_PIN_2 ) /* 读取引脚的电平是高还是低 */
#define key_int_4 GPIOPinRead( GPIO_PORTD_BASE, GPIO_PIN_0 ) /* 读取引脚的电平是高还是低 */
/* 获得按键 有按键返回按键值 没按键返回17 */
int KeyScan(void)
{
int key = 17;
/*
* 键盘检测原理 让某个引脚输出低电平
* 第0列
*/
/* 全部输出低电平 */
keyout1_o0;
keyout2_o0;
keyout3_o0;
keyout4_o0;
if ((key_int_1 == 1) || (key_int_2 == 1) || (key_int_3 == 1)
|| (key_int_4 == 1))
{
return key;
}
keyout1_o0;
keyout2_o1;
keyout3_o1;
keyout4_o1;
if ((key_int_1 == 0) || (key_int_2 == 0) || (key_int_3 == 0)
|| (key_int_4 == 0))
{
if ( key_int_1 == 0)
{
key = 0;
}
else if ( key_int_2 == 0)
{
key = 4;
}
else if ( key_int_3 == 0)
{
key = 8;
}
else if ( key_int_4 == 0)
{
key = 12;
}
}
/* 第1列 */
keyout1_o1;
keyout2_o0;
keyout3_o1;
keyout4_o1;
if ((key_int_1 == 0) || (key_int_2 == 0) || (key_int_3 == 0)
|| (key_int_4 == 0))
{
if ( key_int_1 == 0)
{
key = 1;
}
else if ( key_int_2 == 0)
{
key = 5;
}
else if ( key_int_3 == 0)
{
key = 9;
}
else if ( key_int_4 == 0)
{
key = 13;
}
}
/* 第2列 */
keyout1_o1;
keyout2_o1;
keyout3_o0;
keyout4_o1;
if ((key_int_1 == 0) || (key_int_2 == 0) || (key_int_3 == 0)
|| (key_int_4 == 0))
{
if ( key_int_1 == 0)
{
key = 2;
}
else if ( key_int_2 == 0)
{
key = 6;
}
else if ( key_int_3 == 0)
{
key = 10;
}
else if ( key_int_4 == 0)
{
key = 14;
}
}
/* 第3列 */
keyout1_o1;
keyout2_o1;
keyout3_o1;
keyout4_o0;
if ((key_int_1 == 0) || (key_int_2 == 0) || (key_int_3 == 0)
|| (key_int_4 == 0))
{
if ( key_int_1 == 0)
{
key = 3;
}
else if ( key_int_2 == 0)
{
key = 7;
}
else if ( key_int_3 == 0)
{
key = 11;
}
else if ( key_int_4 == 0)
{
key = 15;
}
}
/* 全部输出低电平 */
keyout1_o0;
keyout2_o0;
keyout3_o0;
keyout4_o0;
while ((key_int_1 == 0) || (key_int_2 == 0) || (key_int_3 == 0)
|| (key_int_4 == 0))
; /* 等待按键松开 */
return (key);
}