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++;
}
#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就没事了,不过还没分析出来为什么
没有原理图啊,那不好分析啊
看看
没有延时你闪个屁