Arduino控制8×8点阵显示

8×8点阵简介:

  • 型号:1088AS
  • 引脚:16
  • 类型:(行)共阴极
  • 实物图

实物图

如图所示为正面,印有1088AS字样为点阵的正前面

  • 示意图

示意图

  • 点阵引脚定义

引脚定义

如图所示,由实物图确定正前面之后,正前面的8个引脚从左至右依次为引脚1~8,后排引脚则顺序相反依次为16~9。

  • 原理图

 原理图

  • 行列编号

行列编号

  • 行列-引脚编号对应关系

行列-引脚编号对应关系

红色数字为引脚编号,黑色数字为行列编号。如图中所示,点阵引脚13对应的行列编号为COLUMN(列)1,点阵引脚14对应的行列编号为ROW(列)2。

由原理图可知,要想点亮某点,只需在该点所在ROW(行)通低电平(LOW),在该点所在COLUMN(列)通高电平(HIGH);要想熄灭某点,只需在该点所在ROW(行)和 COLUMN(列)均通低电平(LOW)或高电平(HIGH)等即可。

例如点亮第2行第3列所在的点,需要在第ROW(行)2通低电平(LOW),在COLUMN(列)3通高电平(HIGH)即可,也即为引脚14通低电平(LOW),为引脚4通高电平(HIGH)即可。

连接线路图

使用引脚数量为16个,所以需要占用开发板16个引脚。考虑到使用的开发板只有14个数字引脚,6个模拟引脚,所以这里将模拟引脚做数字引脚使用。使用的数字引脚为编号2~13,模拟引脚为A0~A3。

连接电路图时为避免线路缠绕,采用按顺序一次连接引脚的方式。点阵1~16引脚分别对应开发板的10,11,12,13,A3,A2,A1,A0,2,3,4,5,6,7,8,9。连接时考虑到保护点阵,在各个引脚进线处增加了电阻。

线路图

编写控制程序

  • 理清引脚-编号关系,列表查看如下:

image.png

|点阵列编号|1|2|3|4|5|6|7|8| |-|-|-|-|-|-|-|-|-|-| |点阵引脚|13|3|4|10|6|11|15|16| |开发板引脚|6|A2|A3|3|12|4|8|9| |点阵行编号|1|2|3|4|5|6|7|8| 点阵引脚 |9|14|8|12|1|7|2||5| 开发板引脚|2|7|10|5|A0|11|A1|13|

因此定义控制点阵列引脚数组:

//Col : 13,3,4,10,6,11,15,16(点阵引脚)
int colPin[]= {6,A2,A3,3,12,4,8,9}; //pin
C++

定义控制点阵行引脚数组:

//Row : 9,14,8,12,1,7,2,5(点阵引脚)
int rowPin[]= {2,7,10,5,A0,11,A1,13}; //pin
C++

编写程序如下:

在setup()中:

  • 启动串口通讯:
  Serial.begin(9600); 
C++
  • 设置所有引脚为输出模式:
for(int i=0;i<8;i++){
    pinMode(colPin[i],OUTPUT);//设置输出
    pinMode(rowPin[i],OUTPUT);//设置输出
  }
C++
  • 调用reset()实现点阵显示清空,reset()定义如下:
void reset(){
  for(int i=0;i<8;i++){
    digitalWrite(colPin[i],LOW);
    digitalWrite(rowPin[i],HIGH);
  }
}
C++

此外,需要定义一些函数:

  • 定义显示函数showChar(),用于使点阵显示相应字符:
void showChar(int data[8][8]){
  for(int i=0;i<100;i++){
    for(int row=0;row<8;row++){
      digitalWrite(rowPin[row],LOW);
      for(int col=0;col<8;col++){
        digitalWrite(colPin[col],data[row][col]);
      }
      delay(1);
      reset();
    }
  }
  delay(1000);
}
C++

所需传入参数为8×8的二维整型数组data;最外层i-for循环100次用于延长单次显示时间,大约持续零点几秒,否则显示时间过短,效果不好;row-for循环中,每次循环首先将该行控制的点阵行通低电平:digitalWrite(rowPin[row],LOW);然后再col-for循环遍历每列,将该列控制的点阵列通data数组相应的电平值:digitalWrite(colPin[col],data[row][col]);
调用示例如下:

//显示数字‘0’
int data[8][8]={
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0
};
showChar(data);
C++

示例:编写程序依次显示数字0,1,2,3,4,5,6,7,8,9和爱心,间隔1s:

//Col : 13,3,4,10,6,11,15,16(点阵引脚)
int colPin[]= {6,A2,A3,3,12,4,8,9}; //pin

//Row : 9,14,8,12,1,7,2,5(点阵引脚)
int rowPin[]= {2,7,10,5,A0,11,A1,13}; //pin

