TM4C 矩阵键盘

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);
}
发布了82 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/103277951
今日推荐