单片机 独立键盘问题

我的程序的用意是 按下一个独立键盘 让数码管的数字+1 直到15 来回循环可是不知道为什么 有时候按下键盘没有反应 是我的程序有问题 还是我的键盘接触不好啊?#include<reg52.h> /*为什么有时候按下去却没有反应*/#define uint unsigned int#define uchar unsigned charuchar num=0; sbit dula=P3^7; //数码管段选控制sbit key1=P3^2; //独立键盘的IO口控制引脚sbit key2=P3^3;sbit key3=P3^4;sbit led1=P0^0; //二极管的IO口控制引脚sbit led2=P0^1;sbit led3=P0^2;uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};void delay(uint n_ms);void main() { dula=0; P0=0xff; P3=0xff; while(1) { if(key1==0) { delay(5); //消抖检测 if(key1==0) { led1=0; num++; } } while(!key1); //抬手检测 delay(5); while(!key1); if(key2==0) { delay(5); if(key2==0) { led2=0; num++; } } while(!key2); delay(5); while(!key2); if(key3==0) { delay(5); if(key3==0) { led3=0; num++; } } while(!key3); delay(5); while(!key3); if(num==16) { num=0; } dula=1; P0=table[num]; dula=0; }}void delay(uint n_ms) { uint i=0, j=0; for(i=n_ms; i>0; i--) for(j=110; j>0; j--);}
2026年09月26日 19:00
有4个网友回答
网友(1):

你的程序是无论按key几键都会有使MUN+1,没什么问题,我猜想是你的P0口,即数码管显示的数据传输口没有加上拉电阻,导致显示端得电压不足造成无法显示。或显示的不清楚,你看不见。如果不是这个问题,再检查其他连接点是否接上。程序没有问题。

网友(2):

你这么编是很麻烦的,我建议你用外部中断来编写,将按键一段接在P3^2(P3^2有另一个功能是外部中断IT0),再将按键的另一端接地,然后在程序中设定IT0下降沿有效,再将P3^2置高电平,当按键按下时,中断被触发。
/*******************************************************************************************/
#include
#define led P1
unsigned char i=0;
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极
/*********主程序**************/
main()
{
IE=0x81; //ea=1,it0=1
TCON=0x01; //it0下降沿有效
while(1);
}
/********中断************/
void a_INT0(void) interrupt 0 using 0
{

i++;
led=tab[i];
}

网友(3):

怎么又问一遍。
if(key1==0) {
delay(5); //消抖检测
if(key1==0) {
led1=0;
num++;
}
while(!key1); //抬手检测 //这个检测在放在里面
delay(5);
while(!key1);
}
// 放在这里的话,每次循环,就是没有按键你也要判断两下,有时,当你按下时,刚好在这里判断的时候,那你说,此时你不是在等着按键放开嘛,你这次按键就没用了。

网友(4):

延时太短了要10-15MS 抬手检测一个while就够了