看着手头上有一个4*4的薄膜键盘,想着闲来无事看能不能把薄膜键盘上的数据输出到0.96的Oled显示屏上,为后面的无线宿舍门锁(只是计划还没有实现)做一下准备。
文章目录
- 一、OLED方面
- 二、4*4矩阵键盘
- 1、实物和原理图
- 2、接线引脚
- 三、编写代码
- 1、下载Adafruit_Keypad库
- 2、定义相关接口函数
- 3、setup函数添加 customKeypad 函数运行
- 4、loop函数添加键盘函数运行
- 5、全部代码
- 6、效果展示
一、OLED方面
关于使用Oled显示屏,我在另一篇博客有详细写了下载库、如何使用等等我们用的上的地方,如需要可以直接点下面的链接:
二、4*4矩阵键盘
薄膜按键,是一块带触点的PET薄片,用在PCB、FPC等线路上作为开关使用,在使用者与仪器之间起到一个重要的触感型开关的作用。与传统的硅胶按键相比,薄膜按键具有更好的手感、更长的寿命,可以间接的提高使用导电膜的各类型开关的生产效率。薄膜按键上的触点位于PCB板上的导电部位,当按键受到外力按压时,触点的中心点下凹,接触到PCB上的线路,从而形成回路,电流通过,整个产品就得正常工作。
1、实物和原理图
从正面看,从左边开始数,前四个是行引脚,后四个是列引脚。
2、接线引脚
行引脚我接在1、2、3、6接口,列引脚我接在7、8、9、10接口。关于接口4和5接口被我用来接Oled显示屏的SDA、SCL引脚。
三、编写代码
1、下载Adafruit_Keypad库
下载步骤为:工具–>管理库–>Adafruit_Keypad
2、定义相关接口函数
//四行四列
const byte ROWS =4;
const byte COLS =4;
char keys[ROWS][COLS] ={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] ={1,2,3,6}; //行的接口引脚
byte colPins[COLS] ={7,8,9,10}; //列的接口引脚
//customKeypad 构建函数
Adafruit_Keypad customKeypad =Adafruit_Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);
3、setup函数添加 customKeypad 函数运行
customKeypad.begin();
4、loop函数添加键盘函数运行
if(customKeypad.available()){
//读取键盘数据
keypadEvent e =customKeypad.read();
//获取相应键盘的数据
Serial.print((char)e.bit.KEY);
if(e.bit.EVENT == KEY_JUST_PRESSED){ // 不添加这个的话,按下的是时候是两个数,如按1,显示是11
oled.drawString(n,20,String(char(e.bit.KEY))); //显示按钮的数据
Serial.println("pressed"); //串口
n+=10; //这里我设置的距离是间隔10,不然数据会交错
if(n>=120){ //这里我设置是一行,超过就全部擦除,大概一行有12个数据可以显示
oled.clear();
oled.display();
n=0;
}
}
}
5、全部代码
//矩阵所需要的库
#include "Adafruit_Keypad.h"
/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"
/* 设置oled屏幕的相关信息 */ //有一些引脚接口不支持I2C
const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址
#define SDA_PIN 4 // io4
#define SCL_PIN 5 // io5
//四行四列
const byte ROWS =4;
const byte COLS =4;
char keys[ROWS][COLS] ={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
int n =0;
byte rowPins[ROWS] ={1,2,3,6}; //行的接口引脚
byte colPins[COLS] ={7,8,9,10}; //列的接口引脚
Adafruit_Keypad customKeypad =Adafruit_Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);
/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);
//测试屏幕显示
void drawRect(void) {
for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
oled.display();
delay(50);
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
customKeypad.begin();
/* oled屏幕初始化 */
oled.init();
oled.flipScreenVertically(); // 设置屏幕翻转
oled.setContrast(255); // 设置屏幕亮度
drawRect(); // 测试屏幕显示
oled.clear(); oled.display(); // 清除屏幕
}
void loop() {
// put your main code here, to run repeatedly:
customKeypad.tick();
/* 显示字母 */
oled.setFont(ArialMT_Plain_16); // 设置字体
oled.drawString(0,0, "Input password:");
oled.display(); // 将缓存里的文字在屏幕上显示
if(customKeypad.available()){
keypadEvent e =customKeypad.read();
Serial.print((char)e.bit.KEY);
if(e.bit.EVENT == KEY_JUST_PRESSED){
oled.drawString(n,20,String(char(e.bit.KEY)));
Serial.println("pressed");
n+=10;
if(n>=120){
oled.clear();
oled.display();
n=0;
}
}
}
delay(100);
}
6、效果展示