0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术在英创Linux主板上用GPIO实现矩阵键盘简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-12 10:34 次阅读

英创公司的Linux主板对于矩阵键盘的支持有多种方案可以实现,我们在以前推出过使用i2c扩展的方案,具体情况可以参考ETA202模块的资料:《ETA202 I2C键盘扩展模块使用手册》,这种方案的好处是只需要使用I2C总线的两条信号线SCL和SDA,可以节约主板上的GPIO资源。ESMARC系列主板都拥有32位GPIO资源,为了更好利用硬件资源,英创公司推出了GPIO接矩阵键盘的方案,在IO资源满足需求的情况下,可以使用这套方案,优点是可以节约硬件扩展的成本,并且软件上使用Linux标准的input设备接口就可以操作,不需要额外做任何工作。

GPIO支持矩阵键盘是通过IO中断来实现的,当检测到有按键按下,就会触发中断,扫描键盘来判断具体的按键动作。支持的矩阵键盘最大范围为4×5,我们以英创公司的矩阵键盘模块为例:

使用的管脚为GPIO16~GPIO24,与ESMARC评估底板连接测试,连接方式如下:

具体的信号排列如下(CN18):

信号及说明 PIN# 信号及说明
GPIO16 -> 用作 ROW0 1 2 GPIO17 -> 用作 COL0
GPIO18 -> 用作 ROW1 3 4 GPIO19 -> 用作 COL1
GPIO20 -> 用作 ROW2 5 6 GPIO21 -> 用作 COL2
GPIO22 -> 用作 ROW3 7 8 GPIO23 -> 用作 COL3
GPIO24 -> 用作 ROW4 9 10 GPIO25
GPIO26 11 12 GPIO27
GPIO28 13 14 GPIO29
GPIO30 15 16 GPIO31
+5V 17 18 +5V
GND 19 20 GND

英创公司已经将驱动文件制作成内核驱动模块的形式放入文件系统中了,驱动名称为matrix_keypad.ko,用户要使用该功能,只需要加载驱动模块即可。驱动模块放在/lib/modules//下面,例如使用ESM335x主板,因为ESM335x的内核版本为4.1.6,输入命令为:insmode /lib/modules/4.1.6/matrix_keypad.ko,注意如果使用的主板为ESM7000,ESM6802,ESM6800H或者ESM6800V系列的板卡,可以使用命令:modprobe matrix_keypad,不需要代入路径。

为了避免占用不必要的硬件资源,根据实际的需求,在加载驱动模块的时候可以代入参数指定横列的数值,参数col(1-4)代表列数,row(1-5)代表横排数,如果不代入参数,默认为支持col=4,row=5的矩阵键盘。以ESM335x为例,加载支持3×3大小矩阵键盘的命令为insmod /lib/modules/4.1.6/matrix_keypad.ko col=3 row=3,如下如所示:

加载驱动

当代入col和row的值小于最大值的时候,驱动占用的管脚资源是从COL0和ROW0开始的,例如上面设置的3×3大小,占用的管脚为COL0-COL2,ROW0-ROW2,对应的按键如下图所示:

3×3对应按键

驱动加载成功后,会在/dev/input目录下生成对应的event设备节点,系统根据当前的event设备数,会自动为生成设备节点增加序号。以ESM335x为例,生成的设备节点为/dev/input/even1,如下图:

设备节点

图中event0为ESM335x主板自带的触摸屏设备节点,所以加载驱动后矩阵键盘的设备节点就会自动命名为event2,通过这个设备节点,就可以通过程序读取按键的键值了。其中每一个按键都有一个对应的键值,英创公司使用的是标准的WINDOWS按键消息值,为方便客户评估,矩阵键盘的虚拟键码与英创矩阵键盘扩展模块(ETA201)完全对应,具体的虚拟键码如下所示:

COL0 COL1 COL2 COL3
ROW0 VK_ESCAPE/0x1B VK_0/0x60 VK_PERIOD/0xBE VK_BACK/0x08
ROW1 VK_ADD/0x6B VK_1/0x61 VK_2/0x62 VK_BACK/0x08
ROW2 VK_SUBTRACT/0x6D VK_4/0x64 VK_5/0x65 VK_BACK/0x08
ROW3 VK_MULTIPLY/0x6A VK_7/0x67 VK_8/0x68 VK_9/0x69
ROW4 VK_DIVIDE/0x6F VK_SPACE/0x20 VK_DECIMAL/0x6E VK_RETURN/0x0D

与虚拟键码对应的16进制值可在MSDN上找到:http://msdn.microsoft.com/zh-cn/library/ms927178(en-us).aspx>/u?。

软件上十分简单,在程序中先通过open函数打开矩阵键盘对应的设备节点,然后通过read函数就可以读取出信息,具体代码如下:

struct input_event input;
int fd, rd;
//打开设备节点
if ((fd = open ("/dev/input/event1", O_RDONLY)) == -1)
{
printf ("open failed! ");
return -1;
}
rd = read(fd, (void*)&input, sizeof(input));
if(rd <= 0)
printf ("rd: %d ", rd);

在上面的代码中可以看到,读取出来的是一个input_event结构体,这是Linux系统标准都文件定义的结构体,通过这个结构体可以获取到我们所需要的所有信息,下面就来介绍一下这个结构体:

/*
* The event structure itself
*/
structinput_event {
struct timeval time;
__u16type;
__u16code;
__s32value;
};

