51单片机流水灯左移右移程序(51单片机流水灯左移右移程序汇编)
单片机流水灯实现3个LED同时亮 先左移动,向有移动.
#includereg51.h
#define uchar unsigned char
uchar num;
sfr led=P0;
sbit speaker=P1^0;
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i120;i++);
}
main()
{
uchar i;
while(1)
{
for(i=0;i3;i++)
{
led=0xf0;
delay(200);
clr speaker;
led=0xff;
delay(200)
setb speaker;
for(i=0;i3;i++)
{
led=0x0f;
delay(200);
clr speaker;
led=0xff;
delay(200)
setb speaker;
}
for(i=0;i2;i++)
{
led=0x00;
delay(200);
clr speaker;
led=0xff;
delay(200)
setb speaker;
}
}
51 单片机一个左右同时向中间流动的流水灯,keil编译通过,就是实现不了。这是为什么?
逻辑错误了,把两个while中的相等改为不相等:
a=0xfe; //放到循环之前就可以了 低电平亮??
P1 = a; //加一行,起始亮这个灯
while(1)
{
while(a!=0x7f) //主要错误 while(a==0x7f)
{
//P1=0xfe; //错误
//a=P1; //错误
delayms(500);
a=_crol_(a,1);
P1 = a; //加在这里
}
while(a != 0xfe) //主要错误 while(a==0xfe)
{
delayms(500);
a=_cror_(a,1);
P1=a;
//delayms(500);//放到前面一点点
}
}
//上面这段改完也不是两边同时向中间流水,只是左到右,左到右的来回流水灯
两边向中间流水,直接用查表法,
//11111111B, 01111110B, 10111101B, 11011011B, 11100111B
uchar MB[]={0xFF, 0x7E, 0xBD, 0xDB, 0xE7};
uchar i=0;
while(1)
{
P1 = MB[i++];
if(i=5) i=0;
delayms(500);
}
单片机 移位操作 右移 C语言
先说第一个问题:
比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。
再说第二个问题:
比如说从p1.0口发送出去,则可以写为
sbitout=p1^0;//定义out为p1.0口,这样今后好写程序
chari;
for(i=0;i8;i++)
{
out=data0x80;//因为高位在前,将它写成二进制就明白了
data=1;
}
上面的程序就能搞定了;
应该是所有的单片机都有cy位(不知道浮点dsp有没有);
c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是