基础认识
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