按键驱动的实验

描述

按键驱动实验与LED以及Beep在整体使用逻辑上一样,只是按键是输入模式。

找到按键使用的引脚

led

查看底板原理图可知,按键KEY0,断开状态时KEY0是高电平,接通是低电平。

led

查看IO引用图可知,KEY0使用的是UART1 CTS引用。

查看I.MX6ULL参考手册,UART1 CTS复用为GPIO之后是GPIO01_IO18:

led

初始化GPIO01_IO18,配置电气属性并设置为输入

// 将UART1_CTS_B利用为GPIO01_IO18
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
// 配置电气属性
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, CONST_GPIO_INPUT_PAD_VALUE);
// 配置GPIO方向以及默认值
GPIO_Init(GPIO1, 18, (GPIO_CONFIG){GPIO_DIRECTION_INPUT, 0});

读取按键状态

复用并初始化完GPIO1_IO18后通过读取GPIO1_IO18的电平状态就可以知道当前按键状态了。按键接下时为低电平,按钮弹起时为高电平。

但是在读取按键状态时有一个问题,就是由于按键在按下时短时间内的电平状态可能不稳定,在读取的时候需要做一个延时读取操作,防止读取的异常的电平状态,它的读取代码如下:

if (GPIO_RedValue(GPIO1, 18) == 0)
{
    //此时的电平是低电平,表示按钮是接下状态
    //为了防止电平抖动,延迟10ms再读取一下电平状态,如果还是按下表示按钮按下并且稳定
    Delay(10);
    if (GPIO_RedValue(GPIO1, 18))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
else
{
    // 按钮松开
    return 0;
}

修改主程序逻辑

这里改成按键按下则LED亮同时BEEP

Clk_Init();
Led_Init();
Beep_Init();
Key0_Init();
while (1)
{
    Delay(10);
    if (Key0_GetValue())
    {

        Led_On();
        Beep_On();
    }
    else
    {
        Led_Off();
        Beep_Off();
    }
}

return 0;

编译,烧写验证

make install
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分