好看又实用!《光立方活动》
浏览量:482 回帖数:0
1楼
活动时间:2018 年 5月 19日
活动地点:5206
参加人员: 自协成员
活动内容: 光立方原理教学及制作
光立方程序(部分):
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit line_LATCH=P1^0;//定义锁存使能端口 行扫描的锁存端口
sbit LATCH1=P2^0;//定义锁存使能端口 第一灯板的字节锁存
sbit LATCH2=P2^1;//
sbit LATCH3=P2^2;//
sbit LATCH4=P2^3;
sbit LATCH5=P2^4;
sbit LATCH6=P2^5;
sbit LATCH7=P2^6;
sbit LATCH8=P2^7;
void Delay(unsigned int t)
{
while(--t);
}
unsigned char line[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 显示行值01234567
void display(unsigned char *Data)//显示子程序,指针数组作为形参,直接指向传过来的实参数组的地址 ,这样就可直接操纵数组传过来的数组了
{
unsigned char i;
for(i=0;i<8;i++)
{
DataPort=line[i]; //先给行(灯板的公共端)输入数据
line_LATCH=1; //打开锁存,把数据line[i]放进去
line_LATCH=0; //关闭锁存,阻止外部数据进来
DataPort=Data[i]; //把数组Data[0~7]里的值依次传给第一灯板的573锁存器中
LATCH1=1;LATCH1=0;
DataPort=Data[8+i]; //把数组Data[8~15]里的值依次传给第二灯板的573锁存器中
LATCH2=1;LATCH2=0;
DataPort=Data[16+i]; //把数组Data[16~23]里的值依次传给第三灯板的573锁存器中
LATCH3=1;LATCH3=0;
DataPort=Data[24+i];
LATCH4=1;LATCH4=0;
DataPort=Data[32+i];
LATCH5=1;LATCH5=0;
DataPort=Data[40+i];
LATCH6=1;LATCH6=0;
DataPort=Data[48+i];
LATCH7=1;LATCH7=0;
DataPort=Data[56+i];
LATCH8=1;LATCH8=0;
Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影
DataPort=0xff; // 清空行锁存器里数据,防止出现乱码
line_LATCH=1; //
line_LATCH=0;
} /*如此一趟循环下来,每次都是8块灯板的同一行一起点亮,
如此组成一个灯板,8次循环下来,就全部灯都点亮了*/
}
void liang() //点亮所有的灯
{
unsigned int i;
for(i=0;i<5000;i++)
{
DataPort=0x00; //先给行(灯板的公共端)输入数据
line_LATCH=1; //打开锁存,把数据0x00放进去
line_LATCH=0; //关闭锁存,阻止外部数据进来
DataPort=0xff; //把0xff送进锁存器1~8中,使它们的输出引脚都输出高电平,与行锁存器的0x00相对,点亮所有的灯
LATCH1=1;LATCH1=0;
LATCH2=1;LATCH2=0;
LATCH3=1;LATCH3=0;
LATCH4=1;LATCH4=0;
LATCH5=1;LATCH5=0;
LATCH6=1;LATCH6=0;
LATCH7=1;LATCH7=0;
LATCH8=1;LATCH8=0;
}
}
void mie() //熄灭所有的灯
{
unsigned int i;
for(i=0;i<5000;i++)
{
DataPort=0x00; //先给行(灯板的公共端)输入数据
line_LATCH=1; //打开锁存,把数据0x00放进去
line_LATCH=0; //关闭锁存,阻止外部数据进来
DataPort=0x00; //把0x00送进锁存器1~8中,使它们的输出引脚都输出高电平,与行锁存器的0x00相对,熄灭所有的灯
LATCH1=1;LATCH1=0;
LATCH2=1;LATCH2=0;
LATCH3=1;LATCH3=0;
LATCH4=1;LATCH4=0;
LATCH5=1;LATCH5=0;
LATCH6=1;LATCH6=0;
LATCH7=1;LATCH7=0;
LATCH8=1;LATCH8=0;
}
}
void Laihui() //来回灯板显示效果
{
unsigned char i;
unsigned char code laihui0[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//定义空间为64的数组并赋值,用以传递给显示子程序
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
unsigned char code laihui1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
PS:由于科技文化节即将到临,协会将与其他协会举办一场大型比赛,本次活动将会详细讲解比赛规则及相关事宜,有意向的同学请快来参加活动吧!
@华水社联
活动时间:2018 年 5月 19日
活动地点:5206
参加人员: 自协成员
活动内容: 光立方原理教学及制作
光立方程序(部分):
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit line_LATCH=P1^0;//定义锁存使能端口 行扫描的锁存端口
sbit LATCH1=P2^0;//定义锁存使能端口 第一灯板的字节锁存
sbit LATCH2=P2^1;//
sbit LATCH3=P2^2;//
sbit LATCH4=P2^3;
sbit LATCH5=P2^4;
sbit LATCH6=P2^5;
sbit LATCH7=P2^6;
sbit LATCH8=P2^7;
void Delay(unsigned int t)
{
while(--t);
}
unsigned char line[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 显示行值01234567
void display(unsigned char *Data)//显示子程序,指针数组作为形参,直接指向传过来的实参数组的地址 ,这样就可直接操纵数组传过来的数组了
{
unsigned char i;
for(i=0;i<8;i++)
{
DataPort=line[i]; //先给行(灯板的公共端)输入数据
line_LATCH=1; //打开锁存,把数据line[i]放进去
line_LATCH=0; //关闭锁存,阻止外部数据进来
DataPort=Data[i]; //把数组Data[0~7]里的值依次传给第一灯板的573锁存器中
LATCH1=1;LATCH1=0;
DataPort=Data[8+i]; //把数组Data[8~15]里的值依次传给第二灯板的573锁存器中
LATCH2=1;LATCH2=0;
DataPort=Data[16+i]; //把数组Data[16~23]里的值依次传给第三灯板的573锁存器中
LATCH3=1;LATCH3=0;
DataPort=Data[24+i];
LATCH4=1;LATCH4=0;
DataPort=Data[32+i];
LATCH5=1;LATCH5=0;
DataPort=Data[40+i];
LATCH6=1;LATCH6=0;
DataPort=Data[48+i];
LATCH7=1;LATCH7=0;
DataPort=Data[56+i];
LATCH8=1;LATCH8=0;
Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影
DataPort=0xff; // 清空行锁存器里数据,防止出现乱码
line_LATCH=1; //
line_LATCH=0;
} /*如此一趟循环下来,每次都是8块灯板的同一行一起点亮,
如此组成一个灯板,8次循环下来,就全部灯都点亮了*/
}
void liang() //点亮所有的灯
{
unsigned int i;
for(i=0;i<5000;i++)
{
DataPort=0x00; //先给行(灯板的公共端)输入数据
line_LATCH=1; //打开锁存,把数据0x00放进去
line_LATCH=0; //关闭锁存,阻止外部数据进来
DataPort=0xff; //把0xff送进锁存器1~8中,使它们的输出引脚都输出高电平,与行锁存器的0x00相对,点亮所有的灯
LATCH1=1;LATCH1=0;
LATCH2=1;LATCH2=0;
LATCH3=1;LATCH3=0;
LATCH4=1;LATCH4=0;
LATCH5=1;LATCH5=0;
LATCH6=1;LATCH6=0;
LATCH7=1;LATCH7=0;
LATCH8=1;LATCH8=0;
}
}
void mie() //熄灭所有的灯
{
unsigned int i;
for(i=0;i<5000;i++)
{
DataPort=0x00; //先给行(灯板的公共端)输入数据
line_LATCH=1; //打开锁存,把数据0x00放进去
line_LATCH=0; //关闭锁存,阻止外部数据进来
DataPort=0x00; //把0x00送进锁存器1~8中,使它们的输出引脚都输出高电平,与行锁存器的0x00相对,熄灭所有的灯
LATCH1=1;LATCH1=0;
LATCH2=1;LATCH2=0;
LATCH3=1;LATCH3=0;
LATCH4=1;LATCH4=0;
LATCH5=1;LATCH5=0;
LATCH6=1;LATCH6=0;
LATCH7=1;LATCH7=0;
LATCH8=1;LATCH8=0;
}
}
void Laihui() //来回灯板显示效果
{
unsigned char i;
unsigned char code laihui0[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//定义空间为64的数组并赋值,用以传递给显示子程序
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
unsigned char code laihui1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
PS:由于科技文化节即将到临,协会将与其他协会举办一场大型比赛,本次活动将会详细讲解比赛规则及相关事宜,有意向的同学请快来参加活动吧!
@华水社联
2017/11/28 16:43:42