C语言查询按键控制8个流水灯

C语言查询按键控制8个流水灯

一.仿真电路图

在这里插入图片描述
注意发光二极管的方向以及接的电阻的大小。

二.C语言代码

/****************************************************************************&
&函数功能:用AT89C51实现左右开花和左移右移的流水灯,以及一个数码管显示		 &
&端口说明:P0口控制数码管显示,P1口控制八个发光二极管,P3.0和P3.1控制两个按键(3.1没用到)&
*****************************************************************************/

#include"AT89X51.h"	//头文件包含声明,以下程序中的端口P0、P1、P3_0和P3_1等的说明都包含在该文件中


  unsigned char  denmabiao[]={0xe7,0xdb,0xbd,0x7e};	//左右开花流水灯码表

/*******延时函数******/
void delay(void)
{
	unsigned int  i,j;
	for(i=0;i<50;i++) 	 //双重循环实现延时,循环时间的长短可以通过修改50或2000的值来改变
 	for(j=0;j<2000;j++);
}


/*******开花流水灯*******/
void kaihua(void)  
{      
	unsigned char  i; //定义循环变量
	for(i=0;i<4;i++)	  //循环语句,通过查表实现开花流水灯
	{
		P1=denmabiao[i];  //将相应的表值送到P1口
		delay();		  //延时
    }
}

/*注意*——左移和右移并不是绝对的,硬件中灯的摆放不同,移的方向也会不同***/
/******右移流水灯******/
void right(void)
{
	unsigned char data i; //定义循环变量
	unsigned char  a;
    a=0x7f;			      //右边第一个灯亮 01111111
    for(i=0;i<8;i++)	  //从右边起,第二个到第八个灯亮
	{   
       	P1=a;
    	delay();		  //适当延时?
	    a=(a>>1)+0x80;    //向右移一位再与0x80位于,以保证每次只有一个灯被点亮	00111111+10000000=10111111
	}
}

/****左移流水灯****/
void left(void)
{
	unsigned char data i; //变量定义
	unsigned char  a;
    a=0xfe;			   //左边第一个灯亮
  
    for(i=0;i<8;i++)	   //从左边起,第二个到第八个灯亮
	{
		P1=a;
		delay();		   //适当延时,以避免乱码
		a=(a<<1)|0x01;   //向左移一位再与0x01位于,以保证每次只有一个灯被点亮
    }
}

/******主函数*****/
void main(void)
{
	char x=0;
	while(1) 				  //无限循环,以保证只要一上电,系统一直运行0.1.2
   { 
		if(P3_0==0)
		{	
			x=x+1;
			while(!P3_0);
			if(x==3)
				x=0;
		}
		if(x==0)
			kaihua();
		else if(x==1)
			left();
		else
			right();
	}
} 

使用的工具:keil c 、proteus

  • 12
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值