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(), _gpioController.OpenPin(), _gpioController.OpenPin(), _gpioController.OpenPin(), _gpioController.OpenPin(), _gpioController.OpenPin(), _gpioController.OpenPin(), _gpioController.OpenPin() }; for (int i = ; i < ; i++)
{
//设置为输入并监听引脚电平变化
//set input mode and listen pin level change
if (i < )
{
_pins[i].SetDriveMode(GpioPinDriveMode.Input);
_pins[i].DebounceTimeout = TimeSpan.FromMilliseconds();
_pins[i].ValueChanged += (GpioPin sender, GpioPinValueChangedEventArgs args) =>
{
lock (this)
//高电平
//high level
if (_initCompleted && GpioPinEdge.RisingEdge == args.Edge)
//扫描列线
//scan column pin
for (int j = ; j < ; j++)
{
_pins[j].Write(GpioPinValue.Low);
if (GpioPinValue.Low == sender.Read())
{
//获取生成键码并输出到界面
//generate keycode and print on UI
Msg = _keyMaps[(byte)(( << ToIndex(sender)) | ( << 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, '');
_keyMaps.Add(0x84, '');
_keyMaps.Add(0x82, '');
_keyMaps.Add(0x81, 'A');
_keyMaps.Add(0x48, '');
_keyMaps.Add(0x44, '');
_keyMaps.Add(0x42, '');
_keyMaps.Add(0x41, 'B');
_keyMaps.Add(0x28, '');
_keyMaps.Add(0x24, '');
_keyMaps.Add(0x22, '');
_keyMaps.Add(0x21, 'C');
_keyMaps.Add(0x18, '*');
_keyMaps.Add(0x14, '');
_keyMaps.Add(0x12, '#');
_keyMaps.Add(0x11, 'D');
} //获取行线索引
//get row pin index
private int ToIndex(GpioPin pin)
{
int result = -;
for (int i = ; i < _pins.Length; i++)
{
if (pin.Equals(_pins[i]))
{
result = i;
break;
}
}
if ( > 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

Win10 IoT C#开发 6 - 4x4矩阵键盘扫描的更多相关文章

  1. 4x4矩阵键盘扫描

    4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架 ...

  2. 4X4矩阵键盘扫描程序

    4X4矩阵键盘扫描: 1. 4根行线的GIO均设为Output,根列线的GIO均设为Input: 2. 4根行线的GIO分别置为0111.1011.1101.1110,读逐一读取列线GIO的值,可确定 ...

  3. 4x4矩阵键盘 扫描程序

    一:不排除第四位异常处理 uchar JuzhenkeyScan() { // P3=0xfe; // temp=P3; // while(temp!=0xfe) // { // temp=P3; / ...

  4. 基于FPGA的4x4矩阵键盘驱动调试

    好久不见,因为博主最近两个月有点事情,加上接着考试,考完试也有点事情要处理,最近才稍微闲了一些,这才赶紧记录分享一篇博文.FPGA驱动4x4矩阵键盘.这个其实原理是十分简单,但是由于博主做的时候遇到了 ...

  5. Win10 IoT C#开发 4 - UART 串口通信

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...

  6. Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 前几章我 ...

  7. Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...

  8. Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一篇文 ...

  9. Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. The ...

随机推荐

  1. HttpContext.Current:异步模式下的疑似陷阱之源

    最近园子里首页有好几篇文章都是讲异步编程的,尤其是几篇讲博客园自身的异步化建设的文章,看了以后很有收获. 闲暇之余再重新查查资料温故知新学习一遍,重新认识了SynchronizationContext ...

  2. Mac OS 环境下 安装 Asp.Net及使用Yeoman 创建Asp.Net 项目

    本文是按照英文原文:Installing ASP.NET 5 On Mac OS安装时遇到的问题的总结Blog. 原文提示如下: Installing ASP.NET 5 On Mac OS XBy ...

  3. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA 从错失良机到艰辛的DOS征程,从坎坷购机自学路到转机起程,从爱好到事业,他从一个完全不懂电脑的人到VBA高级应用者,一切全是自学…… 我是罗刚君,来自四川的一个小县 ...

  4. vue.js学习之入门实例

    之前一直看过vue.js官网api,但是很少实践,这里抽出时间谢了个入门级的demo,记录下一些知识点,防止后续踩坑,牵扯到的的知识点:vue.vue-cli.vue-router.webpack等. ...

  5. SpringSide 部署showcase项目出现 JAX-RS (REST Web Services) 2.0 can not be installed错误!

    maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed 项目problem提示错误 JAX-RS (REST Web ...

  6. Model-View-Controller(MVC) is an architectural pattern that frequently used in web applications. Which of the following statement(s) is(are) correct?

    Model-View-Controller(MVC) is an architectural pattern that frequently used in web applications. Whi ...

  7. andriod adt和andriod sdk

    今天搭建appium的环境,没有太明白andriod adt和andriod sdk分别是什么东西,经过与开发沟通,大致了解如下,这里记录一下,免得过几天就搞忘了. andriod adt是一个插件, ...

  8. 让我们一起写出更有效的CSharp代码吧,少年们!

    周末空闲,选读了一下一本很不错的C#语言使用的书,特此记载下便于对项目代码进行重构和优化时查看. Standing On Shoulders of Giants,附上思维导图,其中标记的颜色越深表示在 ...

  9. 提高 DHTML 页面性能

    联盟电脑摘要:本文说明了某些DHTML功能对性能的重大影响,并提供了一些提高DHTML页面性能的技巧. 目录 简介 成批处理DHTML更改 使用innerText 使用DOM添加单个元素 扩展SELE ...

  10. 深入理解PHP内核(十四)类的成员变量及方法

    原文链接:http://www.orlion.ga/1237/ 类的成员变量在PHP中本质是一个变量,只是这些变量都归属于某个类,并且给这些变量是有访问控制的. 类的成员方法在PHP中本质是一个函数, ...