执行 FL
模式
Main
程序初始化
判断外部中
是
断 0
否
判断按键
执 行 按 键 所 对
应的子程序
终止
#include
#define uint unsigned int
#define uchar unsigned char
uint code table[]={0xfe,0xfd,0xfb};
uchar code tableOff[]={0x3f,0x71,0x71};
uchar code tableInt[]={0x06,0x54,0x78};
uchar code tableLo[]={0x38,0x5c};
uchar code tableHi[]={0x76,0x06};
uchar code tableFL[]={0x71,0x38};
uint t,num,sw,tt,ss;
sbit slow=P1^0;
sbit shigh=P1^1;
sbit f=P1^2;
sbit sw1=P3^0;
sbit sw2=P3^1;
sbit sw3=P3^6;
sbit sw4=P3^7;
void Init(void);
void delay(uint);
void display(void);
void scan(void);
void Off(void);
void Int(void);
void Lo(void);
void Hi(void);
void FL(void);
main()
{
Init();
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
scan();
while(1)
{
if(sw==5)
{
FL();
}
if(sw!=5)
{
scan();
switch(sw)
{
case 1: Off();
Int();
case 2:
case 3:
Lo();
case 4: Hi();
break;
break;
break;
break;
}
}
}
}
void Init(void)
{
P1=0x00;
ss=0;
t=0;
num=0;
tt=0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void display(void)
{
if(sw==1)
{
P2=table[0];
P0=tableOff[0];
delay(5);
P2=table[1];
P0=tableOff[1];
delay(5);
P2=table[2];
P0=tableOff[2];
delay(5);
}
if(sw==2)
{
P2=table[0];
P0=tableInt[0];
delay(5);
P2=table[1];
P0=tableInt[1];
delay(5);
P2=table[2];
P0=tableInt[2];
delay(5);
}
if(sw==3)
{
P2=table[0];
P0=tableLo[0];
delay(5);
P2=table[1];
P0=tableLo[1];
delay(5);
}
if(sw==4)
{
P2=table[0];
P0=tableHi[0];
delay(5);
P2=table[1];
P0=tableHi[1];
delay(5);
}
if(sw==5)
{
P2=table[0];
P0=tableFL[0];
delay(5);
P2=table[1];
P0=tableFL[1];
delay(5);
}
}
void scan(void)
{
if(sw1==0)
sw=1;
if(sw2==0)
sw=2;
if(sw3==0)
sw=3;
if(sw4==0)
sw=4;
}
void Off(void)
{
display();
slow=0;
shigh=0;
f=0;
}
void Int(void)
{
display();
if(t>=0&&t<5)
{
slow=1;
shigh=0;
f=0;
}
if(t>=5&&t<10)
slow=0;
}
void Lo(void)
{
display();
slow=1;
shigh=0;
f=0;
}
void Hi(void)
{
display();
slow=0;
shigh=1;
f=0;
}
void FL(void)
{
display();
slow=0;
if(tt>=50&&tt<=350)
{
shigh=1;
if(tt==350)
{
shigh=0;
tt=360;
}
}
else
shigh=0;
f=1;
}
void exter0() interrupt 0
{
ss++;
ss=ss%2;
if(ss==1)
else
sw=5;
scan();
t=0;
tt=0;
num=0;
}
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
if(sw==5)
tt++;
if(num==100)
{
num=0;
if(sw==2)
{
t++;
t=t%10;
}
}
}
Protuse 仿真截图:
1、 off 模式—停止
2、Int 模式—间歇低速旋转
3、Lo 模式—低速旋转
4、Hi 模式—高速旋转