PIC 微控制器:扫描 4x4 键盘上的输入,仅使用 C 中的端口 C RC0-RC3

Posted

技术标签:

【中文标题】PIC 微控制器:扫描 4x4 键盘上的输入,仅使用 C 中的端口 C RC0-RC3【英文标题】:PIC Microcontrollers: Scan inputs on a 4x4 Keypad, using only Port C RC0-RC3 in C 【发布时间】:2014-12-10 18:09:44 【问题描述】:

我是 PIC 微控制器和 C 编程的新手,我的任务是创建自己的键盘扫描方法,该方法专门用于端口 C(16F877A 微控制器)。具体来说,使用这种方法的程序只使用数字 1、2、4 和 5- 所以为了高效,扫描仪方法是只使用 RC0、RC1、RC2 和 RC3 作为指定的输入/输出(我不允许使用 RC4-RC7)。这实际上将 4x4 键盘变成了 2x2 键盘。

我了解扫描的概念是将行上的端口线设置为高,并将行设置为输入列 - 当按下按钮时,这会读取端口的低半字节以检测按钮。

不幸的是,我不知道如何在 C 中编写代码,尤其是使用上面指定的端口行。任何人都可以阐明这个问题并指出我正确的方向吗? 谢谢!

【问题讨论】:

Andrew Medico 实际上已经正确回答了您的问题。您可能想更改问题的标题:它实际上与 4x4 键盘无关:在您的情况下,4x4 键盘的 3 个象限是“哑弹”。如果将 Y0 Y1 Y2 Y3 分配给行,将 X0 X1 X2 X3 分配给列:您只需要 Y0 Y1 和 X0 X1。从这里开始,您可以将任何代码模板用于 2x2 键盘。 PIC16F877A 有许多 C 变体(MPLAB、XC、HI-TECH、microC...)如果您正在寻找 PIC 感知 C 的特定变体的解决方案,您可能会在electronics.stackexchange.com 上获得更好的答案 【参考方案1】:

一种可能的方法:

硬件:

    将 RC0 连接到第 0 行 将 RC1 连接到第 1 行 将 RC2 连接到第 0 列 将 RC3 连接到第 1 列

软件:

设置:

    将 RC0 和 RC1 配置为输出 将 RC2 和 RC3 配置为输入

阅读:

    将 RC0 设置为高,RC1 设置为低 读取 RC2。如果高,则按下1 读取 RC3。如果高,则按下2 将 RC0 设置为低,RC1 设置为高 读取 RC2。如果高,4 被按下 读取 RC3。如果高,5 被按下

添加适当的上拉/下拉和去抖动留给读者作为练习。

【讨论】:

【参考方案2】:

它的工作方式是在 4 的一列上启用输出电压。然后读取 4 位行数据,以确定按下哪些键来完成电路。然后循环其他列。然后,您可以使用 column * 4 + row 其中一个(或多个)键被关闭来确定按下了哪个键矩阵位置键。通常这不会直接映射到预期的键值,因此您使用查找表进行转换,或者使用一些#define 语句。此外,逻辑可能会颠倒。

【讨论】:

以上是关于PIC 微控制器:扫描 4x4 键盘上的输入,仅使用 C 中的端口 C RC0-RC3的主要内容,如果未能解决你的问题,请参考以下文章

Arduino与Proteus仿真实例-74C922键盘解码驱动仿真

Arduino与Proteus仿真实例-4x4矩阵键盘驱动仿真

51单片机4x4矩阵键盘扫描+数码管显示(修bug篇)

是否可以创建支持多个不同微控制器的 PIC 固件二进制文件?

51单片机4x4矩阵键盘扫描+数码管显示

Proteus仿真51单片机4x4矩阵键盘扫描lcd1602显示