//函数在C51运行正常,改动到ATMEGA8运行不计数,
#define PORTD_BIT (*((volatile BYTEBIT *)&PORTD))
#define PIND_BIT (*((volatile BYTEBIT *)&PIND))
void ShaoMiao(void)
{ //定义变量:标志 A相 B相
char EC11_Flag=0,Left_Flag=0,Right_Flag=0;//
char EC11_A, EC11_B;//定义两个变量,AC11编码器A相接PD0 B相接PD1
PORTD_BIT.BIT7=EC11_Flag; //状态标志指示灯输出
EC11_A=PIND_BIT.BIT0; //定义编码器A相接PD0状态送变量A
EC11_B=PIND_BIT.BIT1; //定义编码器B相接PD1
if(EC11_A&&EC11_B) //表示开始第一个脉冲,第二个脉冲两个都为1为转动状
{
EC11_Flag =1 ;// 1 在转动状态 0为停止状态;
PORTD_BIT.BIT7=EC11_Flag; //状态标志指示灯
}
if(EC11_A!=EC11_B)//第二个信号 A信号不等于B信号 记录下来
{
Left_Flag = EC11_A ; //记录A的信号状态
PORTC_BIT.BIT2=Left_Flag; //A指示灯
Right_Flag = EC11_B ; //记录B的信号状态
PORTC_BIT.BIT3=Right_Flag; //B指示灯
}
if(EC11_Flag)//结果为真,在转动状态?如果这成立,第二行就不成立了,但是51上可以运行,如果这里条件不成立,下行不执行
{
if((EC11_A==0)&&(EC11_B==0)) // 第三个信号,处理第二个信号
{
if(Left_Flag) //左转 A相当前低电平计数减
{
count-- ; //旋转的值减1
}
else if(Right_Flag)//右转 B相当前低电平计数减 ==0 !
{
count++; //旋转的值加1
}
EC11_Flag = 0;// 标志位清零
} //
}
}
请教高人,哪里的问题 |