ESP32-C3把4*4矩阵键盘数据传输到OLED显示屏上

看着手头上有一个4*4的薄膜键盘,想着闲来无事看能不能把薄膜键盘上的数据输出到0.96的Oled显示屏上,为后面的无线宿舍门锁(只是计划还没有实现)做一下准备。

一、OLED方面

关于使用Oled显示屏,我在另一篇博客有详细写了下载库、如何使用等等我们用的上的地方,如需要可以直接点下面的链接:

https://blog.csdn.net/weixin_44107116/article/details/122491820

二、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、效果展示

在这里插入图片描述


在这里插入图片描述

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帕法西尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值