#include <AT89X52.h>
unsigned char n,j,jf,jp,key;
unsigned char Pn;
sbit K=P1^0;
void contr(unsigned char n,unsigned char level)
{
if(level>Pn)
P0&=~(0x01<<n);
else
P0|=0x01<<n;
}
void main(void)
{
TMOD = 0x01; //選擇16位定時(shí)器模式
TH0 = 0xfd; //設(shè)置定時(shí)起點(diǎn)
TL0 = 0x8f;
IE=0x82; //開總開關(guān)、開定時(shí)器0
TR0 = 1; //開定時(shí)器
while(1);
}
void Timer0Interrupt(void) interrupt 1 //1ms 定時(shí)中斷子程序
{
unsigned char i,t;
TH0 = 0xfd;
TL0 = 0x8f;
if(!K)
{
if(++key==20)
{
if(++n>=6)n=0;
j=0;Pn=0;jf=0;jp=0;P0=0xff;
}
if(key>25)key=25;
}
else
key=0;
if(++Pn>=32)Pn=0;
switch(n)
{
case 0:for(i=0;i<8;i++)
contr(i,(i<<2)+1);
break;
case 1:if(!Pn){
if(!jf)
{if(++j>128)jf=1;}
else
{if(!j--){jf=0;j=0;}}
}
for(i=0;i<8;i++)
contr(i,j>>2);
break;
case 2:if(!Pn){
if(!jf)
{if(++j>64){if(++jp>7){jf=1;jp=7;}else {j=0;}}}
else
{if(--j==0){if(!jp--){jf=0;jp=0;} else {j=64;}}}
}
contr(jp,j>>1);
if(!jf)
{
for(i=0;i<jp;i++)
contr(i,32);
}
break;
case 3:if(!Pn){
if(!jf)
{if(++j>128)jf=1;}
else
{if(j--<=8){jf=0;}}
}
for(i=0;i<4;i++)
{
t=(i<<2)+(((4-i)*(j>>2))>>2);
contr(i,t);
contr(7-i,32-t);
}
break;
case 4:if(!Pn){if(++j>2){j=0;if(++jf>=8)jf=0;}}
jp=jf;
for(i=0;i<8;i++)
{
contr(jp%8,(i<<2)+1);
jp++;
}
break;
case 5:if(!Pn){
if(!jf)
{if(++j>=31){jf=1;}}
else
{if(!--j){jf=0;}}
}
t=j%8;
for(i=0;i<=t;i++)
{
if(!jp)
contr(t,j-t+i);
else
contr(7-t,j-t+i);
}
if(!j%8)jp=!jp;
break;
default:break;
}
}