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

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

查看IO引用图可知,KEY0使用的是UART1 CTS引用。
查看I.MX6ULL参考手册,UART1 CTS复用为GPIO之后是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
全部0条评论
快来发表一下你的评论吧 !