(6)LED点阵屏

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等

LED点阵屏分类

  • 按颜色:单色、双色、全彩
  • 按像素:88、1616等(大规模的LED点阵通常由很多个小点阵拼接而成)

LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已

LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同

LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

请添加图片描述

请添加图片描述

A1-A8接到74HC595模块

请添加图片描述

74HC595工作原理:

请添加图片描述

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个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作

sbit RCK = P3^5; // 将P3的第五位命名为RCLK,RCLK重命名了,改为RCK,操作RCK是等效于操作P3_5
sbit SCK = P3^6; // SRCLK
sbit SER = P3^4;

void _74HC595_WriteByte(unsigned char Byte){
    
    
	unsigned char i;
	for(i = 0;i < 8;i++){
    
    
		
		SER = Byte & (0x80 >> i); // 取最/次/...高位,此时位没有对齐,非0即为1
		SCK = 1; // 给高电平,上升沿,将SER移进移位寄存器
		SCK = 0; // 恢复
		
	}
	
	RCK = 1; // 给高电平,上升沿,将移位寄存器中的值放入锁存器
	RCK = 0; // 恢复
}
void MatrixLED_ShowColumn(unsigned char column, Data){
    
    
	_74HC595_WriteByte(Data);
	/*
	switch(column){
		case 0: P0 = ~0x80;break;
		case 1: P0 = ~0x40;break;
		case 2: P0 = ~0x20;break;
		case 3: P0 = ~0x10;break;
		case 4: P0 = ~0x08;break;
		case 5: P0 = ~0x04;break;
		case 6: P0 = ~0x02;break;
		case 7: P0 = ~0x01;break;
	}
	*/
	P0 = ~(0x80 >> column); // 选择列
}
void main(){
    
    
	SCK = 0; // 赋初始值
	RCK = 0;
	MatrixLED_ShowColumn(0, 0xaa); // 第0列,1010 1010即第0246行
	while(1){
    
    }
}

注意要把左边的黄色跳帽跳到左边2个插针

LED点阵屏动画:

unsigned char animation[] = {
    
     // 使用字模提取软件获取
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,
	0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0x00,
	0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0x0E,
	0x00,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void main(){
    
    
	unsigned char i,Offset=0,Count=0;
	MatrixLED_Init();
	while(1)
	{
    
    
		for(i=0;i<8;i++)	//循环8次,显示8列数据
		{
    
    
			MatrixLED_ShowColumn(i,animation[i+Offset]);
		}
		Count++;			//计次延时
		if(Count>10)
		{
    
    
			Count=0;
			Offset++;
			if(Offset>40)
			{
    
    
				Offset=0;
			}
		}
	}
}

注意,unsigned char animation[] = {}此时是放在RAM中,但是RAM空间较小,当animation数组包含很多数据时,RAM可能会导致空间不够,所以需要放在空间更大的Flash中unsigned char code animation[] = {}但是一旦放入Flash,animation就无法更改内容了

猜你喜欢

转载自blog.csdn.net/Falling_Asteroid/article/details/130736926