37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真) 实验二十六:4X4矩阵键盘模块(轻触式按键) 矩阵键盘 是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和8X8,其中用的最多的是4X4。 工作原理 矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4X4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。 行列扫描法原理 1、使行线为编程的输入线,列线是输出线,拉低所有的列线,判断行线的变化,如果有按键按下,按键按下的对应行线被拉低,否则所有的行线都为高电平。 2、在第一步判断有键按下后, 延时10ms消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下 一步,否则返回第一步重新判断。 3、开始扫描按键位置,采用逐 行扫描,每间隔1ms的时间,分别拉低第一列,第二列,第三列,第四 列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置,分别把行值和列值储存在寄存器里。 4、从寄存器中找到行值和列 值并把其合并,得到按键值,对此按键值进行编码,按照从第一行第一个一直到第四行第四个逐行进行编码,编码值从“0000” 至“1111” , 再进行译码,最后显示按键号码。 4X4矩阵4管脚直插按键键盘 (1)体积小; (2)节省空间; (3)使用方便; (4)共计16按键; (5)单片机外扩键盘的上佳选择。 矩阵键盘所需库文件 管理库中搜索Keypad,然后安装即可。 也可以在下载库(需要下载库文件https://github.com/Chris--A/Keypad),然后手动添加到IDE中的libraries文件夹里面,重新启动IDE即可。 安装4*4矩阵键盘 4*4矩阵键盘有一个8孔的排母,理论上可以直接插到0-7脚上,但0,1脚用于串口通信,所以只能选择2~13脚,这里选用了2-9脚。 Arduino Pin 2 Arduino Pin 3 Arduino Pin 4 Arduino Pin 5 Arduino Pin 6 Arduino Pin 7 Arduino Pin 8 Arduino Pin 9 /* 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真) 实验二十六:4X4矩阵键盘模块(12键示例代码) 实验区域位3x4 */ #include const byte ROWS = 4; const byte COLS = 3; char keys = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'} }; byte rowPins = {5, 4, 3, 2}; byte colPins = {8, 7, 6}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key != NO_KEY){ Serial.println(key); } } 这是一个非常简单的示例,可以看到将键盘输入添加到Arduino程序中是多么容易。也可以将此类输入用于许多不同的项目,包括: ● 门锁 ● 输入PWM ● 闹钟 ● 安全锁等 尝试图形编程 /* 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真) 实验二十六:4X4矩阵键盘模块(16键示例代码) */ #include const byte ROWS = 4; const byte COLS = 4; char hexaKeys = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins = {2, 3, 4, 5}; byte colPins = {6, 7, 8, 9}; Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); } void loop(){ char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey); } } 程序思路 1 #include //加载库 2 const byte ROWS = 4; const byte COLS = 4; char keys = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} };//建立二维数组,用于设置按键的输出字符 3 byte rowPins = {2,3,4,5}; //定义行引脚 byte colPins = {6,7,8,9}; //定义列引脚 4 Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //实例化Keypad 对象 5 char key = keypad.getKey();//新建一个key 变量 用于获取键盘当前的值 4X4矩阵键盘模块的应用电路 尝试的仿真事件编程