01 键盘矩阵


1.按键接口

手边的一个4×4键盘板具有一个8pins接口。可以通过MCU的8个IO进行读取操控。

▲ 4×4键盘

2.实验接口

使用 ATMEGA328实验电路板 来对于键盘矩阵进行读取。

▲ 实验ATMEGA328的原理图

对外部的接口定义:

PIN1 PIN2 PIN3 PIN4 PIN5 PIN6 PIN7 PIN8 PIN9 PIN10
+5V GND ADC0 ADC1 ADC2 ADC3 IO0 IO1 IO2 IO3
NULL NULL PC0 PC1 PC2 PC3 PB1 PB2 PB3 PB4

使用PC0 ~ 3和 PB1 ~ 4与键盘8pins接口相连。

02 测试软件


1.实验软件1

KB44驱动软件:

/*
**==============================================================================
** KB44.H:            -- by Dr. ZhuoQing, 2020-11-14
**
**  Description:
**
**==============================================================================
*/
#ifndef __KB44__
#define __KB44__
//------------------------------------------------------------------------------
#ifdef KB44_GLOBALS#define KB44_EXT
#else#define KB44_EXT extern
#endif // KB44_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
#define KB44_C0             C,0
#define KB44_C1             C,1
#define KB44_C2             C,2
#define KB44_C3             C,3
#define KB44_K0             B,1
#define KB44_K1             B,2
#define KB44_K2             B,3
#define KB44_K3             B,4//------------------------------------------------------------------------------
void KB44Init(void);
unsigned char KB44ReadKeyCode(void);
unsigned char KB44ReadKey(void);void KB44SetColumn(unsigned char ucCol);
unsigned char KB44ReadKey4(void);//------------------------------------------------------------------------------
#define KB44_KEY_NULL       0xff//==============================================================================
//             END OF THE FILE : KB44.H
//------------------------------------------------------------------------------
#endif // __KB44__
/*
**==============================================================================
** KB44.C:             -- by Dr. ZhuoQing, 2020-11-14
**
**==============================================================================
*/#include <iom328pv.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>
#include "m328.h"
#include "iccavr_port.h"
//------------------------------------------------------------------------------
#define KB44_GLOBALS        1              // Define the global variables
#include "KB44.H"//------------------------------------------------------------------------------//------------------------------------------------------------------------------
void KB44Init(void) {ON(KB44_C0);ON(KB44_C1);ON(KB44_C2);ON(KB44_C3);ON(KB44_K0);ON(KB44_K1);ON(KB44_K2);ON(KB44_K3);OUT(KB44_C0);OUT(KB44_C1);OUT(KB44_C2);OUT(KB44_C3);IN(KB44_K0);IN(KB44_K1);IN(KB44_K2);IN(KB44_K3);
}//------------------------------------------------------------------------------
void KB44SetColumn(unsigned char ucCol) {if(ucCol & 0x1) ON(KB44_C0);else OFF(KB44_C0);if(ucCol & 0x2) ON(KB44_C1);else OFF(KB44_C1);if(ucCol & 0x4) ON(KB44_C2);else OFF(KB44_C2);if(ucCol & 0x8) ON(KB44_C3);else OFF(KB44_C3);
}unsigned char KB44ReadKey4(void) {unsigned char ucChar;ucChar = 0;if(VAL(KB44_K0)) ucChar |= 0x1;if(VAL(KB44_K1)) ucChar |= 0x2;if(VAL(KB44_K2)) ucChar |= 0x4;if(VAL(KB44_K3)) ucChar |= 0x8;return ucChar;
}//------------------------------------------------------------------------------
unsigned char KB44ReadKeyCode(void) {unsigned char ucChar;KB44SetColumn(0x0);ucChar = KB44ReadKey4();KB44SetColumn(0xf);if(ucChar == 0xf) return KB44_KEY_NULL;KB44SetColumn(0xe);ucChar = KB44ReadKey4();KB44SetColumn(0xf);if(ucChar != 0xf) return ucChar | 0x10;KB44SetColumn(0xd);ucChar = KB44ReadKey4();KB44SetColumn(0xf);if(ucChar != 0xf) return ucChar | 0x20;KB44SetColumn(0xb);ucChar = KB44ReadKey4();KB44SetColumn(0xf);if(ucChar != 0xf) return ucChar | 0x40;KB44SetColumn(0x7);ucChar = KB44ReadKey4();KB44SetColumn(0xf);if(ucChar != 0xf) return ucChar | 0x80;return KB44_KEY_NULL;}//------------------------------------------------------------------------------
unsigned char KB44ReadKey(void) {unsigned char ucKey;ucKey = KB44ReadKeyCode();if(ucKey == KB44_KEY_NULL) return ucKey;WaitTime(10);if(KB44ReadKeyCode() == KB44_KEY_NULL) return KB44_KEY_NULL;while(KB44ReadKeyCode() != KB44_KEY_NULL);WaitTime(10);return ucKey;}//==============================================================================
//                END OF THE FILE : KB44.C
//------------------------------------------------------------------------------

