久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2135|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:717022 發(fā)表于 2020-3-31 21:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
為什么在數(shù)碼管顯示數(shù)字后按下按鈕它不會消失。
假設當P2口的數(shù)碼管顯示了一個數(shù)字后,按下相對應的按鈕后可以使其消失(變相的打地鼠)
但是現(xiàn)在出現(xiàn)的問題是只有在數(shù)字出現(xiàn)前按下按鈕后,數(shù)字出現(xiàn)后會消失;如果數(shù)字出現(xiàn)后再按下按鈕將沒有反應
例如:數(shù)碼管顯示3,對應的按鈕為k3.當3顯示之前按下k3后,3就會消失,但是在3出現(xiàn)后按下k3,3就不會消失。這是為什么,希望有大神解釋下
用的是按鍵掃描,數(shù)碼管顯示放到了一個計時里面,按鍵掃描函數(shù)在顯示函數(shù)里面
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:717022 發(fā)表于 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;           //隨機數(shù)
unsigned char mousenum;        //計時數(shù)
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};
/*************************基礎前置******************************/
/***
延時函數(shù)
***/
void delay(unsigned int x){
        uchar i;
        while (x--)
                for (i=0;i<115;i++);                //1ms
}
/***
隨機數(shù)生成
***/
void random(){
        result=rand()%9;                                           //隨機數(shù)
}
/*****************************程序內容***************************/
/***
蜂鳴器
***/
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)標志位變0
                }
        }
}
/***
地鼠顯示程序
***/
void mouse(){
        unsigned char holenum;
        if(flag1==1){                                                 //標志位1,開始出現(xiàn)老鼠
                random();                                                 //隨機數(shù)
                holenum=result;
                if(holenum==8&&holenum==9) random();                //8/9兩個數(shù)無效,重新隨機
                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();
        }
}
代碼如下,小白一個,希望有人解釋下
回復

使用道具 舉報

板凳
ID:367369 發(fā)表于 2020-3-31 22:16 | 只看該作者
不知道你的程序是怎樣的

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

假設P2.0  2.1   2.2   2.3  控制四個數(shù)碼管
你可以
if(Key1==0) //按下
P2.0=1;   //對應的數(shù)碼管滅
if (Key2==0)
P2.1=1;
回復

使用道具 舉報

地板
ID:584814 發(fā)表于 2020-3-31 22:49 | 只看該作者
這個情況很常見,需要調整一下程序,還好連ASCII碼都用不全就可以全部搞定。
貼程序就太見外了,那都是低級碼農干的活,我們就這樣文字討論一下就心領神會了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 三级国产三级在线 | av二区三区| 激情网站在线 | av天天看 | av网站在线播放 | 欧美日韩一区二区三区在线观看 | 日韩www| 亚洲97 | 国产精品www | 久久大香| 视频一区 国产精品 | 九九导航 | 欧美性另类 | 一级黄色av电影 | 日韩在线观看一区 | 天天干天天插天天 | 伊人久久免费 | 亚洲五码在线 | 久久亚洲春色中文字幕久久久 | 欧美日韩亚洲国产 | 无码一区二区三区视频 | 亚洲欧美日韩精品久久亚洲区 | 午夜视频免费在线 | 最新国产视频 | 国产欧美一级二级三级在线视频 | 蜜桃视频在线观看免费视频网站www | av免费在线观看网站 | 国产日产精品一区二区三区四区 | 国产视频1区2区 | 成人免费视频一区二区 | 国产成人高清视频 | 日韩欧美在线观看视频网站 | 久久99精品久久久久久狂牛 | 国产成人麻豆免费观看 | 欧美黄视频 | 黄色网络在线观看 | 久在线| 91精品国产乱码久久久久久久久 | 欧美一区中文字幕 | 一区二区影院 | 特黄小视频 |