解决了怪异的问题

    在上篇日志中提到的怪异的问题,今天中午吃饭时终于想到原因了。读取端口老是为1的原因主要是我数据类型运用的不当,即读取端口某位数据应该用sbit类型,我用了bit类型,用bit类型时,C51编译器不允许直接访问某一位。以下面程序为例:

bit An,Bn,An_,Bn_; void count_pca_ISR(void) interrupt 9 { bit tmp; An_=P0^4; Bn_=P0^5; // 读取A和B通道的状态 tmp=(~(An^Bn_))&(Bn^An_); // 计算偏转的方向:tmp 1表示正转,0表示反转 if(tmp)counter+=1; else counter-=1; // 根据偏转方向计数 An=An_;Bn=Bn_; // 更新A和B通道的状态 PCA0CN&=0xFD; // 配置PCA控制寄存器,清除CCF1位,重新开启中断 }

在程序中An_的取值不是P0的第四位,而是P0寄存器与0x04的按位异或。所以每次计算都是1.要想读取P0口的值,应该改为:

sbit P0_5=P0^5; bit An,Bn,An_,Bn_; void count_pca_ISR(void) interrupt 9 { bit tmp; An_=P0_4; Bn_=P0_5; // 读取A和B通道的状态 tmp=(~(An^Bn_))&(Bn^An_); // 计算偏转的方向:tmp 1表示正转,0表示反转 if(tmp)counter+=1; else counter-=1; // 根据偏转方向计数 An=An_;Bn=Bn_; // 更新A和B通道的状态 PCA0CN&=0xFD; // 配置PCA控制寄存器,清除CCF1位,重新开启中断 }

 

 

这样就可以读取P0口的值,也就是要通过sbit类型的变量来访问P0口。

你可能感兴趣的:(解决了怪异的问题)