草庐IT

最详细的制作8*8*8的光立方

认真写博客的小李 2024-05-31 原文

一.什么是光立方?

首先,我以一个转载于B站的光立方视频开始,让对这个没有了解的小伙伴初步了解什么是光立方。其次,可能有人会问,网上有很多这样的教程,为什么我会说最详细。对于这个疑问,首先我说视频,大部分的视频我们会发现很多细小的原理知识会略过不讲,只告诉你该用什么器件,或者直接开始焊接,看了半天也看不懂,以至于无从下手,最后感觉这东西好难,很容易放弃。然后,我来说文章,很多文章代码方面会提供最简单的代码,主要的代码会不开源,需要你购买。所以,我才准备了一篇比较完整的文章,解决广大喜欢制作的朋友的问题~

Arduino 8*8光立方,你值得拥有


二.我对于光立方原理的见解

1.首先,我们要先实现控制第一层的任意列,任意个灯的控制,这里如果用单片机的两个引脚控制一个LED,我们这个需要控制512个LED灯,我们所需要的IO口的数量可想而知,所以,我们可能会想如何用少的IO口控制多个LED呢?这里,有一点译码器知识的小伙伴可能会说用74hc138译码器不就得了,但是,我们仔细想一想,这个确实可以让某一列对应引脚低电平,但是不能任意控制那一列高电平,那一列低电平,这里又卡住了,难道没其他办法了吗?行了,我不卖关子了,我用的是74hc595锁存器,至于为什么选择它呢?因为它只需要三个IO口就能随意控制8个接线为高电平或低电平。当你输入一位数据到DS引脚,给SH-CP引脚一个高电平,这位数据就被74hc595锁存了,然后不要忘记将该引脚在变成低电平,此时因为还没输入到8位数据,所以此时ST-CP引脚为低电平。这样重复8次就给锁存器锁存了8位数据,此时给ST-CP一个高电平,锁存器就会将这8位数据存到自己的flash中,对后面的8个接线输出放大后的高低电平,用于驱动LED。但是,由于数据你是一位一位移进去的,所以你移进去的第一位对应的是控制的是第8个输入口,而你的第8个数据对应第一个输入口,大家这里如果听不懂,我会加一个我认为讲这个锁存器好的视频给大家,帮助大家理解。

5分钟了解移位寄存器74HC595工作原理及使用(SIPO)

2.然后我就来说我是如何控制第一层任意列和任意灯的亮灭的,我是先将每一横行的阳极用一根铜线连接起来,每一列的阴极用一根铜线连接起来,这样,我们得到了8行接正极的铜线,8列接负极的铜线,这里,我们各将这8个正极和负极分别用一个74hc595控制输出高低电平(本质是放大的高低电平,也可以说是正负极),这样,我们就可以控制哪几行给正极(高电平),然后在控制哪几列接地(低电平),就会像是两个不平行的线会有交点一样,这里交点就是LED灯,我们就可以控制任意行,任意列和任意灯的亮灭。这里为防止大家不理解,我举个例子。

比如,我只点亮第1行,那么我给控制行的74hc595的数据用16进制写出来就是0x01,转为二进制也就是0000 0001,这样意思就是让第一行接上正极了,其他行全接负极(这里默认锁存器第一个输出口对应接到LED第一行的正极上),在将控制列的锁存器输入数据0000 0000,16进制为0X00,相当于全为负极,这样就只有第一行亮起来了。如果点亮第一列,我们就写入二进制数据1111 1111, 16进制为0xFF,在将控制列的锁存器传入数据1111 1110,就可以了。还有就是控制任意LED灯,比如控制第一个灯,就只将第一行给高电平,然后只给第一列低电平,这样就只有第一个灯亮起来。相信到这里,大家已经了解如何控制第一层了。那,我们如何控制每一层的任意列,任意行,任意个灯的亮灭呢?其实这里我们可以进行将第一层叠加上去,但是控制正级的那个锁存器,一个就可以控制整个8层的正极,我们是将每一层的正极都与第一层正极对应相连接然后每一层的负极都需要一个单独的锁存器,这样,你在想一想是不是用很少的IO口控制了512个灯呢!

