[plain]
BMA = P4^2;//編碼開關A引腳1 //必須接上拉電阻680歐
sbit BMB = P4^3;//編碼開關B引腳3 //必須接上拉電阻680歐
//編碼開關引腳2 接地
sbit BMC = P1^6;//編碼開關c 按下引腳
unsigned int counter = 0; //編碼器脈沖計數
/**********************************************************
掃描編碼器子函數 by陳
正轉(時鐘方向)
11
10
00
01
11 //開始第二角度
10
……
反轉(時鐘反方向)
11
01
00
10
11 //開始第二角度
01
……
程序從00開始
如果還是00 則等待 如果在延時這麼長時間0ffff*yans(1)還是00 則返回 (如果轉的速度非常快,則可使減小;相反亦然)
如果收到01 則正轉加1 返回
如果收到10 則反轉減1 返回
如果收到11 則錯誤 返回
**********************************************************/
void scan_encoder()
{
unsigned int i;
while(1)
{
if(BMA==0&&BMB==0) //收到0 0 後開始判斷
{
for(i=0;i<0xfff0;i++)
{
if(BMA==0&&BMB==0) //狀態未變,等待
{
yans(1);
}
else if(BMA==0&&BMB==1) //正轉
{
counter++;
return;
}
else if(BMA==1&&BMB==0) //反轉
{
counter--;
return;
}
if(BMA==1&&BMB==1) //錯誤
{
return;
}
}
}
else if(0==BMC)
{
counter=0;
return;
}
else
{
return;
}
}
}
void xszs()
{
unsigned int code db[]={
0,0,};
fsfont55();
fsszxy(4,db);
printf("%5u\n",counter);
txjs();
}
void testmain()
{
yans(3000);
while(1)
{
//tisy();
xszs();
scan_encoder();
}
}