想给机器人加个密码锁、做个计算器或者手动输入参数,4x4矩阵键盘是常见又便宜的方案。它最妙的地方在省引脚:16个按键内部按4行4列接成矩阵,只引出8个引脚,Arduino用8个数字口就能全部读到,比一个个按键去接省下整整8个脚。这篇把它的矩阵原理、接线和扫描方法讲清楚。
为什么会省引脚
普通独立按键,16个就要16个脚。矩阵键盘把按键内部连成网格:同一行的所有按键连到一根公共线,同一列又连到另一根公共线,这样4行4列只需要4根行线加4根列线,一共8个引脚就覆盖16个按键。按下一个键,就等于把某一行和某一列短路了,主控通过扫描就能定位是哪个。

8个引脚接Arduino数字口
4x4矩阵键盘一般引出一根8pin排线,前面4个对应列(或行)、后面4个对应另一维。常用接法是把这8个脚依次接到Arduino的D9到D2(具体行、列由代码里的rowPins、colPins数组决定,对应上就行)。不用额外接电阻,代码里会用Arduino的内部上拉。接线最大的坑是引脚顺序:如果按键读出来字符全乱,多半是行和列的顺序对不上,改代码里的顺序而不是重新接线更省事。

扫描原理一句话
扫描的思路是:先把所有列设为输出并逐列拉低,同时把行设为输入并读行电平,哪一行被拉低,就知道"当前拉低的这一列"和"被拉低的那一行"交叉处按键被按下。比如先让第1列拉低,读行发现第2行也是低,那就是第1列第2行的键被按了。4行4列轮流做一遍,就能知道所有键的状态。
用Keypad库几行搞定
手写扫描有点繁琐,好在Arduino有现成的Keypad库。用法是:先定义一个4x4字符表keys[4][4](比如数字1-9、*、0、#和A-D),再定义rowPins和colPins两个数组指明每行每列接的Arduino引脚步,最后用Keypad(makeKeymap(keys), rowPins, colPins, 4, 4)建一个对象,循环里调getKey()就能拿回按下的字符,没按返回空。这样读写简洁,还能自动消抖。
引脚太紧张怎么办
如果Arduino的数字口被传感器占满了,矩阵键盘也可以连同PCF8574这类I2C IO扩展一起用,让扩展芯片去接键盘的8根线,主控走两根SDA/SCL总线就能读键盘,几乎不占GPIO。这样在IO紧缺的板子上也能轻松加键盘输入。
8根线接对、顺序对上、用Keypad库扫描,4x4矩阵键盘就是个又便宜又省脚的输入神器。卡壳大都在引脚顺序和行列表里顺序不一致,顺着代码数组对齐就行。




配PCF8574走I2C这个路子对我IO不够的板子真救命,两根线解决
行列顺序对不上按键全乱这个坑,改代码数组比重新接线省事,亲测
Keypad库的getKey用起来很省心,自动消抖,几行就搞定16键