图片似乎看不清楚。我发文字吧。
#include<reg52.h>
#include<stdio.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dot[16]={0x87,0x47,0x27,0x17,0x8b,0x4b,0x2b,0x1b,0x8d,0x4d,0x2d,0x1d,0x8e,0x4e,0x2e,0x1e}; //4*4点阵数组
uchar code num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; //数码管数组
uchar code keyboard[16]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7}; //4*4键盘数组
sbit S=P3^2; //正式开始键
uint m,n,t;
uchar score;
sbit a=P3^3; //138译码器
sbit b=P3^4;
sbit c=P3^5;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
void keyscan() //4*4键盘扫描函数
{
uchar temp,key;
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77:key=3;key==m?score++:score--;break; //按键是否与亮灯对应,按对加分,按错扣分
case 0x7b:key=2;key==m?score++:score--;break;
case 0x7d:key=1;key==m?score++:score--;break;
case 0x7e:key=0;key==m?score++:score--;break;
}
while(temp!=0x0f) //松手检测
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xb7:key=7;key==m?score++:score--;break;
case 0xbb:key=6;key==m?score++:score--;break;
case 0xbd:key=5;key==m?score++:score--;break;
case 0xbe:key=4;key==m?score++:score--;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xd7:key=11;key==m?score++:score--;break;
case 0xdb:key=10;key==m?score++:score--;break;
case 0xdd:key=9;key==m?score++:score--;break;
case 0xde:key=8;key==m?score++:score--;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xe7:key=15;key==m?score++:score--;break;
case 0xeb:key=14;key==m?score++:score--;break;
case 0xed:key=13;key==m?score++:score--;break;
case 0xee:key=12;key==m?score++:score--;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
}
void main()
{
TMOD=0x01; //定时器0工作方式1
TH0=0x4c; //装初值50ms定时
TL0=0x00;
EA=1; //总中断开
ET0=1; //定时中断开
TR0=1; //定时器启动
while(1)
{
t++; //为随机亮点准备初值
if(S==0) //正式开始键按下,游戏正式开始
break;
}
srand(t); //创造真随机亮点
while(1)
{
m=rand()%16; //m对应4*4点阵,亮点
P0=dot[m];
keyscan(); //键盘扫描
delay(1000);
}
}
void repass() interrupt 1
{
TH1=0x4c; //定时器重新装值
TL1=0x00;
n++;
if(n==140) //定时大约10s
{
while(1)
{
P0=0x00; //点阵所有灯熄灭
a=1; //显示分数
b=1;
c=0;
P2=num[score%10]; //个位
delay(10);
a=0;
b=1;
c=0;
P2=num[score/10]; //十位
delay(10);
}
}
}
#include<reg52.h>
#include<stdio.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dot[16]={0x87,0x47,0x27,0x17,0x8b,0x4b,0x2b,0x1b,0x8d,0x4d,0x2d,0x1d,0x8e,0x4e,0x2e,0x1e}; //4*4点阵数组
uchar code num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; //数码管数组
uchar code keyboard[16]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7}; //4*4键盘数组
sbit S=P3^2; //正式开始键
uint m,n,t;
uchar score;
sbit a=P3^3; //138译码器
sbit b=P3^4;
sbit c=P3^5;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
void keyscan() //4*4键盘扫描函数
{
uchar temp,key;
P1=0x7f;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x77:key=3;key==m?score++:score--;break; //按键是否与亮灯对应,按对加分,按错扣分
case 0x7b:key=2;key==m?score++:score--;break;
case 0x7d:key=1;key==m?score++:score--;break;
case 0x7e:key=0;key==m?score++:score--;break;
}
while(temp!=0x0f) //松手检测
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xb7:key=7;key==m?score++:score--;break;
case 0xbb:key=6;key==m?score++:score--;break;
case 0xbd:key=5;key==m?score++:score--;break;
case 0xbe:key=4;key==m?score++:score--;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xd7:key=11;key==m?score++:score--;break;
case 0xdb:key=10;key==m?score++:score--;break;
case 0xdd:key=9;key==m?score++:score--;break;
case 0xde:key=8;key==m?score++:score--;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xe7:key=15;key==m?score++:score--;break;
case 0xeb:key=14;key==m?score++:score--;break;
case 0xed:key=13;key==m?score++:score--;break;
case 0xee:key=12;key==m?score++:score--;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
}
void main()
{
TMOD=0x01; //定时器0工作方式1
TH0=0x4c; //装初值50ms定时
TL0=0x00;
EA=1; //总中断开
ET0=1; //定时中断开
TR0=1; //定时器启动
while(1)
{
t++; //为随机亮点准备初值
if(S==0) //正式开始键按下,游戏正式开始
break;
}
srand(t); //创造真随机亮点
while(1)
{
m=rand()%16; //m对应4*4点阵,亮点
P0=dot[m];
keyscan(); //键盘扫描
delay(1000);
}
}
void repass() interrupt 1
{
TH1=0x4c; //定时器重新装值
TL1=0x00;
n++;
if(n==140) //定时大约10s
{
while(1)
{
P0=0x00; //点阵所有灯熄灭
a=1; //显示分数
b=1;
c=0;
P2=num[score%10]; //个位
delay(10);
a=0;
b=1;
c=0;
P2=num[score/10]; //十位
delay(10);
}
}
}