• 8*8LED点阵


    基础认识

    1.5英寸LED点阵管数码管8*8红色16pin

    有如下两种型号:

    共阳1588BS

    共阴1588AS

    共阴1588AS

     共阳1588BS

    编程导向

    共阴和共阳其编程思路基本类似,只是对应IO引脚电平相反而已

    测试的单片机是:STM32F103C8T6

    模块为:共阳1588BS

    接线:

               

    STM32接线:

    点阵屏1-8:A0、A1、A2、A3、A4、A5、A6、A7

    点阵屏9-16:B0、B1、B10、B11、B12、B13、B14、B15

    点阵屏点亮电平分析

    正极:9、14、8、12、1、7、2、5

    负极:13、3、4、10、6、11、15、16

    点亮电平引脚

    高电平:B0 B13 A7 B11 A0 A6 A1 A4
    低电平:B12 A2 A3 B1 A5 B10 B14 B15

    端口初始化:

    将使用到的IO口均设置为输出即可

    行列控制

    因为面板是正方形,所以这里所谓的行/列都是自己定义的,

    设置高电平脚为行,低电平脚为列

     1 //行控制
     2 void R88_row_control(u8 i,BitAction c){
     3      if(i==0) GPIO_WriteBit(GPIOB,GPIO_Pin_0,c); //1
     4      if(i==1) GPIO_WriteBit(GPIOB,GPIO_Pin_13,c); //1
     5      if(i==2) GPIO_WriteBit(GPIOA,GPIO_Pin_7,c); //1
     6      if(i==3) GPIO_WriteBit(GPIOB,GPIO_Pin_11,c); //1
     7      if(i==4) GPIO_WriteBit(GPIOA,GPIO_Pin_0,c); //1
     8      if(i==5) GPIO_WriteBit(GPIOA,GPIO_Pin_6,c); //1
     9      if(i==6) GPIO_WriteBit(GPIOA,GPIO_Pin_1,c); //1
    10      if(i==7) GPIO_WriteBit(GPIOA,GPIO_Pin_4,c); //1
    11 }
    12 
    13 //列控制
    14 void R88_col_control(u8 i,BitAction c){
    15      if(i==0) GPIO_WriteBit(GPIOB,GPIO_Pin_12,c); //0
    16      if(i==1) GPIO_WriteBit(GPIOA,GPIO_Pin_2,c); //0
    17      if(i==2) GPIO_WriteBit(GPIOA,GPIO_Pin_3,c); //0
    18      if(i==3) GPIO_WriteBit(GPIOB,GPIO_Pin_1,c); //0
    19      if(i==4) GPIO_WriteBit(GPIOA,GPIO_Pin_5,c); //0
    20      if(i==5) GPIO_WriteBit(GPIOB,GPIO_Pin_10,c); //0
    21      if(i==6) GPIO_WriteBit(GPIOB,GPIO_Pin_14,c); //0
    22      if(i==7) GPIO_WriteBit(GPIOB,GPIO_Pin_15,c); //0
    23 
    24 }

    关闭所有点阵

    使得所有发光二极管截止则可达到目的,即所有高电平引脚变成低电平,所有低电平引脚变成高电平

    void R88_off(){
        u8 i=0;
        for( i=0;i<8;i++) 
        {
            R88_row_control(i,0);
            R88_col_control(i,1);
        }
    }

    点亮所有点阵

    使得所有发光二极管导通即可,即高电平引脚输出高电平,低电平引脚输出低电平

    void R88_on(){
        u8 i=0;
        for( i=0;i<8;i++) 
        {
            R88_row_control(i,1);
            R88_col_control(i,0);
        }
    }

     行刷新

    每移动一行,所有列刷新一次

    void R88_row_flush(){
      u8 i,j,n;
        R88_off();//关闭所有
        for(i=0;i<8;i++){
         for(n=0;n<8;n++) R88_row_control(n,0);//关闭所有行
         R88_row_control(i,1);//行移动
         for(j=0;j<8;j++){
             for(n=0;n<8;n++) R88_col_control(n,1);//关闭所有列
             R88_col_control(j,0);//列移动
             delay_ms(100);
         }
        }
    }

    列刷新

    每移动一列,所有行刷新一次

    void R88_col_flush(){
      u8 i,j,n;
        R88_off();//关闭所有
        for(i=0;i<8;i++){
         for(n=0;n<8;n++) R88_col_control(n,1);//关闭所有列
         R88_col_control(i,0);//列移动
         for(j=0;j<8;j++){
              for(n=0;n<8;n++) R88_row_control(n,0);//关闭所有行
              R88_row_control(j,1);//行移动
              delay_ms(100);
         }
        }
    }

    表情/图像显示

    视频展示:https://www.bilibili.com/video/av75504969

               

     基于列刷新,每移动一列,都会刷新全部行

    0列:0000 0100    0x04

    1列:0000 0010    0x02

    2列:0010 0100    0x24

    3列:0100 0000    0x40

    4列:0100 0000    0x40

    5列:0010 0100    0x24

    6列:0000 0010    0x02

    7列:0000 0100    0x04

    u8 Small_Arr1[8]={0x04,0x02,0x24,0x40,0x40,0x24,0x02,0x04};
    u8 Small_Arr2[8]={0x06,0x02,0x22,0x40,0x40,0x26,0x02,0x02};
    void R88_show_img(u8 arr[]){
       u8 i,j,n;
        for(i=0;i<8;i++){
         R88_off();//关闭所有
         R88_col_control(i,0);//列移动¯
         //行控制
         if(arr[i]&0x01) R88_row_control(0,1);
         if(arr[i]&0x02) R88_row_control(1,1);
         if(arr[i]&0x04) R88_row_control(2,1);
         if(arr[i]&0x08) R88_row_control(3,1);
         if(arr[i]&0x10) R88_row_control(4,1);
         if(arr[i]&0x20) R88_row_control(5,1);
         if(arr[i]&0x40) R88_row_control(6,1);
         if(arr[i]&0x80) R88_row_control(7,1);
        }
    }

    Main函数部分调用

    LED_Init();//初始化GPIO,均为输出
    R88_row_flush();//刷新行
    R88_col_flush();//刷新列
    while(1){
          R88_show_img(Small_Arr1);//显示表情,需持续刷新
          //R88_show_img(Small_Arr2); //显示表情,需持续刷新
      }
    }

    扩展导向

     

    1、 真实使用时,需要通过定时器中断刷新,典型值为1ms,需要更改显示时直接更改数组的数据即可,点阵屏将会在下一次刷新时更改为正确的显示。

    2、 点阵屏所占用的单片机引脚太多了,有点杀鸡用牛刀了,可以考虑使用74HC595进行扩展IO输出,以减少单片机引脚资源的占用。

     

    参考:http://arduino.nxez.com/2018/12/09/arduino-drivers-8x8-matrix.html

  • 相关阅读:
    linux十九压缩解压
    linux第十八dd命令
    【51单片机】数据类型
    【博客园】
    【C++】简介与环境的搭建
    【树莓派】安装TeamViewer
    【树莓派】Makefile的编写
    【cJSON库】cJSON库的使用
    【树莓派】忘记系统用户密码,如何重置密码
    【树莓派】树莓派与PC机通信
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/11844413.html
Copyright © 2020-2023  润新知