/*----------------------------------------------- 名称:光立方的控制程序 日期: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中断 } |