3.对于如何只点亮立方体的最外层的12条棱,这种点亮方法如果和上面那样显然是不能一次性做到的,所以,我们可以这么想,如果我们一条棱一条棱顺序显示,这样利用我们人眼对于接受光的变化有时间差。这样我们顺序将一个棱一个棱点亮,在我们眼睛看来,其实就是这12条棱一起点亮,这就解决了这类不能依靠我这个电路设计的图案的问题了。

4.相信大家看到这,在大脑里应该已经形成了一个基本框架,所以,我这里先告诉大家我对于我在下面用proteus仿真的电路位置的安排,首先,我们会看到最大的一个8*8的方阵就是我们的第一层,其左边有一个74hc595的8个输出口依次连接这层的8行阳极,这8个输出口不仅是这层的阳极,还是其他7层的阳极控制端。随后我们向上看对应的就是第2层,第三层.....,下面看图吧。

                                如果有下载proteus的小伙伴,我下面百度云盘里是完整电路图。

百度网盘 请输入提取码

 三.代码部分

                                                              main函数

#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "Delay.h"
#include "xianshi.h"


int main()
{
/*
	
 int a[]={0XFF,0X00,0XFF,0X01,0X80,0XFF,0X7E,0X02,0X40,0X7E,0X3C,0X04,0X20,0X3C,0X18,0X08,0X10,0X18,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X40,0x20,0x10,0x08,0x04,0x02,0x01,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14};//控制给阳极的数据
 int b[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//控0XE3制第一层哪个灯亮的数据
 int c[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XFE,0XFE,0XFE,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XC1制第二层哪个灯亮的数据
 int d[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XFF,0XFE,0XFE,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XC9制第三层哪个灯亮的数据
 int e[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XFF,0XFF,0XFE,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XEB制第四层哪个灯亮的数据
 int f[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XFF,0XFF,0XFF,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XFF制第五层哪个灯亮的数据
 int g[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XFF制第六层哪个灯亮的数据
 int h[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//控制第七层哪个灯亮的数据
 int i[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//控制第八层哪个灯亮的数据
 
 int  j[]={0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14};
 int  k[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  l[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  m[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  n[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  o[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  p[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  q[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  r[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};


 int  a1[]={0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04};
 int  b1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB};
 int  c1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  d1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  e1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  f1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  g1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  h1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  i1[]={0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 


*/


	 
	
GPIO1_Init();	//数组第一与第二位控制全亮全灭,第三到第六控制12条最外层棱亮,7~10为下一小层棱亮,11~14控制在里一层的棱,15~18控制最里层的棱亮
               //第19~24为心性一点一点显示,24~32为心形从前到后闪烁,33~37为最左面心形显示 38~72为从左到右显示心形
	      //第三行从a1开始为心形从上到下显示
              //第四行从a3开始为瀑布繁星
while(1)
{

	
liangmie();//此处调用显示图像的子函数	
   
	
	
	
/*
GPIO_ResetBits(GPIOA,GPIO_Pin_3);//以下注释掉的是传数据的过程,无意义
GPIO_ResetBits(GPIOA,GPIO_Pin_6);

GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第一位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第一位数据传输结束

GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第二位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第二位数据传输结束	
	
	
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第三位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第三位数据传输结束	
	
	
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第四位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第四位数据传输结束	
	
	
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第五位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第五位数据传输结束

GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_ResetBits(GPIOA,GPIO_Pin_2);//第六位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第六位数据传输结束



GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第七位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第七位数据传输结束

GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
	

GPIO_SetBits(GPIOA,GPIO_Pin_2);//第八位数据
GPIO_ResetBits(GPIOA,GPIO_Pin_5);	
	
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//第八位数据传输结束

GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_SetBits(GPIOA,GPIO_Pin_6);	


*/
}


}

                                                        按位传输数据的子函数.c

#include "stm32f10x.h" // Device header
#include "Delay.h"

int i2;

void GPIO1_Init()
{

GPIO_InitTypeDef    GPIO_InitStruct;
GPIO_InitTypeDef    GPIO_InitStruct1;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);


GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);


GPIO_InitStruct1.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct1.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct1);


}


