|
设计要求:
1、电路使用7个发光二极管表示拔河的“电子绳”,开机后只有中间一个发亮,此即拔河的中心点。游戏甲乙双方各持一个按钮,迅速地、不断地按动产生脉冲,谁按得快,亮点向谁方向移动,每按一次,亮点移动一次。亮点移到任一方终端二极管,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后才使亮点恢复到中心。
2、用数码管显示获胜者的盘数,每次比赛结束自动给获胜方加分。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit K1=P1^0; //主持操作按键人显示开始
sbit K2=P1^1; //参赛者1按键
sbit K3=P1^2; //参赛者2按键
uchar count=3; //两人按键处理该参数作为自加或者自减运算 0 1 2《==自减3==》自加 4 5 6
uchar k=0,M=0; //分别记录两人胜的次数
uchar flag; //每局胜出标志位
//uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//单个共地数码管段码0到9
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表段位,共阳数码管显示0到9
uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20}; //位码表 第6位为控制LED位码
uchar code DSY_IDC[]={0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delayms(uchar n) //延时ms函数
{
uchar i;
while(n--)
for(i=0;i<120;i++);
}
void delay(uchar t) //延时函数
{
uchar i,p,j;
for(i=0;i<t;i++)
{
for(p=13;j>0;j--);
{ ;
}
}
}
void main()
{
while(1)
{
P2=DSY_IDX[0];P0=DSY_CODE[k];delay(50);
P2=DSY_IDX[1];P0=DSY_CODE[M];delay(50);
flag=1;
if(!K1) //主持人按键开始后参赛者按键才有效
{
delayms(20);//延时20ms按键消抖
if(!K1)//再次确认按键是否真的被按下
{
while(!K1);
while(flag)
{
if(!K2)
{
delayms(20);//延时20ms按键消抖
if(!K2)//再次确认按键是否真的被按下
{
count--;
while(!K2);
}
}
if(!K3)
{
delayms(20);//延时20ms按键消抖
if(!K3)//再次确认按键是否真的被按下
{
count++;
while(!K3);
}
}
switch(count)
{
case 0:k=k+1;P2=DSY_IDX[5]; P0=DSY_IDC[0];delayms(10); flag=0; count=3;
break;
case 1:P2=DSY_IDX[5]; P0=DSY_IDC[1];delayms(10);
break;
case 2:P2=DSY_IDX[5]; P0=DSY_IDC[2]; delayms(10);
break;
case 3: P2=DSY_IDX[5]; P0=DSY_IDC[3];delayms(10);
break;
case 4:P2=DSY_IDX[5]; P0=DSY_IDC[4]; delayms(10);
break;
case 5:P2=DSY_IDX[5]; P0=DSY_IDC[5]; delayms(10);
break;
case 6:M=M+1;P2=DSY_IDX[5]; P0=DSY_IDC[6];delayms(10);flag=0; count=3;
break;
}
if(!K1) //主持人按键开始后参赛者按键才有效
{
delayms(20);//延时20ms按键消抖
if(!K1)//再次确认按键是否真的被按下
{
flag=0;
count=3;
P2=DSY_IDX[5];
P0=DSY_IDC[3];//中间那盏灯亮对应P13口
while(!K1); //确认按键松开
}
}
}
}
}
}
}
设计者吴柱俊,微信:wu-zhu-jun ,贴吧号:wife101
|
评分
-
查看全部评分
|