关于中断函数里面的三目运算符条件的一个小问题请教

原本这个程序的作用是P1接8个led,在P3.2引脚接一个按钮,每按一次,发亮一个LED,顺序下移,且每次只有一个亮,周而复始。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp=2;
void delay()
{
uint i,j;
for(i=0;i<150;i++)
for(j=0;j<150;j++)
{
;
}
}
main()
{
IT0=1;//下降沿触发
EX0=1;//开外中断0
PX0=1;
EA=1;//开中断
P1=0x00;
while(1)
{
P1=0xff;
}
}

void Interrupt0 (void) interrupt 0
{
temp=((temp==0)||(temp==0x80))?1:(temp<<1);
P1=~temp;
delay();
}
然而我不明白的就是 temp=((temp==0)||(temp==0x80))?1:(temp<<1);
这个程序的意思是当temp==0或者temp==0x80这两个条件中只要其中一个成立的时候,temp都会等于1,否则temp等于temp左移一个位,那么问题就是;
temp这个数在一开始的时候就只是定义了(uchar temp=2),那么在后面(temp=((temp==0)||(temp==0x80))?1:(temp<<1);)这个程序的判断依据是什么?(即系给出即使给出条件temp==0和temp==0x80又怎么知道这个判断是真还是假)?
我是初学者,希望大家能帮助小弟,谢谢
那是不是表示 uchar temp=2中的数值2可以随便改(0~128)?还有一个问题,为什么temp左移一位后会是4?以及变成128的时候为什么就是0x80?我是初学的,请指教。我有看书的,但有时书上的没有我想要找的,所以就想直接问广大朋友们,谢谢

没有太明白你的意思
这里uchar temp=2
第一次判断的时候既不是0也不是0x80,所以temp右移一位,变成4
下次循环,再右移,直到temp变成128也就是0x80的时候,条件为真,重新置其值为1,这样循环往复
之所有有这个判断就是因为temp每次的值都是在变化的,不是固定为2

这与二进制编码有直接关系,uchar是八位二进制数,刚开始设2
这样二进制表示为00000010
左移一位后成为00000100,转换10进制就是4,左移相当于乘2
直到左移到10000000也就是16进制的0x80,这就是128了,当等于128就就变成1
也就是00000001,这样就回到初始了,再左移又是2,于是是个循环

不能设为0~128的任意数,因为如果是控制LED,这样的编码可以使同时只有一个灯亮,并8个灯循环亮,而如果不是2的次幂,比如7
二进制是00000111,那么此时就会同时有三个灯亮
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网