void pose(int date1,int date2,int date3,int date4,int date5,int date6,int date7,int date8,int date9)
{


GPIO_ResetBits(GPIOA,GPIO_Pin_3);//以下几个是先将ST-CP电平拉低
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
GPIO_ResetBits(GPIOA,GPIO_Pin_12);
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
	
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);

	
	for(i2=0;i2<8;i2++)
	{
	
	
	
	if((date1&0x80)!=0)//date1数据
	{
	
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	
		
		
		
	}
	
	
	if((date2&0x80)!=0)//date2数据
	{
	
	GPIO_SetBits(GPIOA,GPIO_Pin_5);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOA,GPIO_Pin_5);
	
		
		
		
	}
	
	if((date3&0x80)!=0)//date3数据
	{
	
	GPIO_SetBits(GPIOA,GPIO_Pin_8);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOA,GPIO_Pin_8);
	
		
		
		
	}
	
	if((date4&0x80)!=0)//date4数据
	{
	
	GPIO_SetBits(GPIOA,GPIO_Pin_11);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOA,GPIO_Pin_11);
	
		
		
		
	}
	
	if((date5&0x80)!=0)//date5数据
	{
	
	GPIO_SetBits(GPIOA,GPIO_Pin_14);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOA,GPIO_Pin_14);
	
		
		
		
	}
	
	
	if((date6&0x80)!=0)//date6数据
	{
	
	GPIO_SetBits(GPIOB,GPIO_Pin_2);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOB,GPIO_Pin_2);
	
		
		
		
	}
	
	if((date7&0x80)!=0)//date7数据
	{
	
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	
		
		
		
	}
	
	
	if((date8&0x80)!=0)//date8数据
	{
	
	GPIO_SetBits(GPIOB,GPIO_Pin_8);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	
		
		
		
	}
	
	
	if((date9&0x80)!=0)//date9数据
	{
	
	GPIO_SetBits(GPIOB,GPIO_Pin_11);
	
	}
	
	else 
		
	{
		
	GPIO_ResetBits(GPIOB,GPIO_Pin_11);
	
		
		
		
	}
	
	
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
	GPIO_ResetBits(GPIOA,GPIO_Pin_7);
	GPIO_ResetBits(GPIOA,GPIO_Pin_10);
	GPIO_ResetBits(GPIOA,GPIO_Pin_13);
	GPIO_ResetBits(GPIOB,GPIO_Pin_1);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);
	GPIO_ResetBits(GPIOB,GPIO_Pin_7);
	GPIO_ResetBits(GPIOB,GPIO_Pin_10);
	
	
	Delay(2);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	GPIO_SetBits(GPIOA,GPIO_Pin_4);
	GPIO_SetBits(GPIOA,GPIO_Pin_7);
	GPIO_SetBits(GPIOA,GPIO_Pin_10);
	GPIO_SetBits(GPIOA,GPIO_Pin_13);
	GPIO_SetBits(GPIOB,GPIO_Pin_1);
	GPIO_SetBits(GPIOB,GPIO_Pin_4);
	GPIO_SetBits(GPIOB,GPIO_Pin_7);
	GPIO_SetBits(GPIOB,GPIO_Pin_10);
	
	
	date1=date1<<1;
	date2=date2<<1;
	date3=date3<<1;
	date4=date4<<1;
	date5=date5<<1;
	date6=date6<<1;
	date7=date7<<1;
	date8=date8<<1;
	date9=date9<<1;
	
	
	
	}


GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_9);
GPIO_SetBits(GPIOA,GPIO_Pin_12);
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_12);


}
	



                                                               传数据子函数.h文件

#ifndef  __LED_H__
#define  __LED_H__

void GPIO1_Init(void);
void pose(int date1,int date2,int date3,int date4,int date5,int date6,int date7,int date8,int date9);

#endif

                                                         显示图形的.c文件

#include "stm32f10x.h" // Device header
#include "Led.h"
#include "Delay.h"


