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