1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標(biāo)題: 基于C51單片機(jī)的按鍵掃描問題 [打印本頁]

作者: 不膩不膩    時間: 2020-3-31 21:18
標(biāo)題: 基于C51單片機(jī)的按鍵掃描問題
為什么在數(shù)碼管顯示數(shù)字后按下按鈕它不會消失。
假設(shè)當(dāng)P2口的數(shù)碼管顯示了一個數(shù)字后,按下相對應(yīng)的按鈕后可以使其消失(變相的打地鼠)
但是現(xiàn)在出現(xiàn)的問題是只有在數(shù)字出現(xiàn)前按下按鈕后,數(shù)字出現(xiàn)后會消失;如果數(shù)字出現(xiàn)后再按下按鈕將沒有反應(yīng)
例如:數(shù)碼管顯示3,對應(yīng)的按鈕為k3.當(dāng)3顯示之前按下k3后,3就會消失,但是在3出現(xiàn)后按下k3,3就不會消失。這是為什么,希望有大神解釋下
用的是按鍵掃描,數(shù)碼管顯示放到了一個計時里面,按鍵掃描函數(shù)在顯示函數(shù)里面

作者: 不膩不膩    時間: 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;           //隨機(jī)數(shù)
unsigned char mousenum;        //計時數(shù)
unsigned char detime;                        //時間標(biāo)志
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};
/*************************基礎(chǔ)前置******************************/
/***
延時函數(shù)
***/
void delay(unsigned int x){
        uchar i;
        while (x--)
                for (i=0;i<115;i++);                //1ms
}
/***
隨機(jī)數(shù)生成
***/
void random(){
        result=rand()%9;                                           //隨機(jī)數(shù)
}
/*****************************程序內(nèi)容***************************/
/***
蜂鳴器
***/
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;                                   //老鼠出現(xiàn)標(biāo)志位變0
                }
        }
}
/***
地鼠顯示程序
***/
void mouse(){
        unsigned char holenum;
        if(flag1==1){                                                 //標(biāo)志位1,開始出現(xiàn)老鼠
                random();                                                 //隨機(jī)數(shù)
                holenum=result;
                if(holenum==8&&holenum==9) random();                //8/9兩個數(shù)無效,重新隨機(jī)
                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;       
        }
}
/***
主函數(shù)
***/
void main(){
        led=1;
        while(1){
                scankey();
        }
}
代碼如下,小白一個,希望有人解釋下
作者: game灬boy    時間: 2020-3-31 22:16
不知道你的程序是怎樣的

為了保證按鍵的靈敏度把按鍵掃描放在main中較好

假設(shè)P2.0  2.1   2.2   2.3  控制四個數(shù)碼管
你可以
if(Key1==0) //按下
P2.0=1;   //對應(yīng)的數(shù)碼管滅
if (Key2==0)
P2.1=1;
作者: man1234567    時間: 2020-3-31 22:49
這個情況很常見,需要調(diào)整一下程序,還好連ASCII碼都用不全就可以全部搞定。
貼程序就太見外了,那都是低級碼農(nóng)干的活,我們就這樣文字討論一下就心領(lǐng)神會了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1