4x4矩阵键盘扫描
4x4矩阵键盘扫描
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行。
上一章我们讲了 Win10 IoT 如何对本地 IoT 设备内嵌 SQLite 数据库进行 CURD 操作 ,这章我们来学习如何使用 GPIO Pin 扫描4x4矩阵键盘按键状态。如果对安装部署过程还不熟悉可以参考前几篇文章,Raspberry安装 IoT系统及搭建开发环境(http://www.cnblogs.com/cloudtech/p/5562120.html),创建 IoT应用及三种部署方法(http://www.cnblogs.com/cloudtech/p/5637983.html)。
准备工作:
刷好Win 10 IoT Core系统的 Raspberry Pi 2
部署Visual Studio 2015开发环境的PC
4x4矩阵键盘
GPIO扩展板
IDC排线
杜邦线
面包板
实验目标: 在4x4矩阵键盘上按下按键后,在程序界面上显示对应的按键字符。
1.安装元器件
首先将 GPIO扩展板 安装到面包板上,再通过 IDC排线 与 Raspberry Pi 2 的 GPIO 接口连接。
4x4矩阵键盘电路图
行线R0-3分别与Pin5、Pin6、Pin13、Pin19 引脚连接。
列线C0-3分别与Pin12、Pin16、Pin20、Pin21 引脚连接。
2.编写代码
打开 VS 2015 点击 New Project 在Visual C# -> Windows -> Universal 中找到 Blank App (Universal Windows) 项目模板,选中模板输入项目名称后点击OK按钮创建项目。
项目创建完成后,在Reference Manager Extensions中 勾选Windows IoT Extensions for the UWP 添加 IoT扩展。
程序启动后获取默认GPIO控制器,对引脚进行初始化。
行线R0-3设置为输入端,20ms延时消抖,检测到高电平认为有按键按下,对列线逐一扫描确认。
列线C0-3设置为输出端高电平。
键码映射表如下
行线R0-3对应键码低4位。
列线C0-3对应键码高4位。
这里为了简便把MainPage.cs作为ViewModel,来实现INotifyPropertyChanged接口完成一个简易的MVVM框架。
代码如下:

namespace CloudTechIot6
{
//http://www.cnblogs.com/cloudtech
//cloudtechesx@gmail.com
public sealed partial class MainPage : Page, INotifyPropertyChanged
{
#region Fileds
//GPIO控制器
//Gpio Controller
private GpioController _gpioController;
//引脚集合
//Pin Collection
private GpioPin[] _pins;
//键码表
//KeyCode Table
private Dictionary<byte, char> _keyMaps;
private bool _initCompleted; #endregion #region Events public event PropertyChangedEventHandler PropertyChanged; #endregion #region Properties private string _msg;
//键码
//Key Code
public string Msg
{
get
{
return _msg;
} set
{
_msg = value;
OnPropertyChanged(this, new PropertyChangedEventArgs("Msg"));
}
} public string FreshTime
{
get
{
return _freshTime;
} set
{
_freshTime = value;
OnPropertyChanged(this, new PropertyChangedEventArgs("FreshTime"));
}
} private string _freshTime; #endregion #region Constructor public MainPage()
{
this.InitializeComponent();
this.DataContext = this;
_initCompleted = false;
_keyMaps = new Dictionary<byte, char>();
InitKeyMaps();
//获取默认GPIO控制器
//Get Default Gpio Controller
_gpioController = GpioController.GetDefault();
if (null == _gpioController)
{
throw new Exception("GpioController init failed");
}
//初始化 GPIO Pin
//Init GPIO 引脚
_pins = new GpioPin[] { _gpioController.OpenPin(5), _gpioController.OpenPin(6), _gpioController.OpenPin(13), _gpioController.OpenPin(19), _gpioController.OpenPin(12), _gpioController.OpenPin(16), _gpioController.OpenPin(20), _gpioController.OpenPin(21) }; for (int i = 0; i < 8; i++)
{
//设置为输入并监听引脚电平变化
//set input mode and listen pin level change
if (i < 4)
{
_pins[i].SetDriveMode(GpioPinDriveMode.Input);
_pins[i].DebounceTimeout = TimeSpan.FromMilliseconds(20);
_pins[i].ValueChanged += (GpioPin sender, GpioPinValueChangedEventArgs args) =>
{
lock (this)
//高电平
//high level
if (_initCompleted && GpioPinEdge.RisingEdge == args.Edge)
//扫描列线
//scan column pin
for (int j = 4; j < 8; j++)
{
_pins[j].Write(GpioPinValue.Low);
if (GpioPinValue.Low == sender.Read())
{
//获取生成键码并输出到界面
//generate keycode and print on UI
Msg = _keyMaps[(byte)((1 << ToIndex(sender)) | (1 << j))].ToString();
FreshTime = DateTime.Now.ToString("HH:mm:ss");
_pins[j].Write(GpioPinValue.High);
break;
}
_pins[j].Write(GpioPinValue.High);
}
};
}
//设置为输出高电平
//set output high level
else
{
_pins[i].SetDriveMode(GpioPinDriveMode.Output);
_pins[i].Write(GpioPinValue.High);
}
}
Msg = "Push Button";
//初始化完成
//initialize completed
_initCompleted = true;
} #endregion #region Methods //MVVM依赖属性通知事件
private async void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { PropertyChanged?.Invoke(sender, e); });
} //初始化键码表
//initialize keycode
private void InitKeyMaps()
{
_keyMaps.Add(0x88, '1');
_keyMaps.Add(0x84, '2');
_keyMaps.Add(0x82, '3');
_keyMaps.Add(0x81, 'A');
_keyMaps.Add(0x48, '4');
_keyMaps.Add(0x44, '5');
_keyMaps.Add(0x42, '6');
_keyMaps.Add(0x41, 'B');
_keyMaps.Add(0x28, '7');
_keyMaps.Add(0x24, '8');
_keyMaps.Add(0x22, '9');
_keyMaps.Add(0x21, 'C');
_keyMaps.Add(0x18, '*');
_keyMaps.Add(0x14, '0');
_keyMaps.Add(0x12, '#');
_keyMaps.Add(0x11, 'D');
} //获取行线索引
//get row pin index
private int ToIndex(GpioPin pin)
{
int result = -1;
for (int i = 0; i < _pins.Length; i++)
{
if (pin.Equals(_pins[i]))
{
result = i;
break;
}
}
if (0 > result)
{
throw new Exception("Unknow Pin Index");
}
else
{
return result;
}
} #endregion
}
}