void setup() {
  Serial.begin(9600); //启动串口通讯
  for(int i=0;i<8;i++){
    pinMode(colPin[i],OUTPUT);//设置输出
    pinMode(rowPin[i],OUTPUT);//设置输出
  }
  reset();
}
void reset(){
  for(int i=0;i<8;i++){
    digitalWrite(colPin[i],LOW);
    digitalWrite(rowPin[i],HIGH);
  }
}
void showNum(int num){
  switch(num){
    case 0 :{
      int data[8][8]=
      {
        0,0,0,1,1,0,0,0,
        0,0,1,0,0,1,0,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,0,1,0,0,1,0,0,
        0,0,0,1,1,0,0,0
       };
       showChar(data);
       break;
    }
     case 1 :{
      int data[8][8]=
      {
        0,0,0,1,1,0,0,0,
        0,0,1,0,1,0,0,0,
        0,0,0,0,1,0,0,0,
        0,0,0,0,1,0,0,0,
        0,0,0,0,1,0,0,0,
        0,0,0,0,1,0,0,0,
        0,0,0,0,1,0,0,0,
        0,1,1,1,1,1,1,0
       };
       showChar(data);
       break;
    }
     case 2 :{
      int data[8][8]=
      {
        0,0,1,1,1,0,0,0,
        0,1,0,0,0,1,0,0,
        0,1,0,0,0,0,1,0,
        0,0,0,0,0,0,1,0,
        0,0,0,0,0,1,0,0,
        0,0,0,0,1,0,0,0,
        0,0,1,1,0,0,0,0,
        0,1,1,1,1,1,1,0
       };
       showChar(data);
       break;
    }
     case 3 :{
      int data[8][8]=
      {
        0,0,1,1,1,1,0,0,
        0,1,0,0,0,0,1,0,
        0,0,0,0,0,0,1,0,
        0,0,0,0,0,1,0,0,
        0,0,1,1,1,0,0,0,
        0,0,0,0,0,1,0,0,
        0,1,0,0,0,0,1,0,
        0,0,1,1,1,1,0,0
       };
       showChar(data);
       break;
    }
     case 4 :{
      int data[8][8]=
      {
        0,0,0,0,1,0,0,0,
        0,0,0,1,1,0,0,0,
        0,0,1,0,1,0,0,0,
        0,1,0,0,1,0,0,0,
        1,1,1,1,1,1,1,1,
        0,0,0,0,1,0,0,0,
        0,0,0,0,1,0,0,0,
        0,0,0,0,1,0,0,0
       };
       showChar(data);
       break;
    }
     case 5 :{
      int data[8][8]=
      {
        0,1,1,1,1,1,1,0,
        0,1,0,0,0,0,0,0,
        0,1,0,0,0,0,0,0,
        0,1,1,1,1,1,0,0,
        0,0,0,0,0,0,1,0,
        0,0,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,0,1,1,1,1,0,0
       };
       showChar(data);
       break;
    }
     case 6 :{
      int data[8][8]=
      {
        0,0,1,1,1,1,0,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,0,0,
        0,1,0,1,1,1,0,0,
        0,1,1,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,0,1,1,1,1,0,0
       };
       showChar(data);
       break;
    }
     case 7 :{
      int data[8][8]=
      {
        0,0,1,1,1,1,0,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,0,0,0,0,0,1,0,
        0,0,0,0,0,0,1,0,
        0,0,0,0,0,1,0,0,
        0,0,0,0,1,0,0,0,
        0,0,0,1,0,0,0,0
       };
       showChar(data);
       break;
    }
     case 8 :{
      int data[8][8]=
      {
        0,0,0,1,1,0,0,0,
        0,0,1,0,0,1,0,0,
        0,1,0,0,0,0,1,0,
        0,0,1,0,0,1,0,0,
        0,0,0,1,1,0,0,0,
        0,0,1,0,0,1,0,0,
        0,1,0,0,0,0,1,0,
        0,0,1,1,1,1,0,0
       };
       showChar(data);
       break;
    }
     case 9 :{
      int data[8][8]=
      {
        0,0,1,1,1,1,0,0,
        0,1,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,1,1,1,1,1,1,0,
        0,0,0,0,0,0,1,0,
        0,0,0,0,0,0,1,0,
        0,1,0,0,0,0,1,0,
        0,0,1,1,1,1,0,0
       };
       showChar(data);
       break;
    }
  } 
}

void showChar(int data[8][8]){
  
  for(int i=0;i<100;i++){
    for(int row=0;row<8;row++){
      digitalWrite(rowPin[row],LOW);
      for(int col=0;col<8;col++){
        digitalWrite(colPin[col],data[row][col]);
       // Serial.print(data[col][row]);
        }
        delay(1);
        reset();
      }
  }
  delay(1000);
}
void loop() {
  showNum(0);
  showNum(1);
  showNum(2);
  showNum(3);
  showNum(4);
  showNum(5);
  showNum(6);
  showNum(7);
  showNum(8);
  showNum(9);
  int data[8][8]=
      {
        0,0,0,0,0,0,0,0,
        0,1,1,1,0,1,1,0,
        1,0,0,0,1,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        0,1,0,0,0,0,1,0,
        0,0,1,0,0,1,0,0,
        0,0,0,1,1,0,0,0
       };
       showChar(data);
}
C++

演示效果

微信原创文章

2022-05-14 收集几个前后端网站

2022-05-06 前端选择本地图片并压缩

2022-05-05 前端选择本地文件并显示

2022-05-01 写了一个很简易的Markdown编辑器

2022-04-30 Java 生成二维码(已优化)

2022-04-30 Java 生成二维码

2022-04-30 写了一个纯前端的验证码

打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: