网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月27日漏签0天
单片机吧 关注:212,012贴子:1,047,255
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 10回复贴,共1页
<<返回单片机吧
>0< 加载中...

求大神帮忙看看STC89c52的打地鼠游戏程序问题

  • 只看楼主
  • 收藏

  • 回复
  • zlmaqp
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
单片机新手求大神。
4*4点阵接在P0口,4*4矩阵键盘接在P1口,4位数码管接在P2口,一个正式开始按钮和译码器的ABC都分别接在了P3口上。
现在的问题是,按键不能与对应的亮点不能相互识别(无论打地鼠成功与否,分数都会不规则变化),而且最终游戏结束显示的分数是错乱的,而且是不成数字的。
我把程序放出来,求大神帮我看看,哪里出错了?


  • zlmaqp
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
图片似乎看不清楚。我发文字吧。
#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);
}
}
}


2025-07-27 04:54:33
广告
不感兴趣
开通SVIP免广告
  • 未解仗剑江湖游
  • 少校
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
少年,比赛要自己做哦~


  • zlmaqp
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自己顶一下


  • zlmaqp
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
新人在这个吧里感觉真的混不下去。大神好像都是在看戏一样看着新人出错,并且找不到解决办法。


  • Luluka在打酱油
  • 上尉
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
按键和显示不对应那就是你的键值和点阵之间的关系映射有问题,这个自己解决,第二,数码管显示乱码很有可能是码表不对,或者说共阴共阳用反了,这是新手常犯的错误。就酱紫


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 10回复贴,共1页
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示