#include<stc12c5a60s2.h>
#define uchar unsigned char
#define uint unsigned int
sbit go=P1^7;//前进
sbit back=P3^7;//后退
sbit turn_left=P1^6;//左转
sbit turn_right=P3^6;//右转
sbit turn_whistle=P1^5;//鸣笛
sbit turn_light=P3^5;//亮灯
sbit whistle=P3^3;//喇叭接口
sbit light=P3^2;//LED接口
sbit quciken=P1^4;//加速
sbit moderate=P3^4;//减速
void delayms();
void keyscan();
uint light_a=0,pwm_n=0,speed=5;
//延时函数
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//按键函数
void keyscan()
{
//按键控制前进
if(go==0)
{
delayms(10);
if(go==0)
{
P0=0x96;
//while(!go);之前在论坛上前辈指导是按键陷入死循环,我想这个按键是长按的,把松开按键的这段屏蔽掉,问题还是没有解决。
}
}
else
{
P0=0x00;
}
//按键控制后退
if(back==0)
{
delayms(10);
if(back==0)
{
P0=0x69;
//while(!back);该按键同样是一直按的,也把这段屏蔽掉试了。
}
}
else
{
P0=0x00;
}
//按键控制左转
if(turn_left==0)
{
delayms(10);
if(turn_left==0)
{
P0=0xa5;
//while(!turn_left);此处也屏蔽做了修改。
}
}
else
{
P0=0x00;
}
//按键控制右转
if(turn_right==0)
{
delayms(10);
if(turn_right==0)
{
P0=0x5a;
//while(!turn_right);此处也屏蔽做了修改。
}
}
else
{
P0=0x00;
}
//按键控制鸣笛
if(turn_whistle==0)
{
delayms(10);
if(turn_whistle==0)
{
whistle=0;
//while(!turn_whistle);此处也屏蔽做了修改。
}
}
else
{
whistle=1;
}
//按键控制亮灯
if(turn_light==0)
{
delayms(10);
if(turn_light==0)
{
light_a++;
if(light_a==1)
{
light=0;
}
if(light_a>=2)
{
light_a=0;
light=1;
}
while(!turn_light);
}
}
//按键控制减速
if(quciken==0)
{
delayms(10);
if(quciken==0)
{
speed++;
if(speed>=10)
{
speed=10;
}
while(!quciken);//这个减速按键是点动的,所以这句留下来了。
}
}
//按键控制加速
if(moderate==0)
{
delayms(10);
if(moderate==0)
{
speed--;
if(speed<=1)
{
speed=0;
}
while(!moderate);//这个加速按键是点动的,所以这句留下来了。
}
}
}
//主函数
void main()
{
TMOD=0x01;//定时器0为工作方式1
TH0=(65536-917)/256;//5ms定时初值设置
TL0=(65536-917)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0中断
while(1)//就这一块搞迷糊了,这样写对吗?按键扫描函数清除掉按键的松手检测,还是没能跳出死循环吗?请各位前辈指导该怎么改?
{
keyscan();
}
}
void tim0()interrupt 1
{
TR0=0;
TH0=(65536-917)/256;//5ms定时初值设置
TL0=(65536-917)%256;
TR0=1;
pwm_n++;
if(pwm_n>=10)
{
pwm_n=0;
}
if(pwm_n>=speed)
{
P2=0x00;
}
if(pwm_n<speed)
{
P2=0xf0;
}
}
|