3.调试代码
为Raspberry连接电源及网线,连接HDMI显示器。接通电源待系统启动完成后显示器上会显示当前IoT设备的IP地址。
在 Visual Studio 2015 的工具栏中选择 Remote Machine 进行调试,IP地址输入设备对应地址。点击运行后会自动部署到设备上。
这里要注意平台要选择ARM。
程序启动后按下4x4矩阵键盘上的按键后,程序界面上显示对应的按键字符,与预期结果一致。
到这里C#操作 Win10 IoT设备的4x4矩阵键盘过程就完成了,如果对代码有优化的建议,欢迎留言或发邮件给我(cloudtechesx@gmail.com)。也可以扫描下面的二维码加我的微信号查看以前的文章。
完整项目源码 GitHub https://github.com/CloudTechx/CloudTechIot 的 CloudTechIot6 目录下。
Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境 http://www.cnblogs.com/cloudtech/p/5562120.html
Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法 http://www.cnblogs.com/cloudtech/p/5637983.html
Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管 http://www.cnblogs.com/cloudtech/p/5617902.html
Win10 IoT C#开发 4 - UART 串口通信 http://www.cnblogs.com/cloudtech/p/5518306.html
Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD http://www.cnblogs.com/cloudtech/p/5657123.html
4x4矩阵键盘扫描的更多相关文章
- 4X4矩阵键盘扫描程序
4X4矩阵键盘扫描: 1. 4根行线的GIO均设为Output,根列线的GIO均设为Input: 2. 4根行线的GIO分别置为0111.1011.1101.1110,读逐一读取列线GIO的值,可确定 ...
- Win10 IoT C#开发 6 - 4x4矩阵键盘扫描
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...
- 4x4矩阵键盘 扫描程序
一:不排除第四位异常处理 uchar JuzhenkeyScan() { // P3=0xfe; // temp=P3; // while(temp!=0xfe) // { // temp=P3; / ...
- 基于FPGA的4x4矩阵键盘驱动调试
好久不见,因为博主最近两个月有点事情,加上接着考试,考完试也有点事情要处理,最近才稍微闲了一些,这才赶紧记录分享一篇博文.FPGA驱动4x4矩阵键盘.这个其实原理是十分简单,但是由于博主做的时候遇到了 ...
- 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)
本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样 ...
- stm32矩阵键盘扫描数据通过USB发送
Keyboard.c #include "keyboard.h"#include "my_usb.h"#include " ...
- MCU软件最佳实践——矩阵键盘驱动
1.矩阵键盘vs独立按键 在mcu应用开发过程中,独立按键比较常见,但是在需要的按键数比较多时,使用矩阵键盘则可以减少io占用,提高系统资源利用率.例如,某mcu项目要求有16个按钮,如果采用独立按键 ...
- 【STM32学习笔记】STM32f407 使用4*4矩阵键盘
作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明.谢谢! 写在前面: 这是本人第一次开始写博客,可能写的不是很好,也请大家谅 ...
随机推荐
- 【Android类型SDK测试(一)】认识Android类型的 SDK
(一)SDK是个什么东东 接触软件相关行业的同学都应该知道,SDK(即 Software Development Kit),软件开发包.其作用就是为开发某些软件提供一些便利的东西,包括工具 集合,文档 ...
- JAVA笔记(一)super and this
http://zhangjunhd.blog.51cto.com/113473/20531 总结关键字this与super用法. author: ZJ 07-3-12 Blog: [url]http: ...
- git安装及使用简介
从源代码安装 有人觉得从源码安装 Git 更实用,因为你能得到最新的版本. 二进制安装程序倾向于有一些滞后,当然近几年 Git 已经成熟,这个差异不再显著. 如果你想从源码安装 Git,需要安装 Gi ...
- python操作redis-set
#!/usr/bin/python #!coding: utf-8 import redis if __name__=="__main__": try: conn=redis.St ...
- python连接redis文档001
Installation redis-py requires a running Redis server. See Redis’s quickstart for installation instr ...
- SQL Server SQLOS
SQLOS 抽象出了: 1.任务高度管理子系统. 2.内存管理子系统. 3.错误,异常处理机制. 4.死锁侦测各解决机制. 5.运行第三方代码. 好处: 1.减少线种的上下文切换.空闲连接不占用线程.
- 用JavaScript将数字转换为大写金额
var digitUppercase = function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', ...
- QT Creator 2.7.2 代码自动补全快捷键设置
在QT Creater界面点[工具]再进[选项]找到[环境]下的[键盘]选项,搜索[CompleteThis]发现默认快捷键就是CTRL+SPACE,把它删除,然后添加自己想设置的快捷键(因为之前用e ...
- android事件详解
http://blog.csdn.net/asce1885/article/details/7596669 http://blog.csdn.net/liranke/article/details/6 ...
- Delphi与字符编码(实战篇)(MultiByteToWideChar会返回转换后的宽字符串长度)
本文目标: 了解Delphi的字符串类型 字符编码的检测与转换 简体繁体转换 0. 导言 看完“.Net与字符编码(理论篇)”,我们明白了字符是自然语言中的最小单位,在存储和传输的过程中可以使用三种编 ...