1.5英寸LED點陣管數碼管8*8紅色16pinhtml
有以下兩種型號:編程
共陽1588BS數組
共陰1588AS函數
共陰1588AS測試
共陽1588BSui
共陰和共陽其編程思路基本相似,只是對應IO引腳電平相反而已spa
測試的單片機是:STM32F103C8T6code
模塊爲:共陽1588BShtm
接線:blog
STM32接線:
點陣屏1-8:A0、A一、A二、A三、A四、A五、A六、A7
點陣屏9-16:B0、B一、B十、B十一、B十二、B1三、B1四、B15
點陣屏點亮電平分析
正極:九、1四、八、十二、一、七、二、5
負極:1三、三、四、十、六、十一、1五、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); //顯示錶情,需持續刷新 } }
一、 真實使用時,須要經過定時器中斷刷新,典型值爲1ms,須要更改顯示時自接更改數組的數據便可,點陣屏將會在下一次刷新時更改成正確的顯示。
二、 點陣屏所佔用的單片機引腳太多了,有點殺雞用牛刀了,能夠考慮使用74HC595進行擴展IO輸出,以減小單片機引腳資源的佔用。
參考:http://arduino.nxez.com/2018/12/09/arduino-drivers-8x8-matrix.html