04-流水灯实现

流水灯实现

1. 分步赋值法(数组赋值)

原理:

分步点亮

P3口点亮一个LED后,延迟一段时间,再点亮下一个LED,延迟,以此类推,循环显示8个LED

  • 创建数组,保存点亮LED0~7的8种状态

image-20210820103744037

image-20210820104423011

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挨个点亮

原理:

image-20210820155505567

void main()	
{	
	P3M0=0;//配置标准输出
	P3M1=0;
		
	P3=0xfe;
	
	while(1)
	{
		delay();
		P3=P3<<1;
	}	
}

利用右移语句,实现P3口LED挨个灭掉

image-20210820161634588

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位) 实现循环右移

image-20210820163810412

image-20210820163607822

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

image-20210820163518125

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值