8*8LED點陣

  • 2019 年 11 月 13 日
  • 筆記

基礎認識

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);       }      }  }

表情/圖像顯示

           

 

 

基於列刷新,每移動一列,都會刷新全部行

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-8×8-matrix.html