LED点阵屏显示
-
LED点阵屏介绍:
-
LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
-
LED点阵屏分类 按颜色:单色、双色、全彩;按像素:88、1616等(大规模的LED点阵通常由很多个小点阵拼接而成)。
-
-
显示原理:
-
LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。
-
LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同。
-
LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
-
-
74HC595:
-
74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。
-
-
C51的sfr、sbit:
-
sfr(special function register):特殊功能寄存器声明 例:sfr P0 = 0x80; 声明P0口寄存器,物理地址为0x80。
-
sbit(special bit):特殊位声明 例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1; 声明P0寄存器的第1位。
-
可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作。
-
-
//初设代码 #include <REGX52.H> sbit RCK = P3^5; //RCLK 差不多是间接寻址的意思。 sbit SCK = P3^6; //SRCLK sbit SER = P3^4; //SER void _74HC595_WriteByte(unsigned char Byte) { unsigned char i; for(i = 0; i < 8; i++){ SER = Byte&(0x80>>i); //将1依次右移,确实聪明 SCK = 1; SCK = 0; } RCK = 1; RCK = 0; } void MatrixLED_ShowColumn(unsigned char Column,Data) { _74HC595_WriteByte(Data); P0 = ~(0x80>>Column); } void main(){ SCK = 0; RCK = 0; //_74HC595_WriteByte(0xF0); MatrixLED_ShowColumn(7,0xAA); //这里差不多就是第8列的隔一个亮一个。 while(1){ } }
-
//下一个版本(加入了消影,还有图形绘制的讲解) #include <REGX52.H> #include "Delay.h" sbit RCK = P3^5; //RCLK 差不多是间接寻址的意思。 sbit SCK = P3^6; //SRCLK sbit SER = P3^4; //SER void _74HC595_WriteByte(unsigned char Byte) { unsigned char i; for(i = 0; i < 8; i++){ SER = Byte&(0x80>>i); //将1依次右移,确实聪明 SCK = 1; SCK = 0; } RCK = 1; RCK = 0; } void MatrixLED_ShowColumn(unsigned char Column,Data) { _74HC595_WriteByte(Data); P0 = ~(0x80>>Column); //消影,不然不明显。下面就必须放入循环,不然就是闪一下,就没了。 Delayms(1); P0 = 0xFF; } void main(){ SCK = 0; RCK = 0; while(1){ //下面这个是个笑脸图像,按列扫描绘制即可。 MatrixLED_ShowColumn(0,0x3C); MatrixLED_ShowColumn(1,0x42); MatrixLED_ShowColumn(2,0xA9); MatrixLED_ShowColumn(3,0x85); MatrixLED_ShowColumn(4,0x85); MatrixLED_ShowColumn(5,0xA9); MatrixLED_ShowColumn(6,0x42); MatrixLED_ShowColumn(7,0x3C); } }
-
//最后成型代码(显示静态画面) #include <REGX52.H> #include "Delay.h" sbit RCK = P3^5; //RCLK 差不多是间接寻址的意思。 sbit SCK = P3^6; //SRCLK sbit SER = P3^4; //SER #define MATRIX_LED_PORT P0 //74HC595写入一个字节 void _74HC595_WriteByte(unsigned char Byte) { unsigned char i; for(i = 0; i < 8; i++){ SER = Byte&(0x80>>i); //将1依次右移,确实聪明 SCK = 1; SCK = 0; } RCK = 1; RCK = 0; } //LED点阵屏显示一列数据 void MatrixLED_ShowColumn(unsigned char Column,Data) { _74HC595_WriteByte(Data); MATRIX_LED_PORT = ~(0x80>>Column); //消影,不然不明显。下面就必须放入循环,不然就是闪一下,就没了。 Delayms(1); MATRIX_LED_PORT = 0xFF; } void main(){ SCK = 0; RCK = 0; while(1){ MatrixLED_ShowColumn(0,0x3C); MatrixLED_ShowColumn(1,0x42); MatrixLED_ShowColumn(2,0xA9); MatrixLED_ShowColumn(3,0x85); MatrixLED_ShowColumn(4,0x85); MatrixLED_ShowColumn(5,0xA9); MatrixLED_ShowColumn(6,0x42); MatrixLED_ShowColumn(7,0x3C); } }
-
——————————————————————————————————————————————————————————————————
-
LED点阵屏显示动画:
-
//流动动画(模块化编程~~) #include <REGX52.H> #include "Delay.h" sbit RCK = P3^5; //RCLK 差不多是间接寻址的意思。 sbit SCK = P3^6; //SRCLK sbit SER = P3^4; //SER #define MATRIX_LED_PORT P0 //74HC595写入一个字节 void _74HC595_WriteByte(unsigned char Byte) { unsigned char i; for(i = 0; i < 8; i++){ SER = Byte&(0x80>>i); //将1依次右移,确实聪明 SCK = 1; SCK = 0; } RCK = 1; RCK = 0; } //点阵屏初始化 void MatrixLED_Init(){ SCK = 0; RCK = 0; } //LED点阵屏显示一列数据 void MatrixLED_ShowColumn(unsigned char Column,Data) { _74HC595_WriteByte(Data); MATRIX_LED_PORT = ~(0x80>>Column); //消影,不然不明显。下面就必须放入循环,不然就是闪一下,就没了。 Delayms(1); MATRIX_LED_PORT = 0xFF; } ----------------------------------------------------------------------------------------------------- #ifndef __MATRIXLED_H__ #define __MATRIXLED_H__ void _74HC595_WriteByte(unsigned char Byte); void MatrixLED_ShowColumn(unsigned char Column,Data); void MatrixLED_Init(); #endif --------------------------------------------------------------------------------------------------------- #include <REGX52.H> #include "Delay.h" #include "MatrixLED.h" //这是流动动画,如果要普通动画,就不是偏移量,而是直接变换下一针数据即可。 unsigned char arr[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0x10,0x10,0x10,0xFF,0x00,0x0E,0x15, 0x15,0x15,0x09,0x00,0xFF,0x01,0x01,0x01, 0x00,0xFF,0x01,0x01,0x01,0x00,0x3C,0x42, 0x42,0x3C,0x00,0xFF,0x01,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; unsigned char i , offset , fps; void main(){ MatrixLED_Init(); while(1){ for(i = 0; i < 8; i++){MatrixLED_ShowColumn(i,arr[i+offset]);} fps++; if(fps >= 10){ offset++; fps = 0; if(offset >= 40){ offset = 0; } } } }