实验室考核————交通灯控制器(红绿灯)

0x00 前言

  学校实验室的阶段测试,是一个交通灯控制器,开始感觉貌似不太难,但是搞着搞着,发现情况不对,还是出现了些问题的(可能还是我菜),这周六中午放的题,下午,把大框搭好了,然后身体就开始不舒服(得好好锻炼身体了),等周日中午,感觉好一些了,继续完善了一下,开始调bug,,等晚上差不多了,就交了。有些可惜的是RCTF就在这两天,没参加上,等复现了。

笔者水平有限,但是还是分享一下。

 

0x01 题目

有一说一,第一眼看到题目时我是懵的,拓展里的1,2,3条我没看懂,没关系,还给了一个仿真图,我们来和仿真结合分析一下

仿真:

很清晰,不过,有些小错误,貌似没有绿灯,最后通过询问,我把D3,D6设为绿灯。

分析:

基础要求:

为了满足要求在循环播放时为:

       A路:绿灯(10s)--->  黄灯 (闪烁4s)---> 红灯(10s)--->黄灯(闪烁4s)
       B路:绿灯(10s)--->  黄灯 (闪烁4s)---> 红灯(10s)--->黄灯(闪烁4s)

紧急按键,是中断0。

       当按下“紧急车辆”按钮,马上红灯(4s)。

(基础要求很好理解)

拓展要求:

1. 当按下A路检查,或B路检测,就代表A,B路来车了

2. 当在绿灯时,两路车都有车,就循环放行:首先A路绿灯,同时B路红灯;之后交换A路红灯,同时B路绿灯。

3.当只有一路车,且绿灯积累10s后,若另一路没有车,就继续放行,这里,的继续放行概念很模糊,这里我设置成:如果进入这种情况,数码管将  黑屏,且继续放绿灯,当另一路来车时,数码管退出黑屏。然和进入两路都有车的情况。

4. 修改没啥可说的,需要注意的,就是,所有的数字要用变量代替。

 

0x02 基础要求

先把 延时写上:

void Delay(u16 t)		
{
	while(t--);
}

数码管显示:

这个时候注意,因为在拓展要求时要进行修改还有需要的黑屏,所以数码管的显示一共有5种显示

1. 正常

2.放行时间修改模式

3.黄灯时间修改模式

4.紧急时间修改模式

5.黑屏

我们用一个变量 model来选择:

u8 code Duanxuan[]={                       //????
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8  WE[]={0x00,0x00,0x00,0x00};   //位选                       				
u16 numA=10, numB=10;		  //数码管的显示数字
u8 emergency_t = 4;	          //紧急时间
u8 Red_A_T = 10,Green_A_T = 10, Yellow_A_T =4;//A红绿灯
u8 Red_B_T = 10,Green_B_T = 10, Yellow_B_T =4;//B红绿灯
u8 model = 0;                     //用来判断修改哪个时间		

void display(void)
{
	static unsigned char i = 0;
	
	P0 = 0xff;

	P3 = (0x10 << i) | 0x04;
	
	P0 = WE[i++];

	i %= 4;
}
void SMC_show(void)
{

	if(model == 0)//正常
	{
	         WE[0] = ~Duanxuan[numA/10];
	         WE[1] = ~Duanxuan[numA%10];
	         WE[2] = ~Duanxuan[numB/10];
	         WE[3] = ~Duanxuan[numB%10];
	}
	 else if(model == 1)//放行
	{
		WE[0] = ~Duanxuan[Green_A_T/10];
		WE[1] = ~Duanxuan[Green_A_T%10];
		WE[2] = ~Duanxuan[Green_B_T/10];
		WE[3] = ~Duanxuan[Green_B_T%10];
		
	}
	else if (model == 2)//黄
	{
		WE[0] = ~Duanxuan[Yellow_A_T/10];
		WE[1] = ~Duanxuan[Yellow_A_T%10];
		WE[2] = ~Duanxuan[Yellow_B_T/10];
		WE[3] = ~Duanxuan[Yellow_B_T%10];
	}
	else if (model == 3)//紧急
	{
                WE[0] = ~Duanxuan[emergency_t/1000];
		WE[1] = ~Duanxuan[emergency_t/100%10];
		WE[2] = ~Duanxuan[emergency_t/10%10];
		WE[3] = ~Duanxuan[emergency_t%10];
		}
	else if (model == 4)//黑屏
	{
                WE[0] = ~Duanxuan[16];
		WE[1] = ~Duanxuan[16];
		WE[2] = ~Duanxuan[16];
		WE[3] = ~Duanxuan[16];
	}
}					

用定时器进行倒计时 && 黄灯闪烁:

void Service_T0(void) interrupt 1
{
	TH0 = (65535-50000) / 256;
	TL0 = (65535-50000) % 256;

	if(count++ >= 20)
	{
		if(emergency == 0 && signle == 0 && both == 0 && ((come_a == 1 && come_b == 0) || (come_a == 0 && come_b == 1)) && (LedA_Select%4 ==0 || LedB_Select%4 ==0))

		count_change_t++;
		
		if(model == 0)
		{
			numA--;
			numB--;
		}
		
		count = 0;
	}
	
	//==利用定时 黄灯闪烁
	if(LedA_Select%4 == 1 && emergency == 0)
	{
		LED_A_Y = ~LED_A_Y;
	}
		if(LedB_Select%4 == 1 && emergency == 0 )
	{
		LED_B_Y = ~LED_B_Y;
	}
	if(LedA_Select%4 ==3  && emergency == 0)
	{
		LED_A_Y = ~LED_A_Y;
	}
		if(LedB_Select%4 == 3 && emergency == 0 )
	{
		LED_B_Y = ~LED_B_Y;
	}
}

里面有一个 判断count_change_t这变量的条件,在下文会说

判断两灯之间的转换

用Led_Select来判断到底是什么灯

sbit LED_A_G = P1^0;
sbit LED_A_Y = P1^1;
sbit LED_A_R = P1^2;
sbit LED_B_R = P1^3;
sbit LED_B_Y = P1^4;
sbit LED_B_G = P1^5;

if(emergency == 0 && (both == 0 || signle == 0))//当拓展情况下,正常模式下的交替停止
	{
		if(numA == 0)
		{
			LedA_Select++;
			switch(LedA_Select%4)
			{
				case 0://Â̵Æ
					numA = Green_A_T;
					LED_A_G=0;
					LED_A_R=1;
					LED_A_Y=1;
				break;
				case 1://»ÆµÆ
					numA = Yellow_A_T;
					LED_A_Y= 0;
					LED_A_G = 1;
					LED_A_R=1;
					break;
				case 2://ºìµÆ
					numA = Red_A_T;
					LED_A_R = 0;
					LED_A_Y= 1;
					LED_A_G=1;
					break;
				case 3://»ÆµÆ
					numA = Yellow_A_T;
					LED_A_Y= 0;
					LED_A_G = 1;
					LED_A_R=1;
					break;
			}
		}
		
		if(numB == 0)
		{
			LedB_Select++;
			switch(LedB_Select%4)
			{
				case 0://Â̵Æ
						numB = Green_B_T;
					LED_B_Y=1;
					LED_B_G=0;
					LED_B_R=1;
				
				break;
				case 1://»ÆµÆ
					numB = Yellow_B_T;
					LED_B_R=1;
					LED_B_G=1;
					LED_B_Y=0;
					break;
				case 2://ºìµÆ
					numB = Red_B_T;
					LED_B_R=0;
					LED_B_Y=1;
					LED_B_G=1;
					break;
				case 3://»ÆµÆ
					numB = Yellow_B_T;
					LED_B_G=1;
					LED_B_Y=0;
					LED_B_R=1;
					break;
			}
		}
	}

 

紧急情况:

为了保证紧急情况后可以复原,需要设置变量暂存当时的数码管数字,灯的颜色,因为由Led_Select不会改变,所以,需要再次用这个变量来还原灯

void Service_INT0() interrupt 0
{
	emergency = 1;
	temp_numA = numA;//ÔÝ´æ
	temp_numB = numB;//ÔÝ´æ
	numA = emergency_t;
	numB = emergency_t;
	LED_A_G = 1;
	LED_A_Y = 1;
	LED_A_R = 0;
	LED_B_R = 0;
	LED_B_Y = 1;
	LED_B_G = 1;
}

else if(emergency == 1 && numA == 0 && numB == 0) 
	{
		numA = temp_numA;
		numB = temp_numB;
		//ÏȹØÉÏ£¬ÈÃLED_SelectÈ¥ÅжÏÔ­À´ÎªÊ²Ã´µÆ
		emergency = 0;
		LED_A_G = 1;
		LED_A_Y = 1;
		LED_A_R = 1;
		LED_B_R = 1;
		LED_B_Y = 1;
		LED_B_G = 1;
				
		
		switch(LedA_Select%4)
		{
			case 0://Â̵Æ
				LED_A_Y=1;
				LED_A_G=0;
				LED_A_Y=1;
			break;
					
			case 1://»ÆµÆ
				LED_A_R=1;
				LED_A_Y= 0;
				LED_A_G = 1;
			break;
			case 2://ºìµÆ
				LED_A_G=1;
				LED_A_R = 0;
				LED_A_Y= 1;
			break;
			case 3://»ÆµÆ
				LED_A_G=1;
				LED_A_Y= 0;
				LED_A_R = 1;
			break;
		}
						
		switch(LedB_Select%4)
		{
			case 0://Â̵Æ
				LED_B_Y=1;
				LED_B_G=0;
				LED_B_R=1;
			break;
			case 1://»ÆµÆ
				LED_B_R=1;
				LED_B_G=1;
				LED_B_Y=0;
			break;
			case 2://ºìµÆ
				LED_B_G=1;
				LED_B_R=0;
				LED_B_Y=1;
			break;
			case 3://»ÆµÆ
				LED_B_G=1;
				LED_B_R=1;
				LED_B_Y=0;
			break;
		}
	}

 

0x03 拓展要求

先把按键写好,当按下“A路检测”,“B路检测”则代表车来了,come_a, come_b置1,

然后通过上述的model变量来判断到底是修改什么时间

按键函数:

sbit Key_set = P2^0;		//设置按键用来改变model											
sbit Key_up = P2^1;		//增加												
sbit Key_down = P2^2;		//减少											
sbit Key_A = P2^3;		//A路检测												
sbit Key_B = P2^4;	        //B路检测
													
void key(void)//
{
	if(Key_set == 0)
	{
		Delay(100);
		if(Key_set == 0)
		{
			if(model++ == 3)
			model = 0;
		}
		while(Key_set == 0);
	}
	
	if(Key_up == 0)
	{
		Delay(100);
		if(Key_up == 0)
		{
			switch (model)
			{
					case 1:
					 Green_A_T++;
					 Green_B_T++;
					break;
									
					case 2:
					 Yellow_A_T++;
					 Yellow_B_T++;
					break;
									
					case 3:
					 emergency_t++;
					break;
			}
	  }
		while(Key_up == 0);
	}

	if(Key_down == 0)
	{
		Delay(100);
		if (Key_down == 0)
		{
				
			 switch (model)
			 {
					case 1:
						
					if(Green_A_T > 0)//Òª±È0´ó
						Green_A_T--;
					if(Green_B_T > 0)
						Green_B_T--;
					break;
						
					case 2:
						if(Yellow_A_T > 0)
						Yellow_A_T--;
						if(Yellow_B_T > 0)
						Yellow_B_T--;
					break;
						
					case 3:
						if(emergency_t>= 4)//½ô¼±time>=4
						emergency_t--;
					break;
					}
		  }
		while(Key_down == 0);
	 }
		
	if(Key_A == 0)
	{
		Delay(100);
		if (Key_A == 0)
		{
				come_a = 1;
		}	
		while(Key_A == 0);
	}
				
	if(Key_B == 0)
	{
		Delay(100);
		if (Key_B == 0)
		{
				come_b = 1;
		}	
		while(Key_B == 0);
	}
}

 拓展要求函数

1. 两路都有车

当两路同行,且a,b都来车,就先把此时的B灯时间暂存,将B灯时间等于A灯时间,然后A路绿灯b路红灯,当时间减到0后,将come_A置0,将暂存的B灯放回B灯,再将A灯时间等于B灯时间,然后A路红灯b路绿灯,当时间减到0后,come_B置0。当两者都是0时,轮流结束。

需要注意的是当循环后直接跳到黄灯

if(come_a == 1 && come_b == 1 && LedB_Select%4== 0 && LedA_Select%4 == 0)
	{
		signle = 0;
		model= 0;
		if(both == 0)
		{
			both = 1;
			LED_A_G = 0;
			LED_A_Y = 1;
			LED_A_R = 1;
			LED_B_R = 0;
			LED_B_Y = 1;
			LED_B_G = 1;
			
			temp_numB = numB;
			numB = numA;
			
		}
	}
		if(both == 1)
		{
			if(numA == 0 && come_a != 0)
			{
				LED_A_G = 1;
				LED_A_Y = 1;
				LED_A_R = 0;
				LED_B_R = 1;
				LED_B_Y = 1;
				LED_B_G = 0;
				
				numB= temp_numB;
				numA= numB;
				//====================
				come_a = 0;

			}
			if (numB == 0 && come_a == 0)
			{	
				LED_A_G = 1;
				LED_A_Y = 1;
				LED_A_R = 1;
				LED_B_R = 1;
				LED_B_Y = 1;
				LED_B_G = 1;
				come_b = 0;
			}
                        if((come_a == 0 && come_b == 0))
			{
				both = 0;
				
				numA = 0;
				numB = 0;
				LedA_Select = 0;
				LedB_Select = 0;
				
				LED_A_G = 1;
				LED_A_Y = 1;
				LED_A_R = 1;
				LED_B_R = 1;
				LED_B_Y = 1;
				LED_B_G = 1;
			}
		}

 

一路有灯且绿灯10s

需要利用定时器积累10s,

条件

1. 不是紧急模式

2. 不是轮流模式

3. 只有一路同行,要么A路,要么B路,

4. 且是绿灯

if(emergency == 0 && signle == 0 && both == 0 &&
 ((come_a == 1 && come_b == 0) || (come_a == 0 && come_b == 1)) && 
(LedA_Select%4 ==0 || LedB_Select%4 ==0))
{
			count_change_t++;
}

当积累10s后进入黑屏(model 4)

if(((come_a == 1 && come_b == 0) || (come_a == 0 && come_b == 1)) && both == 0 && (LedA_Select%4== 0 || LedB_Select%4 == 0) )
		{
			if(count_change_t >= 10)
			{
				signle = 1;
				count_change_t = 0;
				LedA_Select = 0;
				LedB_Select = 0;
				model = 4;
			}
		}

 

0x04 完整代码:
 

#include <REGX52.H>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LED_A_G = P1^0;
sbit LED_A_Y = P1^1;
sbit LED_A_R = P1^2;
sbit LED_B_R = P1^3;
sbit LED_B_Y = P1^4;
sbit LED_B_G = P1^5;


u8 code Duanxuan[]={                       //????
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8  WE[]={0x00,0x00,0x00,0x00}; 
u16 count = 0;                        				//ÓÃÓÚ¶¨Ê±Æ÷µÄ¼ÆÊý
u16 numA=10, numB=10;													//ÊýÂë¹ÜµÄÏÔʾÊý×Ö
u8 LedA_Select = 0;														//ÅжÏAµÄLED
u8 LedB_Select = 0;														//ÅжÏBµÄLED
u8 emergency_t = 4;														//½ô¼±³µÁ¾Ê±¼ä
bit emergency = 0;														//½ô¼±³µÁ¾±ê־λ
u8 temp_numA, temp_numB;											//ÔÝ´æ
u8 Red_A_T = 10,Green_A_T = 10, Yellow_A_T =4;//AºìÂ̻ƵÆʱ¼ä
u8 Red_B_T = 10,Green_B_T = 10, Yellow_B_T =4;//BºìÂ̻ƵÆʱ¼ä
u8 count_change_t= 0;													//һ·ͨÐÐ10S£¬ÁíÍâһ·ûÓгµµÄʱºò//
u8 model = 0;																	//ÅжÏÉèÖÃÐÞ¸ÄÄĸöʱ¼ä
sbit Key_set = P2^0;													//ÉèÖð´¼ü
sbit Key_up = P2^1;														//Ôö¼Ó°´¼ü
sbit Key_down = P2^2;													//¼õÉÙ°´¼ü
sbit Key_A = P2^3;														//A·¼ì²é°´¼ü
sbit Key_B = P2^4;														//B·¼ì²é°´¼ü
bit come_a=0, come_b=0;												//A·À´³µ£¬B·À´³µ
bit both, signle;															//µ¥Â·Óгµ or ˫·Óгµ

void Delay(u16 t)		
{
	while(t--);
}

void display(void)
{
	static unsigned char i = 0;
	
	P0 = 0xff;

	P3 = (0x10 << i) | 0x04;
	
	P0 = WE[i++];

	i %= 4;
}
void SMC_show(void)
{

	if(model == 0)//Õý³£Ä£Ê½
	{
	
		WE[0] = ~Duanxuan[numA/10];
	  WE[1] = ~Duanxuan[numA%10];
	  WE[2] = ~Duanxuan[numB/10];
	  WE[3] = ~Duanxuan[numB%10];
	}
	 else if(model == 1)//Ð޸ķÅÐÐʱ¼ä
	{
		WE[0] = ~Duanxuan[Green_A_T/10];
		WE[1] = ~Duanxuan[Green_A_T%10];
		WE[2] = ~Duanxuan[Green_B_T/10];
		WE[3] = ~Duanxuan[Green_B_T%10];
		
	}
	else if (model == 2)//Ð޸ĻƵÆʱ¼ä
	{
		WE[0] = ~Duanxuan[Yellow_A_T/10];
		WE[1] = ~Duanxuan[Yellow_A_T%10];
		WE[2] = ~Duanxuan[Yellow_B_T/10];
		WE[3] = ~Duanxuan[Yellow_B_T%10];
	}
	else if (model == 3)//Ð޸Ľô¼±Ê±¼ä
	{
    WE[0] = ~Duanxuan[emergency_t/1000];
		WE[1] = ~Duanxuan[emergency_t/100%10];
		WE[2] = ~Duanxuan[emergency_t/10%10];
		WE[3] = ~Duanxuan[emergency_t%10];
		}
	else if (model == 4)//µ±Ò»Â·À´³µ£¬10sºó£¬½øÈëºÚÆÁ
	{
    WE[0] = ~Duanxuan[16];
		WE[1] = ~Duanxuan[16];
		WE[2] = ~Duanxuan[16];
		WE[3] = ~Duanxuan[16];
	}
}
//////////////////////////////////////==¶¨Ê±Æ÷0 && ÖжÏ0==///////////////////////
void Init_Int0_T0()
{
	IT0 = 1;
	EX0 = 1;
	
	TMOD = 0x01;//·Ç×Ô¶¯
	TR0 = 1;
	TH0 = (65535-50000) / 256;
	TL0 = (65535-50000) % 256;
	ET0 = 1; 
	
	EA = 1;
}

void Service_T0(void) interrupt 1
{
	TH0 = (65535-50000) / 256;
	TL0 = (65535-50000) % 256;

	if(count++ >= 20)
	{
		if(emergency == 0 && signle == 0 && both == 0 && ((come_a == 1 && come_b == 0) || (come_a == 0 && come_b == 1)) && (LedA_Select%4 ==0 || LedB_Select%4 ==0))//µ±Ò»Â·À´³µ£¬¿ªÊ¼¼Æʱ
			count_change_t++;
		
		if(model == 0)
		{
			numA--;
			numB--;
		}
		
		count = 0;
	}
	
	//==ÀûÓö¨Ê±Æ÷»ÆµÆÉÁ˸	
	if(LedA_Select%4 == 1 && emergency == 0)
	{
		LED_A_Y = ~LED_A_Y;
	}
		if(LedB_Select%4 == 1 && emergency == 0 )
	{
		LED_B_Y = ~LED_B_Y;
	}
	if(LedA_Select%4 ==3  && emergency == 0)
	{
		LED_A_Y = ~LED_A_Y;
	}
		if(LedB_Select%4 == 3 && emergency == 0 )
	{
		LED_B_Y = ~LED_B_Y;
	}
}


void Service_INT0() interrupt 0
{
	emergency = 1;
	temp_numA = numA;//ÔÝ´æ
	temp_numB = numB;//ÔÝ´æ
	numA = emergency_t;
	numB = emergency_t;
	LED_A_G = 1;
	LED_A_Y = 1;
	LED_A_R = 0;
	LED_B_R = 0;
	LED_B_Y = 1;
	LED_B_G = 1;
}

////////////////////////////////////////////////==end==////////////////////////////
void Led_Change(void)//Á½µÆÖ®¼äµÄת»» && ½ô¼±Çé¿öʱµÄ¸´Ô­
{
	if(emergency == 0 && (both == 0 || signle == 0))//µ±ÎªÍØչģʽÏÂʱ£¬Õý³£Ä£Ê½ÏµĽ»Ìæ¾ÍÍ£Ö¹
	{
		if(numA == 0)
		{
			LedA_Select++;
			switch(LedA_Select%4)
			{
				case 0://Â̵Æ
					numA = Green_A_T;
					LED_A_G=0;
					LED_A_R=1;
					LED_A_Y=1;
				break;
				case 1://»ÆµÆ
					numA = Yellow_A_T;
					LED_A_Y= 0;
					LED_A_G = 1;
					LED_A_R=1;
					break;
				case 2://ºìµÆ
					numA = Red_A_T;
					LED_A_R = 0;
					LED_A_Y= 1;
					LED_A_G=1;
					break;
				case 3://»ÆµÆ
					numA = Yellow_A_T;
					LED_A_Y= 0;
					LED_A_G = 1;
					LED_A_R=1;
					break;
			}
		}
		
		if(numB == 0)
		{
			LedB_Select++;
			switch(LedB_Select%4)
			{
				case 0://Â̵Æ
						numB = Green_B_T;
					LED_B_Y=1;
					LED_B_G=0;
					LED_B_R=1;
				
				break;
				case 1://»ÆµÆ
					numB = Yellow_B_T;
					LED_B_R=1;
					LED_B_G=1;
					LED_B_Y=0;
					break;
				case 2://ºìµÆ
					numB = Red_B_T;
					LED_B_R=0;
					LED_B_Y=1;
					LED_B_G=1;
					break;
				case 3://»ÆµÆ
					numB = Yellow_B_T;
					LED_B_G=1;
					LED_B_Y=0;
					LED_B_R=1;
					break;
			}
		}
	}
	else if(emergency == 1 && numA == 0 && numB == 0) 
	{
		numA = temp_numA;
		numB = temp_numB;
		//ÏȹØÉÏ£¬ÈÃLED_SelectÈ¥ÅжÏÔ­À´ÎªÊ²Ã´µÆ
		emergency = 0;
		LED_A_G = 1;
		LED_A_Y = 1;
		LED_A_R = 1;
		LED_B_R = 1;
		LED_B_Y = 1;
		LED_B_G = 1;
				
		
		switch(LedA_Select%4)
		{
			case 0://Â̵Æ
				LED_A_Y=1;
				LED_A_G=0;
				LED_A_Y=1;
			break;
					
			case 1://»ÆµÆ
				LED_A_R=1;
				LED_A_Y= 0;
				LED_A_G = 1;
			break;
			case 2://ºìµÆ
				LED_A_G=1;
				LED_A_R = 0;
				LED_A_Y= 1;
			break;
			case 3://»ÆµÆ
				LED_A_G=1;
				LED_A_Y= 0;
				LED_A_R = 1;
			break;
		}
						
		switch(LedB_Select%4)
		{
			case 0://Â̵Æ
				LED_B_Y=1;
				LED_B_G=0;
				LED_B_R=1;
			break;
			case 1://»ÆµÆ
				LED_B_R=1;
				LED_B_G=1;
				LED_B_Y=0;
			break;
			case 2://ºìµÆ
				LED_B_G=1;
				LED_B_R=0;
				LED_B_Y=1;
			break;
			case 3://»ÆµÆ
				LED_B_G=1;
				LED_B_R=1;
				LED_B_Y=0;
			break;
		}
	}
}

void key(void)//°´¼üº¯Êý
{
	if(Key_set == 0)
	{
		Delay(100);
		if(Key_set == 0)
		{
			if(model++ == 3)
			model = 0;
		}
		while(Key_set == 0);
	}
	
	if(Key_up == 0)
	{
		Delay(100);
		if(Key_up == 0)
		{
			switch (model)
			{
					case 1:
					 Green_A_T++;
					 Green_B_T++;
					break;
									
					case 2:
					 Yellow_A_T++;
					 Yellow_B_T++;
					break;
									
					case 3:
					 emergency_t++;
					break;
			}
	  }
		while(Key_up == 0);
	}

	if(Key_down == 0)
	{
		Delay(100);
		if (Key_down == 0)
		{
				
			 switch (model)
			 {
					case 1:
						
					if(Green_A_T > 0)//Òª±È0´ó
						Green_A_T--;
					if(Green_B_T > 0)
						Green_B_T--;
					break;
						
					case 2:
						if(Yellow_A_T > 0)
						Yellow_A_T--;
						if(Yellow_B_T > 0)
						Yellow_B_T--;
					break;
						
					case 3:
						if(emergency_t>= 4)//½ô¼±time>=4
						emergency_t--;
					break;
					}
		  }
		while(Key_down == 0);
	 }
		
	if(Key_A == 0)
	{
		Delay(100);
		if (Key_A == 0)
		{
				come_a = 1;//A·À´³µ
		}	
		while(Key_A == 0);
	}
				
	if(Key_B == 0)
	{
		Delay(100);
		if (Key_B == 0)
		{
				come_b = 1;//B·À´³µ
		}	
		while(Key_B == 0);
	}
}

void expand(void)//À©Õ¹
{
	
	if(come_a == 1 && come_b == 1 && LedB_Select%4== 0 && LedA_Select%4 == 0)
	{
		signle = 0;
		model= 0;
		if(both == 0)
		{
			both = 1;
			LED_A_G = 0;
			LED_A_Y = 1;
			LED_A_R = 1;
			LED_B_R = 0;
			LED_B_Y = 1;
			LED_B_G = 1;
			//====================òËÆÖ»ÄÜÕâôд´ýµ÷ÊÔ
			/*
			temp_numB = numB;
			temp_numA = numA;
			numB = numA;
			*/
			temp_numB = numB;
			numB = numA;
			//====================
		}
	}zhi'y
		if(both == 1)
		{
			if(numA == 0 && come_a != 0)//a == 1ÓÐʱ»á2´Î»ÆµÆ  a != 0ÎÈÍ×һЩ
			{
				LED_A_G = 1;
				LED_A_Y = 1;
				LED_A_R = 0;
				LED_B_R = 1;
				LED_B_Y = 1;
				LED_B_G = 0;
				//====================òËÆÖ»ÄÜÕâôд´ýµ÷ÊÔ
			  /*
			  numB= temp_numB;
			  numA = temp_numA;
			  */
				numB= temp_numB;
				numA= numB;
				//====================
				come_a = 0;

			}
			if (numB == 0 && come_a == 0)
			{	
				LED_A_G = 1;
				LED_A_Y = 1;
				LED_A_R = 1;
				LED_B_R = 1;
				LED_B_Y = 1;
				LED_B_G = 1;
				come_b = 0;
			}
			if((come_a == 0 && come_b == 0))
			{
				both = 0;
				//=====================ΪÁ˱£Ö¤²»¿¨¶Ù£¬ÇÒûÓбðµÄbugÖ»ÄÜÕâ¸ö˳Ðò
				//Delay(500);
				numA = 0;
				numB = 0;
				LedA_Select = 0;
				LedB_Select = 0;
				//=====================
				LED_A_G = 1;
				LED_A_Y = 1;
				LED_A_R = 1;
				LED_B_R = 1;
				LED_B_Y = 1;
				LED_B_G = 1;
			}
		}
/////////////////////////////////////////////////////////////////////////////////
		
		if(((come_a == 1 && come_b == 0) || (come_a == 0 && come_b == 1)) && both == 0 && (LedA_Select%4== 0 || LedB_Select%4 == 0) )
		{
			if(count_change_t >= 10)
			{
				signle = 1;
				count_change_t = 0;
				LedA_Select = 0;
				LedB_Select = 0;
				model = 4;
			}
		}
}

void Init_System()//³õʼ»¯
{
	WE[0] = ~Duanxuan[numA/10];
	WE[1] = ~Duanxuan[numA%10];
	WE[2] = ~Duanxuan[numB/10];
	WE[3] = ~Duanxuan[numB%10];
	
	LED_A_G = 0;
	LED_A_Y = 1;
  LED_A_R = 1;
	LED_B_G = 0;
  LED_B_Y = 1;
	LED_B_R = 1;
}

void main(void)
{
	Init_System();
	Init_Int0_T0();
	while(1)
	{
		
		if(model != 4)
			Led_Change();
		display();
		SMC_show();
		key();
		expand();
	}
}

 

0x05 总结

感觉有难度的,积累一下经验,如有不对的地方希望路过的大佬斧正,去复现RCTF去了(逃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章