int counter;
int counter1;
int counter2;
int counter3;
	
 int a[]={0XFF,0X00,0XFF,0X01,0X80,0XFF,0X7E,0X02,0X40,0X7E,0X3C,0X04,0X20,0X3C,0X18,0X08,0X10,0X18,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X40,0x20,0x10,0x08,0x04,0x02,0x01,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14};//控制给阳极的数据
 int b[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//控0XE3制第一层哪个灯亮的数据
 int c[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XF7,0XFE,0XFE,0XFE,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XC1制第二层哪个灯亮的数据
 int d[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XFF,0XFE,0XFE,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XC9制第三层哪个灯亮的数据
 int e[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XC1,0XFF,0XFF,0XFE,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XEB制第四层哪个灯亮的数据
 int f[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XC9,0XFF,0XFF,0XFF,0XFE,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XFF制第五层哪个灯亮的数据
 int g[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XEB,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFD,0XFD,0XFD,0XFD,0XFB,0XFB,0XFB,0XFB,0XFB};//控0XFF制第六层哪个灯亮的数据
 int h[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//控制第七层哪个灯亮的数据
 int i[]={0X00,0X00,0XFE,0X00,0X00,0X7F,0XFD,0X81,0X81,0XBF,0XFB,0XC3,0XC3,0XDF,0XF7,0XE7,0XE7,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//控制第八层哪个灯亮的数据
 
	 
	 

 int  j[]={0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14,0X08,0X1C,0X3E,0X3E,0X14};
 int  k[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  l[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  m[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  n[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  o[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  p[]={0XF7,0XF7,0XF7,0XF7,0XF7,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XEF,0XBF,0XBF,0XBF,0XBF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F};
 int  q[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  r[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
	 
	 
	 
 int  a1[]={0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04,0X40,0X20,0X10,0X08,0X04};
 int  b1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB};
 int  c1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  d1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  e1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  f1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  g1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  h1[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  i1[]={0XF7,0XE3,0XC1,0XC1,0XEB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
 
	 

 int  j1[]={0x80,0X80,0x40,0X40,0x20,0X20,0x10,0X10,0x08,0X08,0x04,0X04,0x02,0X02,0x01,0X01,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0X42,0X42,0X42,0X42,0X42,0X42,0X42,0X42,0X24,0X24,0X24,0X24,0X24,0X24,0X24,0X24,0X18,0X18,0X18,0X18,0X18,0X18,0X18,0X18};
 int  k1[]={0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7};
 int  l1[]={0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF};
 int  m1[]={0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF,0XFF};
 int  n1[]={0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF,0XFF,0XFF};
 int  o1[]={0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0XFF,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF,0XFF,0XFF,0XFF};
 int  p1[]={0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0XFF,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF};
 int  q1[]={0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};                                                                               
 int  r1[]={0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};

/*	 
 int  a3[]={};
 int  b3[]={};
 int  c3[]={};
 int  d3[]={};
 int  e3[]={};
 int  f3[]={};
 int  g3[]={};
 int  h3[]={};
 int  i3[]={};
 	 
	*/ 
	 

//第四列形成流水瀑布  1~16为雨滴向下并排落下
 //17~24   每一层的四个角从上到下落下

//0X18为结束	 
    void  liangmie()
{


	for(counter=0;counter<=10;counter++)//进行11次亮灭操作,可以自己设计次数
	{
	
	
	pose(a[0],b[0],c[0],d[0],e[0],f[0],g[0],h[0],i[0]);  
	
        Delay(5000);
  
        pose(a[1],b[1],c[1],d[1],e[1],f[1],g[1],h[1],i[1]);  	
  
	Delay(5000);
	
	}
	
}


     void  outtoin()
	     
{


	for(counter2=0;counter2<=20;counter2++)//进行最外层棱的显示
   {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[2+counter1],b[2+counter1],c[2+counter1],d[2+counter1],e[2+counter1],f[2+counter1],g[2+counter1],h[2+counter1],i[2+counter1]);
	
	
	
	}
	
	
    }
   
    
       for(counter2=0;counter2<=20;counter2++)//向内一层棱的显示
   {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[6+counter1],b[6+counter1],c[6+counter1],d[6+counter1],e[6+counter1],f[6+counter1],g[6+counter1],h[6+counter1],i[6+counter1]);
	
	
	
	}
	
	
    }
   
       for(counter2=0;counter2<=20;counter2++)
    {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[10+counter1],b[10+counter1],c[10+counter1],d[10+counter1],e[10+counter1],f[10+counter1],g[10+counter1],h[10+counter1],i[10+counter1]);
	
	
	
	}
	
	
    }
    
    
       for(counter2=0;counter2<=20;counter2++)//到最里层显示结束
   {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[14+counter1],b[14+counter1],c[14+counter1],d[14+counter1],e[14+counter1],f[14+counter1],g[14+counter1],h[14+counter1],i[14+counter1]);
	
	
	
	}
	
	
    }
   

}


void  intoout()
{

  for(counter2=0;counter2<=20;counter2++)//到最里层显示开始
   {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[14+counter1],b[14+counter1],c[14+counter1],d[14+counter1],e[14+counter1],f[14+counter1],g[14+counter1],h[14+counter1],i[14+counter1]);
	
	
	
	}
	
	
    }
   
    
    for(counter2=0;counter2<=20;counter2++)
    {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[10+counter1],b[10+counter1],c[10+counter1],d[10+counter1],e[10+counter1],f[10+counter1],g[10+counter1],h[10+counter1],i[10+counter1]);
	
	
	
	}
	
	
    }
    
   
    for(counter2=0;counter2<=20;counter2++)//向内一层棱的显示
   {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[6+counter1],b[6+counter1],c[6+counter1],d[6+counter1],e[6+counter1],f[6+counter1],g[6+counter1],h[6+counter1],i[6+counter1]);
	
	
	
	}
	
	
    }

    for(counter2=0;counter2<=20;counter2++)//进行最外层棱的显示
   {
	
	
	
	for(counter1=0;counter1<=3;counter1++)
	{
	
	pose(a[2+counter1],b[2+counter1],c[2+counter1],d[2+counter1],e[2+counter1],f[2+counter1],g[2+counter1],h[2+counter1],i[2+counter1]);
	
	
	
	}
	
	
    }


}


    void  heart()
    {
    
    for(counter=0;counter<=6;counter++)
	    {
  
    for(counter1=0;counter1<=5;counter1++)//从下到上一点点组成心形
	{
	
	pose(a[18+counter1],b[18+counter1],c[18+counter1],d[18+counter1],e[18+counter1],f[18+counter1],g[18+counter1],h[18+counter1],i[18+counter1]);
	
	Delay(3500);
	
	}
	
}
	    

     for(counter=0;counter<=6;counter++)
{

	
	for(counter1=5;counter1>=0;counter1--)//从上到下一点点组成心形
	{
	
	
	pose(a[18+counter1],b[18+counter1],c[18+counter1],d[18+counter1],e[18+counter1],f[18+counter1],g[18+counter1],h[18+counter1],i[18+counter1]);
	
	
	Delay(3500);
	
	
	}
	
	
}


	
	for(counter=0;counter<=6;counter++)//心形由前到后闪烁
	{
	
    for(counter1=0;counter1<=8;counter1++)
	{
	
	pose(a[23+counter1],b[23+counter1],c[23+counter1],d[23+counter1],e[23+counter1],f[23+counter1],g[23+counter1],h[23+counter1],i[23+counter1]);
	
	Delay(2500);
	
	}
	
  
       }
       
       for(counter=0;counter<=6;counter++)//最左面灯一点点亮起来
       {
       
       
       
          for(counter1=0;counter1<=4;counter1++)
	       {
	       
	       
	       pose(a[32+counter1],b[32+counter1],c[32+counter1],d[32+counter1],e[32+counter1],f[32+counter1],g[32+counter1],h[32+counter1],i[32+counter1]);
	
	       Delay(2500);
	       
	       
	       
	       
	       }
       
       }
       
       
       
       for(counter=0;counter<=5;counter++)//开始从左边一列一列亮起来
       {
       
       
           for(counter1=0;counter1<=4;counter1++)
	       {
	      
	       pose(a[37+counter1],b[37+counter1],c[37+counter1],d[37+counter1],e[37+counter1],f[37+counter1],g[37+counter1],h[37+counter1],i[37+counter1]);

	       
	       }
	       
	       Delay(500);
       
       
       for(counter1=0;counter1<=5;counter1++)
	       {
	      
	       pose(a[42+counter1],b[42+counter1],c[42+counter1],d[42+counter1],e[42+counter1],f[42+counter1],g[42+counter1],h[42+counter1],i[42+counter1]);
	
	       
	       }
	       
	       Delay(500);
	       
	       
	  for(counter1=0;counter1<=5;counter1++)
	       {
	 
	       pose(a[48+counter1],b[48+counter1],c[48+counter1],d[48+counter1],e[48+counter1],f[48+counter1],g[48+counter1],h[48+counter1],i[48+counter1]);
	
	       
	       }
	       
	       Delay(500);
	            
	       
	       for(counter1=0;counter1<=5;counter1++)
	       {
	       
	     pose(a[54+counter1],b[54+counter1],c[54+counter1],d[54+counter1],e[54+counter1],f[54+counter1],g[54+counter1],h[54+counter1],i[54+counter1]);
	
	 
	       
	       
	       }
	       
	       Delay(500);
	       
	       for(counter1=0;counter1<=5;counter1++)
	       {
	      
	       pose(a[60+counter1],b[60+counter1],c[60+counter1],d[60+counter1],e[60+counter1],f[60+counter1],g[60+counter1],h[60+counter1],i[60+counter1]);

	       
	       }
	       
	       Delay(500);
	       
	       
       for(counter1=0;counter1<=5;counter1++)
	       {
	       
	       
	       
	       pose(a[66+counter1],b[66+counter1],c[66+counter1],d[66+counter1],e[66+counter1],f[66+counter1],g[66+counter1],h[66+counter1],i[66+counter1]);
	       
	       }
	       
	       Delay(500);
	       
       
       }
       
    
    }

                                                         显示图形的.h文件

#ifndef    __xianshi_H__
#define    __xianshi_H__

void  liangmie(void);
void  outtoin(void);
void  intoout(void);
void  heart(void);


#endif

到此我的分享就结束了,这几天在实验室在焊接这个光立方,挤了很多时间才写完这个,希望大家能批评指正!

发一个我在实验室的飞线照片吧,挺好玩的~

               这个由于后面飞线有点多,使用时间长了信号不稳定,后面我是自己画了个pcb板,自己的话建议还是打个板子使用。

有关最详细的制作8*8*8的光立方的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  4. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  5. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  6. ruby - 如何在ruby中制作动态多维数组? - 2

    我有一个关于多维数组的初学者ruby​​问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu

  7. ruby - 如何在不使用 HERE-DOCUMENT 语法的情况下在 Ruby 中制作多行字符串文字? - 2

    问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub

  8. ruby - 如何制作 Ruby 1.8 小写非拉丁字符? - 2

    我正在使用Ruby1.8。似乎downcase不会改变非拉丁字符。例如:"Δ".downcase返回“Δ”我知道在Ruby1.9.1及更高版本中,我可以使用UnicodeUtils(fromhere)。我试过了,它工作正常。返回上一个示例的"δ"。是否有适用于1.8Ruby的等效(或任何)解决方案? 最佳答案 nash@nash:~$ruby-vruby1.8.7(2011-02-18patchlevel334)[i686-linux]gem安装unicode(https://rubygems.org/gems/unicode)re

  9. ruby - 如何使用 pager 制作 ruby​​ 命令行应用程序? - 2

    我正在使用Ruby制作一个命令行工具。它将在屏幕上打印大量文本。目前,我正在使用shell管道(may_app|more)来执行此操作。但我认为最好有一个默认的寻呼机。就像你在执行gitlog时看到的一样。可以使用git--nopagerlog禁用寻呼机。我已经完成了大量的谷歌工作并找到了一颗gem:hirb,但似乎有点矫枉过正。经过多次尝试,我目前正在使用shellwrapper来这样做:#!/bin/bash#xray.rbisthecorescript#doingthemainlogicandwill#outputmanyrowsoftexton#screenXRAY=$HOME

  10. ruby - 制作命令行程序 "full screen" - 2

    我想知道如何在shell中创建“全屏”窗口的外观,如在vim、emacs等中。是否可以在Ruby中以编程方式执行此操作?这对平台的依赖程度如何?编辑:我不是在寻找如何让我的shell进入全屏模式。我正在寻找一种方法来隐藏以前输入的命令并用应用程序“填充”shell屏幕。它适用于安装程序。 最佳答案 您可能正在寻找的是ncurses或S-Lang支持提供你的全TUI经验。Ruby的gem环境提供了几个可能值得探索的gem:$gemlist--remote|grep-icursescursesx(003)ffi-ncurses(0.4.

随机推荐