📄 qiangdaxitong.c
字号:
else DisplayNumber(ss-tt,Number_C);
if(x) {if(CANCEL==0){delayms(250); if(CANCEL==0) {Beeper(2);return 0;}}}
else if(SURE==0){delayms(250);if(SURE==0){Beeper(2);return 0;}} //跳出
}
ss=60;
mm--;
if(!mm) Beeper(2); //分钟提醒
else Beeper(1);
}
while(mm+1);
Number_A1[1]=black; //恢复原显示
Number_A1[0]=Group;
Number_C[1]=Number_C[0]=0;
DisplayNumber(No_,Number_A2);
Beeper(3); //提醒跳出
return 1;
}
/****************************************************************************
* 名 称:SuiJi()
* 功 能:随机选组
* 入口参数:无
* 出口参数:无
* 显示描述:数码管来回做流水灯显示,左后停在所选组上
*****************************************************************************/
void SuiJi()
{
Group=count; //此函数功能所在
Number_C[0]=Number_C[1]=black; //C置暗
Time_temp=1; tt=1;
while(Time_temp<=7)
{
switch(tt) //循环流水显示
{
case 1: Number_A1[1]=Number_B2[1]=black; Number_A1[0]=Number_B1[1]=1; break;
case 2: Number_A1[0]=Number_B1[1]=black; Number_A1[1]=Number_B2[1]=2; break;
case 3: Number_A1[1]=Number_B2[1]=black; Number_A2[0]=Number_B3[1]=3; break;
case 4: Number_A2[0]=Number_B3[1]=black; Number_A2[1]=Number_B4[1]=4; break;
case 5: Number_A2[1]=Number_B4[1]=black; Number_A2[0]=Number_B3[1]=3; break;
case 6: Number_A2[0]=Number_B3[1]=black; Number_A1[1]=Number_B2[1]=2; break;
}
if(tt>6) {Time_temp+=3; tt=1;} //控制速度
}
Time_temp=10;
for(tt=1;tt<=Group;) //最后选定
{
switch(tt)
{
case 1: Number_A1[1]=Number_B2[1]=black; Number_A1[0]=1; Number_B1[1]=1; break;
case 2: Number_A1[0]=Number_B1[1]=black; Number_A1[1]=2; Number_B2[1]=2; break;
case 3: Number_A1[1]=Number_B2[1]=black; Number_A2[0]=3; Number_B3[1]=3; break;
case 4: Number_A2[0]=Number_B3[1]=black; Number_A2[1]=4; Number_B4[1]=4; break;
}
}
Number_A2[0]=Number_A2[1]=black; //恢复显示
Number_B1[1]=Number_B2[1]=Number_B3[1]=Number_B4[1]=black;
Number_A1[0]=Group; Number_A1[1]=black;
Time_temp=20;
}
/****************************************************************************
* 名 称:QiangDa()
* 功 能:抢答与随机的选择
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void QiangDa()
{
Group=0;
DisplayNumber(No_,Number_A2);
Number_A1[0]=Number_A1[1]=black;
Number_B1[1]=Number_B2[1]=Number_B3[1]=Number_B4[1]=black;
Number_B1[0]=Number_B2[0]=Number_B3[0]=Number_B4[0]=black;
while(1) //抢答与随机的选择
{
KEYchoose(1); delayms(10);
if(CANCEL==0){delayms(250);if(CANCEL==0){KEYCHOOSE_2=KEYCHOOSE_1=1;SuiJi();break;}}
KEYchoose(0);
if(KEY1==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=1; break;}
if(KEY2==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=2; break;}
if(KEY3==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=3; break;}
if(KEY4==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=4; break;}
}
Number_C[0]=Number_C[1]=black;
switch(Group) //闪烁提醒
{
case 1:KEY1=0;Number_B1[1]=1;delayms(300);B1=0;delayms(300);B1=1;delayms(300);B1=0;break;
case 2:KEY2=0;Number_B2[1]=2;delayms(300);B2=0;delayms(300);B2=1;delayms(300);B2=0;break;
case 3:KEY3=0;Number_B3[1]=3;delayms(300);B3=0;delayms(300);B3=1;delayms(300);B3=0;break;
case 4:KEY4=0;Number_B4[1]=4;delayms(300);B4=0;delayms(300);B4=1;delayms(300);B4=0;
}
delayms(300);
B1=B2=B3=B4=1;
Beeper(2);
DisplayNumber(Group,Number_C); //恢复显示
DisplayNumber(Result[0],Number_B1);
DisplayNumber(Result[1],Number_B2);
DisplayNumber(Result[2],Number_B3);
DisplayNumber(Result[3],Number_B4);
Time_temp=20;
}
/****************************************************************************
* 名 称:Save_Mark()
* 功 能:存储一轮情况
* 入口参数:mm (两个值Mark和0,判断答题正确与否)
* 出口参数:无
* 显示描述:1、2、3、4顺序移入
*****************************************************************************/
void Save_Mark(unsigned char mm)
{
Save_NOW=Read24c02(NOWsave); //获取存储位置
switch(Group) //存储各主要项
{
case 1: Result[0]+=mm;DisplayNumber(Result[0],Number_B1);Write24c02(Result[0],GROUP_1);break;
case 2: Result[1]+=mm;DisplayNumber(Result[1],Number_B2);Write24c02(Result[1],GROUP_2);break;
case 3: Result[2]+=mm;DisplayNumber(Result[2],Number_B3);Write24c02(Result[2],GROUP_3);break;
case 4: Result[3]+=mm;DisplayNumber(Result[3],Number_B4);Write24c02(Result[3],GROUP_4);
}
Write24c02(No_,Save_NOW);
Write24c02(Group,Save_NOW+1);
Write24c02(Mark,Save_NOW+2);
Write24c02(Save_NOW+3,NOWsave);
Write24c02(Save_NOW+3,NOWcancel);
Write24c02(++No_,NOW_NO_);
//完成存储
Number_A1[0]=Number_A1[1]=Number_A2[0]=Number_A2[1]=black;
Time_temp=10;
for(tt=1;tt<5;)
switch(tt) //1、2、3、4顺序移入
{
case 1: Number_A2[1]=1; break;
case 2: Number_A2[1]=2; Number_A2[0]=1; break;
case 3: Number_A2[1]=3; Number_A2[0]=2; Number_A1[1]=1; break;
case 4: Number_A2[1]=4; Number_A2[0]=3; Number_A1[1]=2; Number_A1[0]=1;break;
}
Time_temp=20;
Beeper(1);
}
/****************************************************************************
* 名 称:All_CANCEL()
* 功 能:取消上一次存储
* 入口参数:无
* 出口参数:无
* 显示描述:4、3、2、1顺序移出
*****************************************************************************/
void All_CANCEL()
{
unsigned char mm,gg; //谋次的Mark和Group
Cancel_NOW=Read24c02(NOWcancel); //取消操作的入口地址
mm=Read24c02(Cancel_NOW-1);
gg=Read24c02(Cancel_NOW-2);
if(Cancel_NOW-3>=SAVEbegin) //撤销各项
{
Write24c02(0,Cancel_NOW-1);
switch(gg)
{
case 1: Result[0]-=mm;DisplayNumber(Result[0],Number_B1); Write24c02(Result[0],GROUP_1);break;
case 2: Result[1]-=mm;DisplayNumber(Result[1],Number_B2); Write24c02(Result[1],GROUP_2);break;
case 3: Result[2]-=mm;DisplayNumber(Result[2],Number_B3); Write24c02(Result[2],GROUP_3);break;
case 4: Result[3]-=mm;DisplayNumber(Result[3],Number_B4); Write24c02(Result[3],GROUP_4);
}
Write24c02(Cancel_NOW-3,NOWcancel);
//完成撤销
Number_A1[0]=Number_A1[1]=Number_A2[0]=Number_A2[1]=black;
Time_temp=10;
for(tt=1;tt<5;)
switch(tt) //4、3、2、1顺序移出
{
case 1: Number_A1[0]=4; break;
case 2: Number_A1[0]=3; Number_A1[1]=4; break;
case 3: Number_A1[0]=2; Number_A1[1]=3; Number_A2[0]=4; break;
case 4: Number_A1[0]=1; Number_A1[1]=2; Number_A2[0]=3; Number_A2[1]=4;break;
}
Time_temp=20;
Beeper(3);
}
}
/****************************************************************************
* 名 称:Test()
* 功 能:检测各组件的完好
* 入口参数:无
* 出口参数:无
* 显示描述:从0开始数数
*****************************************************************************/
void Test()
{
P0=LED_table[0]; LED1=0; delayms(200);LED1=1; //从0开始
P0=LED_table[1]; LED2=0; delayms(200);LED2=1;
P0=LED_table[2]; LED3=0; delayms(200);LED3=1;
P0=LED_table[3]; LED4=0; delayms(200);
BEEP=0; delayms(300);BEEP=1; LED4=1;
P0=LED_table[4]; LED5=0; delayms(200); LED5=1;
P0=LED_table[5]; LED6=0; delayms(200); LED6=1;
P0=LED_table[6]; LED7=0; delayms(200); LED7=1;
P0=LED_table[7]; LED8=0; delayms(200); LED8=1;
P0=LED_table[8]; LED13=0; delayms(200);LED13=1;
P0=LED_table[9]; LED14=0; delayms(200);LED14=1;
NONE();
B3=1;
Sys_Init(); //初始化定时器
DisplayNumber(10,Number_B3);
delayms(300);
B3=0; B4=1;
DisplayNumber(11,Number_B4);
Beeper(2); delayms(300);
Number_B3[0]=Number_B3[1]=Number_B4[0]=Number_B4[1]=0;
ALLon();
KEYchoose(1); //开始检测主按键
while(UP==1); B1=0;
while(DOWN==1); B2=0;
while(SURE==1); B3=0;
while(CANCEL==1); B4=0;
KEYchoose(0); A2=0;
while(KEY1==1); B1=1;
while(KEY2==1); B2=1;
while(KEY3==1); B3=1;
while(KEY4==1); B4=1;
Beeper(2);
A2=1;
KEYchoose(1);
}
/****************************************************************************
* 名 称:Load_1()
* 功 能:选择延续上一轮时载入初始化
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void Load_1()
{
Sys_Init(); //初始化定时器
Group=Read24c02(NOWgroup); //恢复上一轮各项的值
No_=Read24c02(NOW_NO_);
Mark=Read24c02(NOWmark);
Time_m=Read24c02(NOWtime_m);
Time_s=Read24c02(NOWtime_s);
Result[0]=Read24c02(GROUP_1);
Result[1]=Read24c02(GROUP_2);
Result[2]=Read24c02(GROUP_3);
Result[3]=Read24c02(GROUP_4);
Save_NOW=Read24c02(NOWsave);
if(Save_NOW==SAVEbegin)
{Write24c02(SAVEbegin+2,NOWcancel); Write24c02(0,SAVEbegin+2); }
else Write24c02(Save_NOW,NOWcancel);
}
/****************************************************************************
* 名 称:Load_2()
* 功 能:选择新一轮时载入初始化
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void Load_2()
{
Write24c02(3,NOWmark); Mark=3; //初始化各主要值
Write24c02(1,NOWtime_m); Time_m=1;
Write24c02(0,NOWtime_s);
Write24c02(0,GROUP_1);
Write24c02(0,GROUP_2);
Write24c02(0,GROUP_3);
Write24c02(0,GROUP_4);
Write24c02(1,NOW_NO_); No_=1;
Write24c02(0,NOWgroup);
Write24c02(SAVEbegin,NOWsave);Save_NOW=SAVEbegin;
Write24c02(0,SAVEbegin+2);
Write24c02(SAVEbegin+2,NOWcancel);
}
/****************************************************************************
* 名 称:Check_Mark()
* 功 能:查看各题的分数、选组、得分情况
* 入口参数:无
* 出口参数:0和1 (没用)
* 显示描述:1、2、3、4顺序移入、移出
*****************************************************************************/
bit Check_Mark()
{
unsigned char nn,gg,mm,ss,ns; //谋次的No_、Group、Mark、读取地址和总开始地址
Time_temp=10; tt=0;
while(1)
{
switch(tt) //1、2、3、4顺序移入、移出
{
case 1: Number_A2[1]=1; break;
case 2: Number_A2[1]=2; Number_A2[0]=1; break;
case 3: Number_A2[1]=3; Number_A2[0]=2; Number_A1[1]=1; break;
case 4: Number_A2[1]=4; Number_A2[0]=3; Number_A1[1]=2; Number_A1[0]=1;break;
case 5: Number_A2[1]=black; Number_A2[0]=4;Number_A1[1]=3;Number_A1[0]=2;break;
case 6: Number_A2[0]=black; Number_A1[1]=4;Number_A1[0]=3;break;
case 7: Number_A1[1]=black; Number_A1[0]=4;break;
case 8: Number_A1[0]=black; break;
case 9: Number_A1[0]=4; break;
case 10: Number_A1[0]=3; Number_A1[1]=4; break;
case 11: Number_A1[0]=2; Number_A1[1]=3; Number_A2[0]=4; break;
case 12: Number_A1[0]=1; Number_A1[1]=2; Number_A2[0]=3; Number_A2[1]=4;break;
case 13: Number_A1[0]=black; Number_A1[1]=1;Number_A2[0]=2;Number_A2[1]=3;break;
case 14: Number_A1[1]=black; Number_A2[0]=1;Number_A2[1]=2;break;
case 15: Number_A2[0]=black; Number_A2[1]=1;break;
case 16: Number_A2[1]=black; break;
}
if(tt>16) tt=1;
if(CANCEL==0) {delayms(100); if(CANCEL==0) {Time_temp=20;return 0;}}
if(SURE==0) {delayms(200); if(SURE==0) break;} //等待确认或取消
}
Beeper(1);
ss=SAVEbegin;
ns=Read24c02(NOWsave);
Number_A1[1]=black;
Number_B1[0]=Number_B2[0]=Number_B3[0]=Number_B4[0]=black;
if(ns==SAVEbegin) return 0;
while(1)
{
nn=Read24c02(ss); //读取并显示
gg=Read24c02(ss+1);
mm=Read24c02(ss+2);
Number_A1[0]=gg;
DisplayNumber(nn,Number_A2);
DisplayNumber(nn,Number_C);
Number_B1[1]=Number_B2[1]=Number_B3[1]=Number_B4[1]=black;
switch(gg)
{
case 1: Number_B1[1]=mm; break;
case 2: Number_B2[1]=mm; break;
case 3: Number_B3[1]=mm; break;
case 4: Number_B4[1]=mm; break;
}
delayms(350); //延时进入下一题
if(DOWN==0) {ss-=6;goto ADD;} else if(UP==0) goto ADD;
if(SURE==0||CANCEL==0) return 1;
delayms(350);
if(DOWN==0) {ss-=6;goto ADD;} else if(UP==0) goto ADD;
if(SURE==0||CANCEL==0) return 1;
delayms(350);
if(DOWN==0) {ss-=6;goto ADD;} else if(UP==0) goto ADD;
if(SURE==0||CANCEL==0) return 1;
delayms(350);
if(DOWN==0) {ss-=6;goto ADD;} else if(UP==0) goto ADD;
if(SURE==0||CANCEL==0) return 1;
delayms(300);
if(DOWN==0) {ss-=6;goto ADD;} else if(UP==0) goto ADD;
if(SURE==0||CANCEL==0) return 1;
delayms(300);
if(DOWN==0) ss-=6;
else if(SURE==0||CANCEL==0) return 1;
ADD:
ss+=3;
if(ss>=ns) ss=ns-3;
else if(ss<SAVEbegin) ss=SAVEbegin;
}
}
//================================== 主函数 ==================================
//============================================================================
//============================================================================
void main()
{
unsigned char temp;
ALLon(); P0=LED_table[0]; //P0口输出0
KEYchoose(1);
while(1) //“0”流水灯等待确认
{
LED4=1; LED1=0; delayms(150);
if(SURE==0) {Load_1(); Check_Mark(); break;} //进入上一轮
else if(CANCEL==0){Test(); Load_2(); break;} //开始新一轮
LED1=1; LED2=0; delayms(150);
LED2=1; LED3=0; delayms(150);
if(SURE==0) {Load_1(); Check_Mark(); break;}
else if(CANCEL==0){Test(); Load_2(); break;}
LED3=1; LED4=0; delayms(150);
}
NEXT: //抢答期间主循环
DisplayNumber(No_,Number_A2); //刷新各显示管
DisplayNumber(Mark,Number_A1);
DisplayNumber(No_,Number_C);
DisplayNumber(Result[0],Number_B1);
DisplayNumber(Result[1],Number_B2);
DisplayNumber(Result[2],Number_B3);
DisplayNumber(Result[3],Number_B4);
tt=1;
while(1) //显示题号、分数、时间
{ //等待确认
if(tt%3) {DisplayNumber(No_,Number_A2); DisplayNumber(Mark,Number_A1); temp=1;}
else {A2=1;DisplayNumber(Time_s,Number_A2);DisplayNumber(Time_m,Number_A1);temp=0;}
if(UP==0) {tt=1; SetMark(); delayms(250); tt=1; } //按UP键进行分数设定
else if(DOWN==0) { tt=1; SetTime(); delayms(250);tt=1; } //按DOWN键进行分数设定
if(temp) A2=~A2; delayms(150);
if(SURE==0) break; //按SURE进入抢答
if(CANCEL==0){A2=1; All_CANCEL(); goto NEXT;} //按CANCEL撤销上一次操作
}
A2=1; //抢答函数
QiangDa(); //倒计时
Count_Down();
KEYchoose(1);
DisplayNumber(No_,Number_A2);
Number_A1[0]=Group;
Number_A1[1]=black;
Number_C[0]=Number_C[1]=black;
while(1) //闪烁A1、A2等待判断答题正误
{
if(SURE==0){A1=A2=1; Save_Mark(Mark); delayms(250); goto NEXT;}
else if(CANCEL==0){A1=A2=1; Save_Mark(0); delayms(250); goto NEXT;}
A1=A2=~A1; delayms(250);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -