|
本帖最后由 ycx2002 于 2018-7-13 01:20 编辑
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit PINA=P1^0; //旋转编码开关脚位
sbit PINB=P1^1; //旋转编码开关脚位
sbit P2_1=P2^1; //数码管
sbit P2_2=P2^2; //数码管
sbit P2_3=P2^3; //数码管
uchar x;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,
0xf8,0x80,0x90};
void Delayms(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Display(uchar temp)
{
uchar bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
P0=(table[bai]);
P2_1 = 0;
Delayms(5);
P2_1 = 1;
P0=table[shi];
P2_2 = 0;
Delayms(5);
P2_2 = 1;
P0=table[ge];
P2_3 = 0;
Delayms(5);
P2_3 = 1;
}
/******************************************************************************/
void encoder()
{
static bit flag=0,turn_right=0,turn_left=0;
if((PINA)&&(PINB))
flag=1;
if(PINA!=PINB)
{
turn_left=PINA;
turn_right=PINB;
}
if(flag)
{
if((PINA==0)&&(PINB==0))
{
flag=0;
if(turn_left==0)
x--;
if(turn_right==0)
x++;
}
}
}
void main()
{
while(1)
{
encoder();
Display(x);
}
}
这是个51旋转编码开关的程序,编码开关检测程序用到了静态局部变量,问题就出在这里,如果不用静态局部变量直接声明位变量bit flag=0,turn_right=0,turn_left=0;按照原理也是说的通的,因为每次执行到这部分right和left都被重新赋值了:
if(PINA!=PINB)
{
turn_left=PINA;
turn_right=PINB;
}
用仿真芯片是可以通过的!
但实际放到板子上测试只显示零,调节旋转开关也没反应。但是在检测函数里使用static bit 或把bit flag=0,turn_right=0,turn_left=0;设置为全局变量就一切正常了。关于静态局部变量的意义我也知道,为什么会这样?
请老师详细解惑。。。。感谢! |
|