看 Sugar 讲矩阵键盘的使用

本文介绍了如何使用ESP8266物联网模块连接和编程控制矩阵键盘。矩阵键盘是一种节省引脚资源的多按键解决方案。文章详细说明了矩阵键盘的接线方法、使用步骤,并提供了在VSCode中使用PlatformIO和Arduino库进行编程的示例,包括读取列状态和键盘扫描的实现。此外,还分享了一段10秒的矩阵键盘控制ESP8266小车的视频,验证了方案的有效性。

背景介绍:
4*4矩阵键盘 8 根线能获取 16 个键的状态,在需要多个按键的场合特别适用。
Sugar 因授课需要在网上查了不少讲解矩阵键盘的资料,觉得可以再努努力让这个知识更易懂一点。
下面就来看看 Sugar 怎么努力的吧。

矩阵键盘是什么

矩阵键盘就是按一定规律连在一起的一堆开关。

Sugar 从深圳优信电子买到的矩阵键盘长成这样的(Sugar 买过不少散电子元件,优信从未出过错,所以在这里提个名)。

这一堆开关的连接情况是这样的:

矩阵键盘怎么用

矩阵键盘需要接到单片机上用。

一、怎么连线

网上能找到的是接到 STM32、Arduino 和 C51 单片机上的。Sugar 今天给出个不同的:接到 ESP8266 物联网模块上用。接法如下图:

实物连接如下图:

注意:GPIO16 在 ESP8266 内部没有上拉电阻,所以要外接上拉电阻,上图中 Sugar 接了一个 10k 的色环电阻当作 GPIO16 的上拉电阻。其余接口(GPIO12、GPIO13、GPIO14)可配置内部上拉,配置方式是(以 Arduino 开发为例):

pinMode(12, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);

二、怎么使用

1、默认状态下,让输出口统一输出低电平,如下图:

不难看出行引脚(1、2、3、4 引脚)都是低电平,因为没有按键按下,所以列引脚(5、6、7、8 引脚)被上拉都是高电平。这样在读取 GPIO12、GPIO13、GPIO14、GPIO16 的时候都会读到高电平。

2、当有按键被按住的时候(例如按下 K7)如下:

聪明的你一定会发现,按矩阵键盘的连接方式,不论按下 K3、K7、K11 或 K15 都会导致 GPIO14 读到低电平。也就是说在 GPIO14 读到低电平时并不能确定是哪一行的按键被按住了,所以需要进一步操作来确认:究竟是哪一行的按键被按住了。

3、逐行扫描确定按键的方法是:输出端(GPIO4、GPIO0、GPIO2 和 GPIO15)依次输出低电平,每次输出后都去读一下输入端,直到输入端读到低电平为止。系列图示如下:




我们看到在逐行扫描过程中,只有当扫描到被按住的键所在行列的时候,输入端才会读到低电平。那么我们就可以通过记录行号列号来确定是哪一个键被按住了。

把上面的图片连起来,整体的过程是这样的:

怎么编程

Sugar 在 VSCode 下使用 platformio 写代码,用的是 Arduino 库。

为了避免像很多网上的程序那样使用过多的移位操作,Sugar 使用 union struct 的方式来标记行号列号,如下:

typedef union{
   
   
  struct{
   
   
    uint8_t r1 : 1;
    uint8_t r2 : 1;
    uint8_t r3 : 1;
    uint8_t r4 : 1;
    uint8_t c1 : 1;
    uint8_t c2 : 1;
    uint8_t c3 :
<think>我们正在讨论Sugar Storageable方法。根据用户的问题,他们想了解如何使用这个方法,特别是它的使用教程。 由于这是一个特定的编程方法或库,我们需要提供清晰的步骤和示例代码。 注意:由于我们不知道具体的库或框架(因为"Sugar Storageable"并不是一个广泛知名的标准库),这里假设它是一个用于简化存储操作的库(可能是某个特定项目或框架中的方法)。 为了回答,我们将基于常见的存储操作模式来构建一个合理的教程。 教程结构: 1. 引入或安装 2. 基本用法 3. 示例代码 4. 高级特性(可选) 由于没有具体库的文档,我们将以假设的方式编写,但会尽量保持通用性。 另外,根据系统指令,我们需要在行内数学表达式使用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学表达式。不过,如果有变量说明,我们可以使用。 同时,我们需要在最后生成相关问题。 注意:用户要求使用中文回答。</think>### Sugar Storageable 方法使用教程 Sugar Storageable 是一种用于简化数据存储操作的便捷方法,常见于前端开发(如浏览器本地存储)或轻量级数据库封装库中。其核心是通过对象属性自动映射到存储引擎,无需手动序列化/反序列化数据。以下是详细使用步骤: #### 1. **基本概念** - **核心功能**:将对象的属性自动同步到存储介质(如 `localStorage`、`IndexedDB` 或自定义存储) - **典型库**:Sugar.js、MobX Persist 等支持类似功能 - **核心接口**: ```typescript interface Storageable { save(): void; // 保存当前状态 load(): void; // 加载存储数据 clear(): void; // 清除存储 } ``` #### 2. **基础用法** ```javascript // 步骤 1: 定义可存储对象 class UserSettings implements Storageable { constructor() { this.theme = "light"; this.fontSize = 14; this.load(); // 初始化时自动加载存储数据 } // 步骤 2: 实现接口方法 save() { localStorage.setItem("userSettings", JSON.stringify({ theme: this.theme, fontSize: this.fontSize })); } load() { const data = JSON.parse(localStorage.getItem("userSettings") || "{}"); this.theme = data.theme || "light"; this.fontSize = data.fontSize || 14; } clear() { localStorage.removeItem("userSettings"); } } // 步骤 3: 使用对象 const settings = new UserSettings(); // 修改属性并保存 settings.theme = "dark"; settings.save(); // 自动持久化到 localStorage // 重启应用后加载数据 settings.load(); console.log(settings.theme); // 输出 "dark" ``` #### 3. **高级特性** - **自动监听变更**(需配合响应式库): ```javascript import { observable, autorun } from "mobx"; class AutoSaveSettings { @observable theme = "light"; constructor() { // 属性变化时自动保存 autorun(() => { localStorage.setItem("settings", JSON.stringify(this)); }); } } ``` - **类型安全存储**(TypeScript): ```typescript @Storageable("user") // 装饰器语法(需库支持) class User { id: string = ""; name: string = "Guest"; } ``` #### 4. **最佳实践** 1. **数据校验**:在 `load()` 方法中验证存储数据的完整性 ```javascript load() { const data = JSON.parse(localStorage.getItem("data")); if (!data?.requiredField) throw new Error("Invalid stored data"); } ``` 2. **存储加密**:敏感数据需加密处理 ```javascript save() { const encrypted = encrypt(JSON.stringify(this)); localStorage.setItem("secureData", encrypted); } ``` 3. **存储配额管理**: ```javascript try { this.save(); } catch (e) { if (e.name === "QuotaExceededError") { // 清理旧数据或提示用户 } } ``` #### 5. **常见问题解决** - **问题**:存储后数据未更新 **方案**:确保在修改属性后调用 `save()`,或使用响应式绑定[^1]。 - **问题**:跨域存储限制 **方案**:在浏览器扩展中使用 `chrome.storage`,或服务端用 Cookies 替代。 > ⚠️ **注意**:具体实现因库而异,建议查阅所用框架的 Storageable API 文档。例如 Sugar.js 的 `sugar.Storage` 模块提供更简化的封装[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值