P1口的为什么不能实现从右到左再从左往右的往复闪烁

2019-07-16 04:07发布

#include <REG51.H>
#include <intrins.h>
char num,key;
void main()
{
char QS;
TMOD=0X01;   //选择定时/计数器以方式1工作(16位)
TH0=15536/256;  //装初值定时器中断一次为50ms
TL0=15536%256;
EA=1;    //开启总中断允许
ET0=1;    //开启定时器0终端允许
TR0=1;    //开启定时/计数器
QS=0Xfe;   //给P0口赋初值1111 1110
while(1)
{
  P1=QS;
  switch(key)
   {

    case 0:
   
     if(num>=10)
      {
       num=0;
       QS=_crol_(QS,1);//循环左移
       if(QS==0x7f)    //QS=0111 1111
       key=1;   
      }
      break;
   
  
    case 1:
   
     if(num>=10)
      {                                                                                                      
       num=0;
       QS=_cror_(QS,1); //循环右移
       if(P1==0xfe)  //QS=1111 1110
       key=0;
      }
      break;
     
   }
}   
}
void zhongduan() interrupt 1
{
TH0=15536/256;
TL0=15536%256;
num++;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
伏尔加的鱼
1楼-- · 2019-07-18 09:04
ltp217 发表于 2012-10-29 15:04
第一次循环之后key的值为1了,进行第二次循环时进入case 1中了

嗯  ,是的,仿真后可以知道的,就是不知道怎么跳出来,但是把case 1:中的if(QS==0...中的QS改为P1就正常了
伏尔加的鱼
2楼-- · 2019-07-18 13:09
h414984185 发表于 2012-10-29 22:01
不好意思,我刚才看错了,不是if(num>=10)这里出错,大意了,呵呵

我后来调试的时候把你所说的哪个if(QS=0X7E)这里的QS改为P0就没事了,不过还没分析出来为什么
badoudingxin
3楼-- · 2019-07-18 18:04
没有原理图啊,那不好分析啊
879662894
4楼-- · 2019-07-18 20:53
lp1128
5楼-- · 2019-07-18 22:10
 精彩回答 2  元偷偷看……
西伯利亚狼狼
6楼-- · 2019-07-19 03:24
h414984185 发表于 2012-10-29 22:01
不好意思,我刚才看错了,不是if(num>=10)这里出错,大意了,呵呵

一周热门 更多>