实现的功能如下:
做三个按键
第一个按键八个灯做呼吸
第二个按键按下八个灯,依次点亮,依次熄灭
第三个按键按下八个灯一起闪,亮两秒灭一秒
.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 ;
}