其中time的值为按键时间。type为事件类型,因为驱动支持的是矩阵键盘,所以这里的值总是为EV_KEY(0x01)。code为键值,具体的键值请参考上面的表格。value为按键事件的值,在事件类型为EV_KEY时,当按键按下时值为1,松开时值为0。

读取按键操作的完整代码如下:

intmain (int argc, char *argv[])
{
struct input_event input;
int fd, rd;
//打开设备节点
if ((fd = open ("/dev/input/event1", O_RDONLY)) == -1)
{
printf ("open failed! ");
return -1;
}
printf("Press any key. ");
while(1)
{
memset((void*)&input, 0, sizeof(input));
//读取input设备信息
rd = read(fd, (void*)&input, sizeof(input));
if(rd <= 0)
printf ("rd: %d ", rd);
//判断按键动作
if(input.type == 1)
{
switch(input.value)
{
case 0:
printf("Key release ");
break;
case 1:
printf("Key press ");
break;
case 2:
printf("Key hold ");
break;
default:
printf("Undifined value ");
}
//打印键值
printf("Code: 0x%x ", input.code);
}
}
return 0;
}

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

    关注

    3

    文章

    3438

    浏览量

    87142
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34606
收藏 人收藏

    评论

    相关推荐

    采用NT33510显示屏,如何通过矩阵键盘更改显示屏的数字内容?

    我想实现一个这样的功能:我的LCD当前显示的是:新年快乐!2018! 想通过矩阵键盘将2018更改成2019,这个过程首先通过矩阵键盘上的左
    发表于 04-24 08:10

    通过大小鼠无血压测量实验明白了无血压测量技术的重要性

    血压测量技术的重要性:无血压测量技术是一种非侵入性的测量方法,可以避免对动物造成不必要的伤害。医学研究中,无
    发表于 04-22 09:40

    EMC技术:基础概念到应用的解读?|深圳比达电子.

    EMC技术:基础概念到应用的解读?|深圳比达电子电磁兼容性(Electromagnetic Compatibility,简称EMC)作为一项重要的技术领域,现代电子设备中扮演着至关
    发表于 03-11 11:59

    请问怎么才能让矩阵键盘时蜂鸣器不叫(都在P1口)?

    的单片机学习板,矩阵键盘和蜂鸣器都在P1口,使用矩阵时蜂鸣器一直叫,很无奈
    发表于 10-31 07:26

    码科技精彩亮相火爆的IOTE 2023,多面赋能AIoT产业发展!

    码科技展位,现场的伙伴们集中了解到了基于多家国产主流平台算力产品的特点和对应的落地案例,同时深入了解码科技赋能项目落地过程中自
    发表于 09-25 10:03

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    [华科智]RK3588核心板开发

    感谢电子发烧友论坛网。 感谢深圳市华科智技术科学有限公司。 感谢深圳市鸿达数码科学有限公司。 今儿个给大伙分享一款核心板-RK3588-M45 更多产品信息,请私wo
    发表于 09-18 16:03

    泰伦通话降噪方案,采用深度学习降噪算法,让通话更清晰

    处理技术,通过调整不同频段的音量、增益和频率响应,改变音频信号不同频率的能量分布,对通话音频信号进行均衡处理,以优化声音质量和听感体验。 启泰伦通话降噪前后波形图 通话降噪方案
    发表于 08-22 17:36

    华秋硬联合安加速器,加速和创新赋能技术驱动型创业者

    区定制创新方案,助力科技加速与产业升级;注重本土产业与国际市场的合作,通过全球化布局帮助国外先进技术国内落地,以及国内项目在国外推广和落地。 权益介绍 为助力第九届中国硬件创新创客大赛,安加速器将为
    发表于 08-18 14:37

    可瑞直流充电模块电路板图纸

    有没有大佬可以提供一下可瑞GZ22010-3的电路板图呢
    发表于 08-17 19:46

    泰伦新成果发布交流会线上直播预约开启

    实现离线语音和BLE小程序双重控制。 CI231系列实拍图 02 发布启物联小程序 启泰伦基于启AIoT云,提供“启物联”小程序
    发表于 08-15 14:31

    扩展模块之矩阵键盘

    15V2PB63GND4PB75PB16GND7PB08PA89VDD_NODE10PB4我们来看看矩阵键盘的引脚的定义:所以我们可以得到引脚关系如下:扩展板序号矩阵键盘模块引脚2RO
    的头像 发表于 07-31 22:06 482次阅读
    扩展模块之<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>

    今天看一下矩阵键盘怎么

    矩阵键盘
    YS YYDS
    发布于 :2023年07月02日 18:08:06

    硬科技,未来!第十五届深赛福田预选赛-华秋第九届硬大赛正式启幕

    :深圳市福田区科技创新局 主办单位:深圳华秋电子有限公司 官方媒体:电子发烧友、硬声APP 联合主办单位: 深圳市福田区新一代信息技术产业链党委、深圳新一代产业园、深圳市微纳集成电路与系统应用研究
    发表于 05-16 11:45

    生态伙伴 | 硬大赛新起航!携手华强科广场,助力硬科技创业者

    。 项目同时也是福田区首个以先进智造业为主题的产业园区,园区将重点围绕智能终端、智能机器人、高端装备制造、半导体与集成电路、新一代信息技术等先进智造业上下游进行招商引资,入驻企业将有机会获得政府租金补贴
    发表于 05-16 09:51