#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;
}
}
|