找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2060|回复: 3
打印 上一主题 下一主题
收起左侧

基于C51单片机的按键扫描问题

[复制链接]
跳转到指定楼层
楼主
ID:717022 发表于 2020-3-31 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么在数码管显示数字后按下按钮它不会消失。
假设当P2口的数码管显示了一个数字后,按下相对应的按钮后可以使其消失(变相的打地鼠)
但是现在出现的问题是只有在数字出现前按下按钮后,数字出现后会消失;如果数字出现后再按下按钮将没有反应
例如:数码管显示3,对应的按钮为k3.当3显示之前按下k3后,3就会消失,但是在3出现后按下k3,3就不会消失。这是为什么,希望有大神解释下
用的是按键扫描,数码管显示放到了一个计时里面,按键扫描函数在显示函数里面
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:717022 发表于 2020-3-31 21:20 | 只看该作者
#include <reg51.h>
#include <stdlib.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char result;           //随机数
unsigned char mousenum;        //计时数
unsigned char detime;                        //时间标志
unsigned char timess;
unsigned char ss;
unsigned char flag1;
unsigned char flag2;
sbit start=P3^7;               //开始键         
sbit led=P3^3;
sbit stop=P3^5;
sbit k0=P1^0;                                    //锤子
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit k5=P1^5;
sbit k6=P1^6;
sbit k7=P1^7;
sbit speak=P3^6;
uchar code hole[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8};//地鼠编号
uchar code time[]={0xb0,0xa4,0xf9,0xc0};
/*************************基础前置******************************/
/***
延时函数
***/
void delay(unsigned int x){
        uchar i;
        while (x--)
                for (i=0;i<115;i++);                //1ms
}
/***
随机数生成
***/
void random(){
        result=rand()%9;                                           //随机数
}
/*****************************程序内容***************************/
/***
蜂鸣器
***/
void speaker(){
        unsigned char i;
        for(i=0;i<10;i++){
                speak=~speak;
        }
}
/***
3s倒计时
***/
void countdown(){
        unsigned char i;
        for(i=0;i<4;i++){
                P0=time[i];
                delay(1000);
        }
        P0=0xff;
}
/***
***/
void cheak(){
        if(!k0){
                delay(10);
                if(!k0){
                        if(P2=hole[0]){
                                P2=0xff;
                                led=0;
                                detime=50;
       
                        }
                }
        }
        else if(!k1){
                delay(10);
                if(!k1){                 
                        if(P1=hole[1]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
        else if(!k2){
                delay(10);
                if(!k2){
                        if(P2=hole[2]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
        else if(!k3){
                delay(10);
                if(!k3){
                        if(P3=hole[3]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
        else if(!k4){
                delay(10);
                if(!k4){
                        if(P4=hole[4]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
        else if(!k5){
                delay(10);
                if(!k5){
                        if(P5=hole[5]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
        else if(!k6){
                delay(10);
                if(!k6){
                        if(P2=hole[6]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
        else if(!k7){
                delay(10);
                if(!k7){
                        if(P2=hole[7]){
                                P2=0xff;
                                led=0;
                                detime=50;
                        }
                }
        }
}       
/***
开始按键检测
***/
void scankey(){
        if(!start){                                                  //开始按键按下
                delay(15);                                          //消抖
                if(!start){
                        TMOD=0x01;                                   //开启计时
                        TH0=(65536-50000)/256;
                        TL0=(65536-50000)%256;
                        EA=1;
                        ET0=1;
                        TR0=1;
                        countdown();                           //倒计时
                        flag1=1;                                   //老鼠出现标志位变0
                }
        }
}
/***
地鼠显示程序
***/
void mouse(){
        unsigned char holenum;
        if(flag1==1){                                                 //标志位1,开始出现老鼠
                random();                                                 //随机数
                holenum=result;
                if(holenum==8&&holenum==9) random();                //8/9两个数无效,重新随机
                else{
                        P2=hole[holenum];
                        mousenum=holenum;
                        cheak();                                          //判断是否打中老鼠
                }
        }
        if(ss==20){
                        P2=0xff;
                        IT0=0;
                        EA=0;
                        EX0=0;
                        flag1=0;
                }                                                        
}
/***
计时
***/
void time0() interrupt 1{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ++detime;
        if(detime==60){                                                                 //初速3s
                mouse();
                timess++;
                ss++;                                                                         //随时间变快
                detime=timess;       
        }
}
/***
主函数
***/
void main(){
        led=1;
        while(1){
                scankey();
        }
}
代码如下,小白一个,希望有人解释下
回复

使用道具 举报

板凳
ID:367369 发表于 2020-3-31 22:16 | 只看该作者
不知道你的程序是怎样的

为了保证按键的灵敏度把按键扫描放在main中较好

假设P2.0  2.1   2.2   2.3  控制四个数码管
你可以
if(Key1==0) //按下
P2.0=1;   //对应的数码管灭
if (Key2==0)
P2.1=1;
回复

使用道具 举报

地板
ID:584814 发表于 2020-3-31 22:49 | 只看该作者
这个情况很常见,需要调整一下程序,还好连ASCII码都用不全就可以全部搞定。
贴程序就太见外了,那都是低级码农干的活,我们就这样文字讨论一下就心领神会了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表