查看: 1920|回复: 0
打印 上一主题 下一主题

光立方的控制程序

[复制链接]
跳转到指定楼层
沙发
发表于 2014-12-2 10:28:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  /*-----------------------------------------------
  名称:光立方的控制程序
  日期:2011.12.
  修改:第三次
  内容:通过层扫描方式将512个逐层扫描,扫描时间由参数b决定
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,
                  //头文件包含特殊功能寄存器的定义
#define uln P1                //uln2803控制端
#define ls P0                //ls573输入端
#define cls P2                //ls573控制端
#define uchar unsigned char
#define uint unsigned int
uchar code display0[]={        //花样数组
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,                            //screen 1
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*****************************************************************************/
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,                            //screen 5
0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF,
0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xBD, 0x81, 0xFF,
0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xBD, 0x81, 0xFF,
0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xBD, 0x81, 0xFF,
0xFF, 0x81, 0xBD, 0xBD, 0xBD, 0xBD, 0x81, 0xFF,
0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
uchar code display1[]={
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,                            //screen 6
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
/*****************************************************************************/                                                                                                                          
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,                           //screen 35
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
uint t=0;                                                 //花样数组检测数
uchar z=0;                                                 //选择标志位
uint p[]={0x140,0x780};                        //花样个数
uint b=10;                                                 //停留时间常数
uchar a=0;       
uchar j=0;
uint counter=0;       
void wdata(){
                                                                           //花样写入函数
switch (z==0){                                                         
case 0:ls=display0[t];break;                  //写入花样, 以参数z为选择标志位
case 1:ls=display1[t];break;
}
}
       
void initial(){                //定时器初始化函数
TMOD=0x01;                        //设定工作方式1
TH0=55536/256;                //计算初始值,载入,定时
TL0=55536%256;
EA=1;                                //开总中断
ET0=1;                                //T0中断
TR0=1;                                //启动定时器
}
void main(){               
        initial();                //初始化
        while(1){                //显示花样并等待进入中断
                uln=0x01;        //uln2803初始化
                for(a=0;a<8;a++){
                        cls=0x01;                                  //74ls573 C控制端赋值,1输入,0锁存
                        for(j=0;j<8;j++){
                        wdata();                                  //调用数据写入函数
                        cls=cls<<1;                                  //对下一个74ls573写入数据
                        ls=0x00;
                        t=t+1;
                        }
                uln=uln<<1;                                          //准备显示下一层花样
                }
        t=t-64;                                                          //循环显示这八层数据,等待中断
        }
}
void T0_int () interrupt 1{
TR0=0;                                                                  //关定时器
ET0=0;                                                                  //T0中断
TH0=55536/256;                                                  //重装初值
TL0=55536%256;
switch (z){                                                          //根据t值不同选择花样停留的时间长度
case 0:b=300;break;
case 1:b=45;break;
}
if(t<p[z]){                                                         //花样Z中总共有p[z]个元素
        counter++;                                                          
        if(counter==b){                                          //定时时间是否已到
        t=t+64;                                                          //显示下一个花样
        counter=0;                                                  //重新计时(对10ms计数)
        }
}                       
else z=z+1;t=0;                                                  //全部显示完毕,从头重新开始
TR0=1;                                                                  //启动定时器
ET0=1;                                                                  //T0中断
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表