欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2222|回復: 3
收起左側

基于C51單片機的按鍵掃描問題

[復制鏈接]
ID:717022 發表于 2020-3-31 21:18 | 顯示全部樓層 |閱讀模式
為什么在數碼管顯示數字后按下按鈕它不會消失。
假設當P2口的數碼管顯示了一個數字后,按下相對應的按鈕后可以使其消失(變相的打地鼠)
但是現在出現的問題是只有在數字出現前按下按鈕后,數字出現后會消失;如果數字出現后再按下按鈕將沒有反應
例如:數碼管顯示3,對應的按鈕為k3.當3顯示之前按下k3后,3就會消失,但是在3出現后按下k3,3就不會消失。這是為什么,希望有大神解釋下
用的是按鍵掃描,數碼管顯示放到了一個計時里面,按鍵掃描函數在顯示函數里面
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表