unsigned int keysacn() //扫描法,需改进,不太好用
{
// AB
//正转 00->01->11->10->00->01->
//反转 00->10->11->01->00->10->
unsigned char i,x,value;
value=P0&0x3;
if(!(key_A == i & key_B == x) )
{
if(value==0x00)
{
DelayMs(10);
value=P0&0x3; //需再次读取io口,否则无法判断
if(value==0x01){VOL++;}
if(value==0x03){VOL--;}
}
if(value==0x01)
{
DelayMs(10);
value=P0&0x3;
if(value==0x03){VOL++;}
if(value==0x00){VOL--;}
}
if(value==0x03)
{
DelayMs(10);
value=P0&0x3;
if(value==0x02){VOL++;}
if(value==0x01){VOL--;}
}
if(value==0x02)
{
DelayMs(10);
value=P0&0x3;
if(value==0x00){VOL++;}
if(value==0x03){VOL--;}
}
}
i = key_A;
x = key_B;
return VOL ;
}
小弟用的程序,但结果不太好用,转得太快的时候会出错,有时不正确。
于是我用了中断法,但结果更惨,加的数有时太多,转得太快或太慢都觉得不好用,比不上音响上面的转动的好用,
void INT0_ISR( void ) interrupt 0 //外部中断法,需改进,不好用
{
unsigned int x;
for(x=0;x<10;x++); //延时去抖动
if(key_B==0){VOL++;}
if(key_B==1){VOL--;}
}
-----------------------------------------------------------------------------------------------------------------------------------
网上的程序太多,太复杂了看不懂,请高手帮看下,那里要改进,并得到合适好用的转动数据
|