单片机跑马灯C语言程序问题 急.....
我知道用_crol_函数比较简单,但是想知道用<<和>>怎么做跑马灯程序:#include<reg51.h>unsignedcharL;voiddelay(unsigne...
我知道用_crol_函数比较简单,但是想知道用<< 和>> 怎么做
跑马灯程序:
#include<reg51.h>
unsigned char L;
void delay(unsigned int ms){
unsigned char i;
unsigned int j;
for(j=0;j<ms;j++){
for(i=0;i<60;i++){
;
}
}
}
main()
{
unsigned char k;
P1=0xFF;//全亮
delay(100);
P1=0x00;//全灭
delay(100);
while(1)
{
P1=0x01;
delay(100);
for(k=0;k<8;k++)
{
P1=P1<<1;
delay(1000);
}
P1=0x80;
delay(2000);
for(k=0;k<8;k++)
{
P1=P1>>1;
delay(1000);
}
}
}
这个是实验书上的程序,有三个地方不懂....
单片机不应该是低电频灯亮么 为嘛P1=0xFF;//全亮 FF二进制是11111111 即全部都是高电平 灯不应该全灭吗?
后面的<< 运算符什么意思 位左移?P1=P1<<1;这个的意思是 P1的二级制值00000001位左移 变成00000010后再赋值给P1吗
P1=P1>>1; 这个地方有点不懂 前面是 轮流点亮了七次灯并保持,然后P1=0x80;这个是点亮第八个灯并保持。后面接这个for循环什么意思?看不懂它到底怎么循环的亮的。
简单些表述哈,刚学习C语言和单片机,复杂的看不懂。谢谢!! 解决问题 加100悬赏答谢! 展开
跑马灯程序:
#include<reg51.h>
unsigned char L;
void delay(unsigned int ms){
unsigned char i;
unsigned int j;
for(j=0;j<ms;j++){
for(i=0;i<60;i++){
;
}
}
}
main()
{
unsigned char k;
P1=0xFF;//全亮
delay(100);
P1=0x00;//全灭
delay(100);
while(1)
{
P1=0x01;
delay(100);
for(k=0;k<8;k++)
{
P1=P1<<1;
delay(1000);
}
P1=0x80;
delay(2000);
for(k=0;k<8;k++)
{
P1=P1>>1;
delay(1000);
}
}
}
这个是实验书上的程序,有三个地方不懂....
单片机不应该是低电频灯亮么 为嘛P1=0xFF;//全亮 FF二进制是11111111 即全部都是高电平 灯不应该全灭吗?
后面的<< 运算符什么意思 位左移?P1=P1<<1;这个的意思是 P1的二级制值00000001位左移 变成00000010后再赋值给P1吗
P1=P1>>1; 这个地方有点不懂 前面是 轮流点亮了七次灯并保持,然后P1=0x80;这个是点亮第八个灯并保持。后面接这个for循环什么意思?看不懂它到底怎么循环的亮的。
简单些表述哈,刚学习C语言和单片机,复杂的看不懂。谢谢!! 解决问题 加100悬赏答谢! 展开
展开全部
1、LED是高电平亮还是低电平亮,取决于你的电路设置,如果LED负极接地(或者串电阻再接地),则高电平时亮。
2、P1=P1<<1;你的理解是对的。
3、P1=P1>>1;就是右移,比如现在是0x80,接P1的第7位对应灯亮,下次右移就变成0x40,接P1的第6位对应灯亮.
4、两个for循环,第一个是从P1的第0位至第7位轮流显示,第二个for则反过来。
2、P1=P1<<1;你的理解是对的。
3、P1=P1>>1;就是右移,比如现在是0x80,接P1的第7位对应灯亮,下次右移就变成0x40,接P1的第6位对应灯亮.
4、两个for循环,第一个是从P1的第0位至第7位轮流显示,第二个for则反过来。
追问
谢谢! 意思是 第一个for循环是轮流从0~7依次点亮八个灯。然后反过来7~0再亮一次 依次循环 并不是 一直0~7这么轮流亮的对吧。
追答
目前程序是轮流单个点亮
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
输出低电平灯亮还是输出高电平灯亮 和你电路设计有关
在这个例子里面 很明显是低电平灯亮的
<<是逻辑左移位运算 你的理解是正确的 00000001 左移一位之后就是00000010
从P1=0x80开始是新一轮循环 如果说第一个循环是从左到右的话 那么这个循环就是从右到左了
也就是P1的值是 0x80 0x40 0x20 0x10 0x08 0x04 0x02 0x01这样变化的 正和上一个循环相反
在这个例子里面 很明显是低电平灯亮的
<<是逻辑左移位运算 你的理解是正确的 00000001 左移一位之后就是00000010
从P1=0x80开始是新一轮循环 如果说第一个循环是从左到右的话 那么这个循环就是从右到左了
也就是P1的值是 0x80 0x40 0x20 0x10 0x08 0x04 0x02 0x01这样变化的 正和上一个循环相反
更多追问追答
追问
那如果我不想要反过来呢 直接再重头开始 要怎么写呢? 直接删掉P1=P1>>就可以了吗?
追答
P1=0x80;
delay(2000);
for(k=0;k>1;
delay(1000);
}
这几句都删掉就可以了
其实就是把上一个过程循环执行
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询