2019-07-16 05:05发布
程序如下:#include<reg51.h> #define uchar unsigned char #define disp P0 #define dispbit P1 #define hit P2 #define rat P3 sbit k0=P2^0;//敲击 sbit k1=P2^1; sbit k2=P2^2; sbit k3=P2^3; sbit k4=P2^4; sbit k5=P2^5; sbit k6=P2^6; sbit k7=P2^7; sbit r0=rat^0;//地鼠 sbit r1=rat^1; sbit r2=rat^2; sbit r3=rat^3; sbit r4=rat^4; sbit r5=rat^5; sbit r6=rat^6; sbit r7=rat^7; uchar code dispbitcode[4]={0x01,0x02,0x04,0x08}; uchar code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar dispdat[4]={10,10,10,10}; uchar lv=0x01;//关数 uchar sec=50; uchar secup=0x00; uchar dat=0x00; uchar stat=0x00;//状态 uchar rats;//地鼠数 uchar ratstat=0xff; uchar tt1=0x00;void delay(void) { uchar i; for(i=125;i>0;i--); }void lvup(void) { dispdat[0]=lv/10; dispdat[1]=lv%10; dispdat[2]=10; dispdat[3]=10; rats=10+lv*2; }void key0(void) { if(~k0) { delay(); //去抖 if(~k0) { while(~k0) //等待释放 {;} if(lv>1){lv--;lvup();} } } if(~k1) { delay(); if(~k1) { while(~k1) {;} if(lv<99){lv++;lvup();} } } if(~k2) { delay(); if(~k2) { while(~k2) //等待释放 {;} {stat=0x01;} } } }void key(void) { if(~k0) { delay(); //去抖 if(~k0) { while(~k0) //等待释放 {;} if(~r0){rats--;r0=~r0;ratstat=rat;}else rats++; } } if(~k1) { delay(); //去抖 if(~k1) { while(~k1) //等待释放 {;} if(~r1){rats--;r1=~r1;ratstat=rat;}else rats++; } } if(~k2) { delay(); //去抖 if(~k2) { while(~k2) //等待释放 {;} if(~r2){rats--;r2=~r2;ratstat=rat;}else rats++; } } if(~k3) { delay(); //去抖 if(~k3) { while(~k3) //等待释放 {;} if(~r3){rats--;r3=~r3;ratstat=rat;}else rats++; } } if(~k4) { delay(); //去抖 if(~k4) { while(~k4) //等待释放 {;} if(~r4){rats--;r4=~r4;ratstat=rat;}else rats++; } } if(~k5) { delay(); //去抖 if(~k5) { while(~k5) //等待释放 {;} if(~r5){rats--;r5=~r5;ratstat=rat;}else rats++; } } if(~k6) { delay(); //去抖 if(~k6) { while(~k6) //等待释放 {;} if(~r6){rats--;r6=~r6;ratstat=rat;}else rats++; } } if(~k7) { delay(); //去抖 if(~k7) { while(~k7) //等待释放 {;} if(~r7){rats--;r7=~r7;ratstat=rat;}else rats++; } } if(rats<=99){dispdat[0]=rats/10;dispdat[1]=rats%10;}else dispdat[0]=0;dispdat[1]=0; }void ratup(void) { rat=TH0; }void main(void) { ET0=1;ET1=1; EA=1; TMOD=0x11; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TR0=1; TH1=(65536-7777)/256; TL1=(65536-7777)%256; TR1=1; lvup(); while(1) { if(stat!=0x01) { lvup(); if(hit!=0xff)key0(); } else { dispdat[2]=sec/10; dispdat[3]=sec%10; //游戏处理 if(hit!=0xff)key(); } } } void t0(void) interrupt 1 using 0 //定时器0 { TH0=236; TL0=(65536-5000)%256; if(dispdat[0]==0) dispdat[0]=10; disp=0xff; disp=dispcode[dispdat[dat]]; dispbit=dispbitcode[dat]; dat++; if(stat==0x01)secup++; if(secup>=200) //进位 {secup=0;sec--;} if(dat==4) { dat=0; } }void t1(void) interrupt 3 using 0 //定时器1 { TH1=(65536-7777)/256; TL1=(65536-7777)%256; if(stat==0x01)tt1++; if(tt1>=200) //进位 {tt1=0;ratup();} } 上电时,左边的数码管显示关数,按下k0和k1选关,按k2开始,这时右边的开始倒计时,左边的显示剩余需要敲击的地鼠数,下面的LED当作是地鼠,每隔一段时间随机亮,右边的倒计时正常。下面的两个定时器是用来错位产生随机数的,并且还可以控制时序。
mamean 发表于 2012-7-24 14:12 敲下是灯亮还是要求不亮?
最多设置5个标签!
程序如下:#include<reg51.h>
#define uchar unsigned char
#define disp P0
#define dispbit P1
#define hit P2
#define rat P3
sbit k0=P2^0;//敲击
sbit k1=P2^1;
sbit k2=P2^2;
sbit k3=P2^3;
sbit k4=P2^4;
sbit k5=P2^5;
sbit k6=P2^6;
sbit k7=P2^7;
sbit r0=rat^0;//地鼠
sbit r1=rat^1;
sbit r2=rat^2;
sbit r3=rat^3;
sbit r4=rat^4;
sbit r5=rat^5;
sbit r6=rat^6;
sbit r7=rat^7;
uchar code dispbitcode[4]={0x01,0x02,0x04,0x08};
uchar code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dispdat[4]={10,10,10,10};
uchar lv=0x01;//关数
uchar sec=50;
uchar secup=0x00;
uchar dat=0x00;
uchar stat=0x00;//状态
uchar rats;//地鼠数
uchar ratstat=0xff;
uchar tt1=0x00;void delay(void)
{
uchar i;
for(i=125;i>0;i--);
}void lvup(void)
{
dispdat[0]=lv/10;
dispdat[1]=lv%10;
dispdat[2]=10;
dispdat[3]=10;
rats=10+lv*2;
}void key0(void)
{
if(~k0)
{
delay(); //去抖
if(~k0)
{
while(~k0) //等待释放
{;}
if(lv>1){lv--;lvup();}
}
}
if(~k1)
{
delay();
if(~k1)
{
while(~k1)
{;}
if(lv<99){lv++;lvup();}
}
}
if(~k2)
{
delay();
if(~k2)
{
while(~k2) //等待释放
{;}
{stat=0x01;}
}
}
}void key(void)
{
if(~k0)
{
delay(); //去抖
if(~k0)
{
while(~k0) //等待释放
{;}
if(~r0){rats--;r0=~r0;ratstat=rat;}else rats++;
}
}
if(~k1)
{
delay(); //去抖
if(~k1)
{
while(~k1) //等待释放
{;}
if(~r1){rats--;r1=~r1;ratstat=rat;}else rats++;
}
}
if(~k2)
{
delay(); //去抖
if(~k2)
{
while(~k2) //等待释放
{;}
if(~r2){rats--;r2=~r2;ratstat=rat;}else rats++;
}
}
if(~k3)
{
delay(); //去抖
if(~k3)
{
while(~k3) //等待释放
{;}
if(~r3){rats--;r3=~r3;ratstat=rat;}else rats++;
}
}
if(~k4)
{
delay(); //去抖
if(~k4)
{
while(~k4) //等待释放
{;}
if(~r4){rats--;r4=~r4;ratstat=rat;}else rats++;
}
}
if(~k5)
{
delay(); //去抖
if(~k5)
{
while(~k5) //等待释放
{;}
if(~r5){rats--;r5=~r5;ratstat=rat;}else rats++;
}
}
if(~k6)
{
delay(); //去抖
if(~k6)
{
while(~k6) //等待释放
{;}
if(~r6){rats--;r6=~r6;ratstat=rat;}else rats++;
}
}
if(~k7)
{
delay(); //去抖
if(~k7)
{
while(~k7) //等待释放
{;}
if(~r7){rats--;r7=~r7;ratstat=rat;}else rats++;
}
}
if(rats<=99){dispdat[0]=rats/10;dispdat[1]=rats%10;}else dispdat[0]=0;dispdat[1]=0;
}void ratup(void)
{
rat=TH0;
}void main(void)
{
ET0=1;ET1=1;
EA=1;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
TH1=(65536-7777)/256;
TL1=(65536-7777)%256;
TR1=1;
lvup();
while(1)
{
if(stat!=0x01)
{
lvup();
if(hit!=0xff)key0();
}
else
{
dispdat[2]=sec/10;
dispdat[3]=sec%10;
//游戏处理
if(hit!=0xff)key();
}
}
}
void t0(void) interrupt 1 using 0 //定时器0
{
TH0=236;
TL0=(65536-5000)%256;
if(dispdat[0]==0) dispdat[0]=10;
disp=0xff;
disp=dispcode[dispdat[dat]];
dispbit=dispbitcode[dat];
dat++;
if(stat==0x01)secup++;
if(secup>=200) //进位
{secup=0;sec--;}
if(dat==4)
{
dat=0;
}
}void t1(void) interrupt 3 using 0 //定时器1
{
TH1=(65536-7777)/256;
TL1=(65536-7777)%256;
if(stat==0x01)tt1++;
if(tt1>=200) //进位
{tt1=0;ratup();}
}
上电时,左边的数码管显示关数,按下k0和k1选关,按k2开始,这时右边的开始倒计时,左边的显示剩余需要敲击的地鼠数,下面的LED当作是地鼠,每隔一段时间随机亮,右边的倒计时正常。下面的两个定时器是用来错位产生随机数的,并且还可以控制时序。
最佳答案
不亮
一周热门 更多>