学校实验室的阶段测试,是一个交通灯控制器,开始感觉貌似不太难,但是搞着搞着,发现情况不对,还是出现了些问题的(可能还是我菜),这周六中午放的题,下午,把大框搭好了,然后身体就开始不舒服(得好好锻炼身体了),等周日中午,感觉好一些了,继续完善了一下,开始调bug,,等晚上差不多了,就交了。有些可惜的是RCTF就在这两天,没参加上,等复现了。
笔者水平有限,但是还是分享一下。
有一说一,第一眼看到题目时我是懵的,拓展里的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. 修改没啥可说的,需要注意的,就是,所有的数字要用变量代替。
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;
}
}
先把按键写好,当按下“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;
}
}
#include
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();
}
}
感觉有难度的,积累一下经验,如有不对的地方希望路过的大佬斧正,去复现RCTF去了(逃