光立方

发表于 2016-09-24   |   分类于 stc , 一i个oier的成长  |  访问: 60 次

原本就是因为这个才开始学单片机的,以为要先学什么模拟电路数字电路之类的东西才能入门,最后还是不及自己实践一两遍学得快。

4*4*4光立方比较小规模,在做888之前绝对值得做一个来积累经验,通过三个星期的各种碰壁式摸索,这东西算是被我弄懂了。

原理:

首先如果是一个led灯,我们只要控制正负极的电平即可控制亮暗,也就是当正负极各接入一个i/o口时,负极设置为低电平,正极的高低电平决定了灯的亮灭,这很简单。

那么如果我们要控制一排的led灯,只需要将它们共阴(把所有的阴极并联并接入一个i/o口),设置为低电平,把每个电灯的正极各接入一个i/o口,这样当控制个别电灯的正极电平即可实现个别电灯的亮灭,这也不难。

接着想想如何控制一个平面的led灯。

QQ截图20160921132436

如上图只要控制一下阴极和阳极,即可像坐标轴一样的使用这个平面的led灯。

i/o口缩减:

但是这样会有一个问题:每个阴极需要一个i/o口,每个阳极也需要,这样子一个平面就需要8个口,而4个平面就需要32个口才能控制,这不利于我们后面扩展成888光立方,于是我们进行i/o口的一个缩减:

QQ截图20160921134121

如果能这么接线,那么i/o口可以减免一半,只剩16个,按照上图将接线接入i/o口即可。

代码的实现原理:

我最开始不是很懂,并且尝试着自己想出代码,然而最后我放弃了,不过瞄一眼别人的代码一下就看懂了。

人眼有个神奇的暂留效应,就是非常短的时间内【几毫秒】闪动的东西,你的眼睛太迟钝并没有办法反应过来,于是你就会以为它是一直亮着的,有了这个东西我们就可以实现哪些灯让它同时亮着了。

首先让P0.0这个口处于低电平,其它的P0口处于高电平

然后控制正极的八个口,也就是P2的口子,就可以实现这一排的亮暗:

dksj

让这些灯亮一小会,然后马上跑去控制P0.1,把它变为低电平,其它变为高电平,再次控制P2的八个口。

依次类推,即每次只让一个P0口处于低电平,有点类似扫描一样的做法,其他部分就可以YY出来了。

贴段代码吧:

unsigned char code tabP0[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
void one(){
	unsigned char code tabP2[38][8]={
{0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x20,0x00,0x00,0x00,0x00,0x10,0x00},
{0x00,0x20,0x00,0x00,0x00,0x02,0x10,0x00},
{0x00,0x20,0x04,0x00,0x00,0x02,0x10,0x00},
{0x00,0xA0,0x04,0x00,0x00,0x02,0x10,0x00},
{0x00,0xA0,0x24,0x10,0x00,0x02,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x00,0x02,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x20,0x02,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x20,0x22,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x20,0x22,0x14,0x42},
{0x40,0xA0,0x24,0x10,0x20,0x26,0x14,0x42},
{0x40,0xA0,0x25,0x10,0x20,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x10,0x20,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x50,0x20,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x50,0xA0,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x50,0xA0,0x27,0x14,0x43},
{0x44,0xA0,0x25,0x50,0xA0,0x27,0x14,0x53},
{0x44,0xA0,0x65,0x50,0xA0,0x27,0x54,0x53},
{0x44,0xA0,0x65,0x50,0xA0,0xA7,0x54,0x53},
{0x44,0xA0,0x65,0x50,0xA8,0xA7,0x54,0x53},
{0x44,0xA0,0x65,0x50,0xA8,0xA7,0x56,0x5B},
{0x46,0xA0,0x67,0x52,0xA8,0xA7,0x56,0x5B},
{0x46,0xA1,0x67,0x52,0xA8,0xA7,0x56,0x5B},
{0x46,0xB1,0x67,0x52,0xA8,0xA7,0x56,0x5B},
{0x46,0xB1,0x67,0x5A,0xA8,0xA7,0x56,0x5B},
{0x56,0xB1,0x67,0x5A,0xA8,0xA7,0x56,0x5B},
{0x56,0xB1,0x67,0x5A,0xA8,0xE7,0x56,0x5B},
{0x56,0xB1,0x67,0x5A,0xAA,0xE7,0x56,0x5F},
{0x56,0xB1,0x67,0x5A,0xAA,0xE7,0x56,0x7F},
{0x56,0xF9,0x67,0x7A,0xAA,0xE7,0x56,0x7F},
{0x56,0xF9,0x67,0x7A,0xAE,0xE7,0x5E,0x7F},
{0x5E,0xFD,0x67,0x7B,0xAE,0xE7,0x5E,0x7F},
{0x5E,0xFD,0x67,0x7B,0xEE,0xE7,0xDE,0xFF},
{0xDE,0xFD,0xE7,0xFB,0xEF,0xE7,0xFF,0xFF},
{0xDE,0xFD,0xF7,0xFB,0xFF,0xF7,0xFF,0xFF},
{0xDE,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}
};
	int j,i,k;
	for(j=0;j<38;j++)
	{
		for(k=0;k<10;k++)
		{
			for(i=0;i<8;i++)
			{
				P2=0;
				P0=tabP0[i];
				P2=tabP2[j][i];
				delay(10);
			}
		}
	}
}

至于单片机最小系统那些东西等我做888的时候再来仔细研究一下,目前我只能接在开发板上测试。

 

关于led灯的折法:

首先让led灯头朝下。

然后把正极放在左边,负极放在右边。

把负极,也就是右边往前掰【最好能有个比较袖珍的工具帮忙。

(如果要整齐一点的话就自己想办法吧)

把左边往后掰。

接着再把正极往上掰。

大概如下图:

IMG_20160912_223017

焊完一定要记得先检验每个灯有没有差不多亮,不要有些被击穿了还一脸茫然。

换灯比较要命。

IMG20160914143746

接线就尽管按照自己的风格吧。

这个是接负极的线:

IMG_20160916_132550

正极也是很简陋的,反正弄得出来就行:

IMG_20160924_214851

当然这些灯可能有些太亮会影响效果,可以在正极加几个电阻分一下电压,我为了先弄出来就没加入电阻了。

然后这是我的一个开发板,我接线是把正极接到1的【2的被我在焊接的时候忘了弄下来好像被烧坏了

IMG20160916232135

如果哪个灯坏了需要焊接个新的上去,要先把线都拔下来,因为电烙铁的头本身带有电,可能会烧坏板子.

发表新评论

© 2017 Powered by Typecho & Theme Quark