微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > P1口的为什么不能实现从右到左再从左往右的往复闪烁

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

时间:10-02 整理:3721RD 点击:
#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++;
}

第一次循环之后key的值为1了,进行第二次循环时进入case 1中了

解决了没

没必要写这么复杂,用数组就可以了

程序有很多错误嘛

忘记加延时了!

这儿有个现成的参考一下
花样流水灯程序
http://bbs.elecfans.com/forum.ph ... 1&fromuid=89414

是if(num>=10)这里错啦,因为num>=10的时候,if(QS==0x7e)这一句不可能成立,即是说key的值一直都是0,所以不会往复循环闪烁;把if(num>=10)改成if(num>7)就行啦!小编刚学C语言不久吧,思路是对了,不过不够直观,很多地方一不小心还真以为你写错了,还有待提高
还有:程序中反复调用的固定值尽量少用乘除法如:TH0=15536/256;TL0=15536%256;因为乘除法很耗费资源,那两句最好改成TH0=60;TL0=176;

不好意思,我刚才看错了,不是if(num>=10)这里出错,大意了,呵呵

不好意思,我刚才看错了,不是if(num>=10)这里出错,大意了,呵呵

谢谢

用的是定时器

嗯  ,是的,仿真后可以知道的,就是不知道怎么跳出来,但是把case 1:中的if(QS==0...中的QS改为P1就正常了

我后来调试的时候把你所说的哪个if(QS=0X7E)这里的QS改为P0就没事了,不过还没分析出来为什么

没有原理图啊,那不好分析啊

看看

没有延时你闪个屁

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top