AT89C52 KEIL Proteus 按键 呼吸灯 LED 闪烁

实现的功能如下:

做三个按键
第一个按键八个灯做呼吸
第二个按键按下八个灯,依次点亮,依次熄灭
第三个按键按下八个灯一起闪,亮两秒灭一秒

 .c代码

#include "main.h"

char Huxideng_Flash = 0;
int Huxideng_Count;

int LED_ON_OFF_Count =0;
unsigned char arry_num =0;
unsigned char LED []={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff };

unsigned char Shanshuo_Count =0;		

unsigned char key_num = 0;							  
unsigned char key_run = 0;
					  
void main()
{
	Timer0Init();
	while(1)
	{	 	  
	 key_run_function();
	}
}

void Timer0_Routine() interrupt 1
{
	TL0 = 0xB0;				//设置定时初始值 50ms
	TH0 = 0x3C;				//设置定时初始值
	
	Shanshuo_Count ++;
	
	LED_ON_OFF_Count++;     //依次点亮,依次熄灭
	
	//呼吸灯
	if(Huxideng_Count>=20)
		Huxideng_Flash = 1;
	else if ( Huxideng_Count<= 0 )
		Huxideng_Flash = 0;
	else ;
	
	if( Huxideng_Flash == 0 )
	{
		Huxideng_Count++;
	}
	else if ( Huxideng_Flash == 1 )
	{
		Huxideng_Count--;
	}	
}

.h代码

#ifndef __MAIN_H__
#define __MAIN_H__

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
#include "huxideng.h"
#include "LED_ON_OFF.h"
#include "shanshuo.h"
#include "Key.h"

extern int Huxideng_Count;
extern int LED_ON_OFF_Count  ;
extern unsigned char arry_num  ;
extern unsigned char LED [];

extern unsigned char Shanshuo_Count ;	

extern unsigned char key_num ;							  
extern unsigned char key_run ;

#endif

仿真图

题目解析:

1呼吸灯--在定时器(每50ms进入一次),进入20次为一个循环,也就是1s,由暗到亮。再通过20,由亮到暗。

huxideng.c代码

#include "main.h"
void huxideng(void)
{
  static unsigned char number = 0;
		number++;
		if( number > 20 )
			number = 0;
		
		if( number <Huxideng_Count )
			P2 =  0X00;
		else
			P2= 0xff;
}

2依次点亮,依次熄灭-- 在定时器(每50ms进入一次),每500ms,跟数组++

LED_ON_OFF.c代码

#include "main.h"

void LED_ON_OFF(void)
{
		if(LED_ON_OFF_Count>=10)
		{
			LED_ON_OFF_Count = 0;
			P2=LED [arry_num++];
			
			if( arry_num>=16 )
			{
				arry_num = 0;
			}
		}
}

3亮两秒灭一秒-- 在定时器(每50ms进入一次),前俩秒亮后两秒灭

shanshuo.c 代码

#include "main.h"

void shanshuo()
{
		if( Shanshuo_Count <= 40 )
			P2 = 0X00;
		else if ( Shanshuo_Count <= 60 )
			P2 = 0XFF;
		else
			Shanshuo_Count = 0;
}

4按键+按键实现的的功能函数

key.c代码

#include <REGX52.H>
#include "Delay.h"
#include "main.h"

/**
  * @brief  获取独立按键键码
  * @param  无
  * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
  */
unsigned char Key()
{
	unsigned char KeyNumber=0;
	
	if(P31==0){Delay(2);while(P31==0);Delay(2);KeyNumber=2;}
	if(P30==0){Delay(2);while(P30==0);Delay(2);KeyNumber=1;}
	if(P32==0){Delay(2);while(P32==0);Delay(2);KeyNumber=3;}
	if(P33==0){Delay(2);while(P33==0);Delay(2);KeyNumber=4;}
	
	return KeyNumber;
}

void key_run_function()
{
		key_num = Key();
		if( key_num != 0 )
		{
			key_run = key_num;
		}
		
		if( key_run == 1 )
		{
			huxideng();
		}
		else if ( key_run == 2 )
		{
			LED_ON_OFF();
		}
		else if ( key_run == 3 )
		{
			shanshuo();
		}
		else ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值