【ARM 裸机】按键输入

本节学习按键输入,先拷贝上一节工程文件,
在这里插入图片描述

1、驱动编写

新建 key 的 .h 和 .c 文件;
在这里插入图片描述
再查看一下硬件原理图如下;
在这里插入图片描述
在这里插入图片描述
由此可知,KEY0 按键接在 UART1_CTS 引脚上,默认情况下为高电平,按键按下为低电平;和之前不同的是,GPIO 由输出变成了输入;
在这里插入图片描述
参考数据手册;
在这里插入图片描述
在这里插入图片描述
定义读取按键值的函数;

// 读取按键值
int read_key(void)
{
    int ret = 0;
    ret = ((GPIO1->DR) >> 18) & 0x1;
    return ret;
}

int key_getvalue(void)
{
    int ret = 0;
    static unsigned char release = 1;   // 为 1 表示按键释放
    
    if((release == 1) && (read_key() == 0))   // 按键按下
    {
        delay_ms(10);
        release = 0;
        if(read_key() == 0)   // 按键有效
        {
            ret = KEY0_VALUE;
        }
    }
    else if(read_key() == 1)   // 没有按下
    {
        ret = KEY_NONE;
        release = 1;
    }
    return ret;
}

在头文件中声明;
在这里插入图片描述

2、编写 main.c

#include "main.h"
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"

int main(void)
{
    int i = 0;
    unsigned char led_state = OFF;
    unsigned char beep_state = OFF;
    int keyvalue = 0;

    clk_enable();
    led_init();
    beep_init();
    key_init();
    
    while(1)
    {
        // 按键处理控制蜂鸣器
        keyvalue = key_getvalue();
        if(keyvalue)   // 如果按键值为正则是有效的按键值
        {
            switch (keyvalue)
            {
                case KEY0_VALUE:
                    beep_state = !beep_state;
                    beep_switch(beep_state); 
                    break;
            }
        }
        i++;
        if(i == 50)   // 50*10=500
        {
            i = 0;
            led_state = !led_state;
            led_switch(LED0,led_state);
        }
        delay_ms(10);
    }
    return 0; 
}

3、修改部分内容

首先就是修改头文件包含路径;
在这里插入图片描述
修改 Makefile 文件;
在这里插入图片描述

4、编译烧写

在这里插入图片描述
在这里插入图片描述
下载之后 led 亮了一次,就不亮了,key0 是可以控制 beep 的,那么肯定是 led 相关的地方出了问题,找到 led 控制的函数,才发现参数写错了,按照以下修改;
在这里插入图片描述
再次编译工程,烧写之后功能正常了;

I.MX6ULL_key

5、回顾,问题解决

解决另一个问题,在【ARM 裸机】NXP 官方 SDK 使用 这一小节中,加上清除 bss 段的代码是不会运行的,所以清除 bss 段的代码被注释掉了,这是因为对 32 位的芯片来说,是 4 字节访问的,查看反汇编文件可知;
在这里插入图片描述
_bss_start 的起始地址是 0x87800271,这是不能被 4 整除的,所以要对 _bss_start 进行 4 字节对齐操作;
在这里插入图片描述
再来看一下反汇编文件;
在这里插入图片描述
编译工程烧写之后正常运行。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值