初学者请教,单片机八个流水灯,最后一个一直亮,然后从第一个等开始亮往左移,然后第一第二颗等亮往左移,以此类推。最后个灯永
远亮
初学者请教,单片机八个流水灯,最后一个一直亮,然后从第一个等开始亮往左移,然后第一第二颗等亮往左移,以此类推。最后个灯永
#include <REGX51.H>
void delayms(unsigned int n);
void main()
{
unsigned char temp = 0x7e;
while(1)
{
P2 = temp;
delayms(500);
temp = (temp << 1) ^ 129;
if(temp == 0xff)
temp = 0x7e;
}
}
void delayms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
{
for(j=110;j>0;j--);
}
}
这是低电平点亮,原理图如下
1.自定义函数delayms( );是用于延时。
2.根据题目可知,灯的初始状态为:亮、灭、灭、灭、灭、灭、灭、亮,所对应的P2口二进制表示为:01111110,十六进制表示为:0x7e。所以在while循环外先定义一个unsigned char类型的变量为0x7e。
3.while循环中,先让P2=变量temp,再通过改变temp的值来改变灯的状态,使灯达到一个流水灯的效果。temp = (temp << 1) ^ 129;的意义是temp=01111110 左移一位后,与10000001进行异或运算——相同为0,不同为1。例如一开始的01111110左移一位后变为11111100,再与10000001进行异或运算得到0111101,也就是达到了第一个灯向第二个灯移动的效果。之后依次类推。
4.当灯移动到第七个的位置为亮时,我们需要将其进行左移和异或运算后的值改为初始值,以长久达到流水灯的效果。也就是if(temp == 0xff) temp = 0x7e;这一步。