流水灯实现
1. 分步赋值法(数组赋值)
原理:
分步点亮
P3口点亮一个LED后,延迟一段时间,再点亮下一个LED,延迟,以此类推,循环显示8个LED
- 创建数组,保存点亮LED0~7的8种状态
unsigned char code Buffer[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- 延时函数
void delay()//延时
{
unsigned char x,y,z;
for(x=0;x<20;x++)
{
for(y=0;y<200;y++)
{
for(z=0;z<200;z++);//分号必须有
}
}
}
-
流水灯代码
- 最笨的代码
void main() { P3M0=0;//配置标准输出 P3M1=0; while(1) { P3=Buffer[0]; delay(); P3=Buffer[1]; delay(); P3=Buffer[2]; delay(); P3=Buffer[3]; delay(); P3=Buffer[4]; delay(); P3=Buffer[5]; delay(); P3=Buffer[6]; delay(); P3=Buffer[7]; delay(); } }
- 简化代码
void main()
{
unsigned char i;//unsigned位置必须在配置输出模式之上,否则会报错
P3M0=0;//配置标准输出
P3M1=0;
while(1)
{
for(i=0;i<8;i++)
{
P3=Buffer[i];
delay();
}
}
2. 变量的左移和右移
利用左移语句,实现P3口LED挨个点亮
原理:
void main()
{
P3M0=0;//配置标准输出
P3M1=0;
P3=0xfe;
while(1)
{
delay();
P3=P3<<1;
}
}
利用右移语句,实现P3口LED挨个灭掉
void main()
{
unsigned char LED=0x7f;
P3M0=0;//配置标准输出
P3M1=0;
while(1)
{
P3=LED^0xff;
delay();
LED=LED>>1;
}
}
3. 变量的循环左移和右移
原理:
利用intrins.h 文件中的
\_cror\_();
(8位) 、\_iror\_();
(16位) 实现循环右移
void main()
{
unsigned char LED=0x7f;//先让变量赋值0x7f
P3M0=0;//配置标准输出
P3M1=0;
while(1)
{
P3=LED;//data
delay();
LED=_cror_(LED,1);//被移动变量和移动步数
}
}
注意:
不要如下写代码:
void main()
{
P3=0x7f;
P3M0=0;//配置标准输出
P3M1=0;
while(1)
{
delay();
P3=_cror_(P3,1);
}
}
P3口是特殊功能寄存器,外界(旋转编码器)可以直接修改值,容易造成错误输出
新开内存单元储存变量LED,它的储存位置在data,可以直接寻址,将LED赋值给P3