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

 
分类: Win10 IoT

4x4矩阵键盘扫描的更多相关文章

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

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

  2. Win10 IoT C#开发 6 - 4x4矩阵键盘扫描

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

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

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

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

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

  5. 「雕爷学编程」Arduino动手做(26)——4X4矩阵键盘模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  6. STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

    本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可. 1.键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样 ...

  7. stm32矩阵键盘扫描数据通过USB发送

                   Keyboard.c #include "keyboard.h"#include "my_usb.h"#include " ...

  8. MCU软件最佳实践——矩阵键盘驱动

    1.矩阵键盘vs独立按键 在mcu应用开发过程中,独立按键比较常见,但是在需要的按键数比较多时,使用矩阵键盘则可以减少io占用,提高系统资源利用率.例如,某mcu项目要求有16个按钮,如果采用独立按键 ...

  9. 【STM32学习笔记】STM32f407 使用4*4矩阵键盘

    作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明.谢谢! 写在前面: 这是本人第一次开始写博客,可能写的不是很好,也请大家谅 ...

随机推荐

  1. android的reference table的问题

    写得android程序总是崩溃,感觉像是内存泄露,但是检查代码发现该释放的都释放了.最终无奈,删除了接口函数中的调用,只使用下面的测试代码. JNIEXPORT jboolean JNICALL Ja ...

  2. activity的生命周期详解

    刚在看mars老师的视频,看到activity的生命周期,就看了一下,总结了一下.下面是各函数的调用时机 为了更清楚的看清楚工作的具体过程,举例如下: ,建立两个activity,一个main,一个a ...

  3. 关于521(nyoj)

    关于521 点击这里 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去. 浏览网页的流年忽然看到了网上有 ...

  4. QString转LPCWSTR

    QFileInfo info("./records.db"); std::string str = info.absoluteFilePath().toStdString(); / ...

  5. TensorFlow 深度学习笔记 Stochastic Optimization

    Stochastic Optimization 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到I ...

  6. 编译安装mysql5.7.9

    第一步:安装一些可能会用到的依赖 yum -y install gcc-c++ ncurses-devel cmake make perl gcc autoconf automake zlib lib ...

  7. 使用Python管理Azure(1):基础配置

    Azure提供了丰富的Python SDK来对Azure进行开发管理,包括使用Azure的开源框架在Azure上创建web应用程序,对Azure的虚拟机,存储等进行管理,本系类会简单介绍如何在ASM和 ...

  8. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  9. instsrv.exe下载和使用方法(微软Windows Server 2003 Resource Kit Tools工具中的一个)

    instsrv.exe是微软Windows Server 2003 Resource Kit Tools工具中的一个. Windows Server 2003 Resource Kit Tools是一 ...

  10. 解决CentOS(RedHat)中sendmail和sm-client启动慢故障(转)

    Starting sendmail: Starting sm-client: 刚才发了修改主机名那篇文章后,我意外发现重新启动CentOS的时候系统会卡在sendmail和sm-client那里将近3 ...