怎么实现按键按一下灯亮,再按下灯就部亮,或者按别的按键,前面的就清楚了还有怎么样实现防抖

怎么实现按键按一下灯亮,再按下灯就部亮,或者按别的按键,前面的就清楚了还有怎么样实现防抖,第1张

判断按键

比如说按键是P21(按键按下后P21接到gnd上)

led灯是P22

unsigned int tag = 0;

sbit key = P2^1;

sbit led = P2^2;

if(key == 0)

{

whie(key == 0); //防抖

tag = !tag; //tag 判断按键的次数,每按一次取反

if(tag)

led = 1; //亮

else

led = 0; //灭

}

第一种是可以的,第二种不对达不到按键去抖的目的,第一种while(key1==0);是等待按键放开,而第二种while(key1!=0);如果按键执行到这里时还没有放开就直接执行下面的程序了,如果到这已经放开了程序进入了死循环了,希望能帮到你

if( INT_0 != 0 ) //再次判断是否有键按下

{

EA=0;

scan_key();

delay(50);

INT_0 =judge_hitkey();

while( INT_0 !=1); //等待按键释放

EA=1;

}

在EA=0;这句前,有无加上了,重新把 INT_0 =judge_hitkey(); 再赋回来了?,,我在郭天祥的板子上调试不行; EXITEC(93): warning C206: 'manage_key1': missing function-prototype;

这是我花两个多小时写得51单片机,矩阵键盘的显示,希望能对你有帮助;

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

sbit dula=P2^6;

sbit wela=P2^7;

void init();

void display(uchar);

uchar keyscan();

uchar temp,num; //键盘扫描

void delay(uint xms) //延时子函数

{

int i,j;

for(i=xms;i>0;i--) //延时xms毫秒

for(j=110;j>0;j--);

}

void main()

{

init();

while(1)

{

keyscan();//不断扫描键盘;

display(num);

}

}

void init()

{

num=0xff; //控制让程序开始时不出现乱码;

wela=1;

P0=0xc0; //打开数码管显示,静态显示;

wela=0;

}

uchar keyscan()

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;//按位与,只能用&;

if(temp!=0xf0) //在用while语句时,一定要加上去抖动,否则程序会停不下来的哦;

{ //还是统一用if语句吧,只有在去抖动才一定要用if语句;

delay(5); //至于中括号加在那都无所谓啦;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:num=1;

break;

case 0xde:num=2;

break;

case 0xbe:num=3;

break;

case 0x7e:num=4;

break;

}

while (temp!=0xf0) //去抖动只能用while ,只有松开手才会执行下面的,才会有数码显;

{ ////一松开手,就相当于把P3口的电平改变了;所以去抖不能在switch前

temp=P3;

temp=temp&0xf0; //不能不要,只有松开手,才会退出这个循环;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;//按位与,只能用&;

if(temp!=0xf0)

{

delay(5);

if(temp!=0xf0)

{

temp=P3;

// temp=temp&0xf0; //该句子一定不能要,因为下面判断的,只是P3口的电平状态而已;

}

switch(temp)

{ case 0xed: num=5; break;

case 0xdd: num=6; break;

case 0xbd: num=7; break;

case 0x7d: num=8; break;

}

}

while (temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;//按位与,只能用&;

if(temp!=0xf0)

{

delay(5);

if(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

if(temp!=0xf0)

{

temp=P3;

// temp=temp&0xf0;

}

switch(temp)

{ case 0xeb: num=9; break;

case 0xdb: num=10; break;

case 0xbb: num=11; break;

case 0x7b: num=12; break;

}

while (temp!=0xf0) //去抖动只能用while ,只有松开手才会执行下面的,才会有数码显;

{ ////一松开手,就相当于把P3口的电平改变了;所以去抖不能在switch前

temp=P3;

temp=temp&0xf0; //不能不要,只有松开手,才会退出这个循环;

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;//按位与,只能用&;

if(temp!=0xf0)

{

delay(5);

if(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

if(temp!=0xf0) //该句子不能用while语句,因为如果用while语句,如果松手了,P3的电平就改变了,temp的值也会改变的。

//因此建议,非必要,还是用if语句;

{

temp=P3;

// temp=temp&0xf0;

}

switch(temp)

{ case 0xe7: num=13; break;

case 0xd7: num=14; break;

case 0xb7: num=15; break;

case 0x77: num=16; break;

}

while (temp!=0xf0) //去抖动只能用while ,只有松开手才会执行下面的,才会有数码显;

{ ////一松开手,就相当于把P3口的电平改变了;所以去抖不能在switch前

temp=P3;

temp=temp&0xf0; //不能不要,只有松开手,才会退出这个循环;

}

return num;

}

void display(uchar num)

{

P0=table[num-1];

dula=1;

dula=0;

}

下面的是郭天祥老师写的

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

sbit key1=P3^4;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0};

uchar num,temp,num1;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uchar keyscan();

void display(uchar aa);

void main()

{

num=17;

dula=1;

P0=0;

dula=0;

wela=1;

P0=0xc0;

wela=0;

while(1)

{

display(keyscan());

}

}

void display(uchar aa)

{

dula=1;

P0=table[aa-1];

dula=0;

}

uchar keyscan()

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:num=1;

break;

case 0xde:num=2;

break;

case 0xbe:num=3;

break;

case 0x7e:num=4;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:num=5;

break;

case 0xdd:num=6;

break;

case 0xbd:num=7;

break;

case 0x7d:num=8;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:num=9;

break;

case 0xdb:num=10;

break;

case 0xbb:num=11;

break;

case 0x7b:num=12;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:num=13;

break;

case 0xd7:num=14;

break;

case 0xb7:num=15;

break;

case 0x77:num=16;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

return num;

}

以上就是关于怎么实现按键按一下灯亮,再按下灯就部亮,或者按别的按键,前面的就清楚了还有怎么样实现防抖全部的内容,包括:怎么实现按键按一下灯亮,再按下灯就部亮,或者按别的按键,前面的就清楚了还有怎么样实现防抖、按键防抖动原理、51单片机4*5键盘程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10140903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存