2.测量结果1

▲ 四乘四键盘的编码测试

0 1 4 7
17 27 47 87
A 2 5 8
1b 2b 4b 8b
B 3 6 9
1d 2d 4d 8d
F E D C
1e 2e 4e 8e

03 结论


对于一款手边的4×4机械键盘进行了测试。给出了在M328下的底层驱动程序和测试键盘结果。


  1. M328键盘读写软件:Atmel\Research\2020\Test44Keyboard\KB44.C ↩︎ ↩︎

4×4键盘板:ATMEGA328接口相关推荐

  1. STM32CubeMX学习笔记(44)——USB接口使用(HID按键)

    一.USB简介 USB(Universal Serial BUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.是应用在 PC 领域的接口技术.USB 接口支持设备的即插即用和 ...

  2. 整理一些完全免费开放的API接口

    前言 在开发测试阶段,或者是在写Demo的时候,难免会用到一些测试数据,有时苦于没有可用的接口,需要自己动手去写,但是这样大大降低了效率,前期我也找了一些开放的接口,这篇文章整理一下,以下接口完全免费 ...

  3. 开源!!!100 多个常用 API 数据接口免费分享!建议收藏!

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  4. 牛逼!100多个常用 API 接口整理大全,常用的都有。。

    我们在开发的过程中,常常调用API接口,往往事半功倍.今天给大家整理了优秀的API接口! 各类无次数限制的免费API接口整理,主要是聚合数据上和API Store上的一些,还有一些其他的. 聚合数据提 ...

  5. 最新API接口(亲测可用)及其使用教程

    前言: 就我们目前来说,之前是有很多开源的接口可以使用,比如豆瓣等,但是很多都不开放了,这里提供新的开发api地址.注意,这些都是要注册的,才能拿到key,没有key没办法在其他地方使用 1.地址入口 ...

  6. 各类无次数限制的免费API接口,再也不怕找不到免费API了

    各类无次数限制的免费API接口整理,主要是聚合数据上和API Store上的一些,还有一些其他的. 聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免 ...

  7. 有意思的一些免费API接口整理,包含官网地址以及简介

    1.文档上的小牌子 官网:https://shields.io/ 举例:获取vue 在npm上的版本号 https://img.shields.io/npm/v/vue.svg?sanitize=tr ...

  8. 开源!!!100多个常用API接口免费分享!建议收藏!

    作者 : ishxiao原文:blog.csdn.net/ishxiao/article/details/53839061 我们在开发的过程中,常常调用API接口,往往事半功倍.今天给大家整理了优秀的 ...

  9. 100多个免费常用API接口分享,调用完全不限次数,以后总用得着!

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  10. 百个免费API接口分享,调用完全不限次数...

    点击上方"终端研发部",选择"星标" 回复"资源",领取全网最火的Java核心知识总结~ 作者 : ishxiao 来源:blog.csdn ...

最新文章

  1. java在何时获得对象的确切类型_JAVA面试题(1)
  2. 3D视觉应用研发系列笔记——机器人3D互动(一.技术难点分析)
  3. Image Cloud Gallery
  4. 如何测试tomcat安装成功
  5. python_模块学习
  6. android各层之间,Android运行程序在各层架构之间的相互关系
  7. 2013豆瓣校园招聘研发类笔试题
  8. linux VNC白屏,VNC使用及其常见问题解决方法
  9. .NET连接SAP系统专题:C#如何导入内文至SAP(十一)
  10. 学习笔记 ---- 设计模式之观察者模式
  11. PAT甲级1115 DFS和BST
  12. ZipArchive是一个开源的zip开发包工具。
  13. 背后实力大比拼 探秘七大IT巨头实验室
  14. 06-输出100以内的素数
  15. Martin Fowler微服务论文--译文
  16. 测试面试题集-性能测试
  17. #include < > 和 #include “ “ 的区别
  18. 用tensorflow.js实现浏览器内的手写数字识别
  19. 宝峰uv5r保存信道频率_【对讲机的那点事】宝峰UV-5R对讲机上中继台的信道存储设置方法...
  20. webpack点滴yan

热门文章

  1. i春秋 死亡ping命令 原理学习(命令执行+shell反弹)+复现
  2. 电子地图市场现状研究分析报告 -
  3. Unity资源加载闪退问题深度分析
  4. Jad批量反编译class
  5. 【华为_数通】常用命令备忘
  6. 关于举办“2019 年全国传智杯 IT 技能大赛”的通知
  7. wifi 流量劫持_无线网被流量劫持了怎么弄,WiFi流量被劫持如何处理
  8. 金蝶k3 使用两台服务器的优势,金蝶k3报价系统优势如何,电商企业应用尤为明显...
  9. 创客匠人抖音小程序引流转化三步走
  10. c语言火车票退票系统流程图,[图解12306退票流程与步骤]