本帖最后由 pzsh 于 2021-12-24 11:20 编辑
单片机型号是PIC16F877A。
我在写一个LCD12864的程序,问题出在忙检测函数。并行数据的读写通过PORTD口。
一开始我的程序是这样的:
void BusyCheck(void)
{
unsigned char temp;
TRISD = 0xFF; //数据口设为输入
RS = 0;
RW = 1;
while(1)
{
E = 1;
temp = PORTD; //读取DB7
E = 0;
if((temp & 0x80) == 0)
{
TRISD = 0x00;
break;
}
}
}
但是一直跳不出while循环。
之后我添加了一个__bit类型的变量busy,就能正常运行了,函数改为如下:
void BusyCheck(void)
{
busy = 1;
unsigned char temp;
TRISD = 0xFF; //数据口设为输入
RS = 0;
RW = 1;
while(busy)
{
E = 1;
temp = PORTD; //读取DB7
E = 0;
if((temp & 0x80) == 0)
{
TRISD = 0x00;
busy = 0;
}
}
}
甚至我还做了如下调试:根据第二种程序,别的什么都不该,就是把while语句的判断条件改成while(1),程序就不能正常执行。
void BusyCheck(void)
{
busy = 1;
unsigned char temp;
TRISD = 0xFF; //数据口设为输入
RS = 0;
RW = 1;
while(1)//仅仅修改此处,把while(busy)改成while(1)
{
E = 1;
temp = PORTD; //读取DB7
E = 0;
if((temp & 0x80) == 0)
{
TRISD = 0x00;
busy = 0;
break;
}
}
}
但是从逻辑上讲,如果busy = 0;能被执行,那么break肯定也能;break能执行又怎么会一直死在while语句里面不能出来呢?之后我进行了单步调试,结果更加令我诧异:
采用第一种程序(即不用busy变量),temp读取的值最高位一直是1,通常是0x81;而改用第二种程序,temp就能读取到0x00。但是我除了这个函数之后没有改变任何其他地方,为什么temp从PORTD口读到的值会不同呢?
|