我这是用指针做了一个流水灯 用的定时器进行延时1S 可是没调试成功
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
void shiftleft(unsigned char *p);
void main()
{
unsigned int i=0;
unsigned char buf=0x01;
TMOD = 0X01;
TH0 = 0XFC;
TL0 = 0X67;
TR0 = 1;
ENLED = 0;
ADDR3 = 1;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
while(1)
{
P0=~buf;
for(i=0;i<40000;i++);
while(1)
{
if(TF0 ==1)
{
TF0 = 0;
TH0 = 0XFC;
TL0 = 0X67;
i++;
if(i==1000)
{
i=0;
}
break;
shiftleft(&buf);
}
}
if(buf == 0)
{
buf= 0x01;
}
}
}
void shiftleft(unsigned char *p)
{
*p = *p <<1;
}
OK, 用for延时写出来是OK的,那说明,你的控制代码和实现led流水的部分是OK的; 其实看你的中断程序觉得有些混乱,接下来,去分析下,正确的中断延时该怎么去写; 小编,不急,基础这个东西就是满满积累的,这个部分,一点点的去查自己的问题,然后修正,会收获更多,我就不举例子了,只给小编参考的一些方向,期待小编一点点的独立解决此问题。
延时用中断写的, 直接用for 循环的方式延时,小编试过吗? 结果怎么样? 个人觉得是这里中断延时的写法有错误。
*p = *p <<1; 小编你查过优先级吗?
break; 是干什么用的?
跳出这个while循环
这个倒没有 这是写了一个指针进行的是左移操作
在这里我将定时器写在循环里面 每次都去判断间隔1s 这个原来的写法就是用的for非精确延时 结果是没有问题的 在这里我的思路是将原来的for非精确延时改写成精确延时 这样我就理不清楚了 求指教啊 刚开始学习单片机 c语言学的也不扎实 问题很多
break后面的语句执行不到啊?这个是你要的结果吗?
我刚开始接触这个 有点不太明白 还望大神指导
while(1)弄好了
{
P0=~buf;
if(TF0 ==1)
{
TF0 = 0;
TH0 = 0XFC;
TL0 = 0X67;
i++;
if(i==1000)
{
i=0;
shiftleft(&buf);
}
}
if(buf == 0)
{
buf= 0x01;
}
}
}
void shiftleft(unsigned char *p)
{
*p = (*p) <<1;
}
跳出直接往下执行啊
我先看看哈, 许久不弄这些有些生疏了。
呵呵,学习看看!
咋啦 我刚刚学习单片机 我就是虚心学习一下 看不懂程序 呵呵是啥个意思?