若51单片机的P1.0口接了一个独立按键,编写程序完成按键检测程序要求每按下一次P1.

若51单片机的P1.0口接了一个独立按键,编写程序完成按键检测程序要求每按下一次P1.,第1张

sbit button P1^0;

if(button == 0) //一旦检测到键值

{

Delay(); //延时20ms,有效滤除按键的抖动

if(button == 0) //再次确定键值是否有效

{

//Do somethinghere!

}

}

while(1)

{ P1=aa;

delayms(1000);

aa=_crol_(aa,1);

}

这前面的while(1)根本不会退出,也就是不会执行下面的if(key1 == 0)的语句了,所以按键按下去当然没有反应了

if(key1==0)

{

P1=0x7e;

#include<reg52h>

sbit key1=P2^4;

sbit D1=P1^0;

void delay(unsigned char y)

{

unsigned char j,k;

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

for(k=0;k<57;k--);

}

void keyo()

{

if(key1==0)

{

delay(5);

if(key1==0)

{

D1=0;

}

}

}

void keyc()

{

if(key1==0)

{

delay(5);

if(key1==0)

{

D1=1;

}

}

}

void main()

{

while(1)

{

keyo();

delay(10);

key1=1;

delay(10);

keyc();

delay(10);

}

}

最简单的程序了,由于延时程序的问题,不保证你下载到板子上后成功率100%一次性控制成功,自己摸索着改一下延时的时常,效果会好很多。 程序已经测试过,没有问题。

1你的程序并不能实现显0~9,1357,0246,亮灯和响铃是可以。

2用P11按键是可以实现暂停和继续的,并不需要中断。不是什么事都需要中断,好像离开中断就什么也不能做了

3你想暂停,是随时暂停,还是什么时候暂停

这个很好处理呀,比如以下举例,独立+矩阵,实现独立按键相当于类似SHIFT作用的效果。

#include<reg51h>

#define uchar unsigned char

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

uchar keyval,num;

sbit skey=P1^0; //独立键P10

void delay(uchar a)

{

uchar i,j;

for(i=0;i<a;i++)

for(j=0;j<125;j++);

}

uchar kbscan(void) //矩阵键扫描程序

{

unsigned char sccode,recode;

P3=0x0f; //发0扫描,列线输入

if ((P3 & 0x0f) != 0x0f) //有键按下

{

delay(20); //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef; //逐行扫描初值

while((sccode&0x01)!=0)

{

P3=sccode;

if((P3&0x0f)!=0x0f)

{

recode=(P3&0x0f)|0xf0;

while((P3&0x0f)!=0x0f);//等待键抬起

return((~sccode)+(~recode));

}

else

sccode=(sccode<<1)|0x01;

}

}

}

return 0; //无键按下,返回0

}

void getkey(void)

{

unsigned char key;

key=kbscan();

if(key==0)

{

return;

}

switch(key)

{

case 0x11:keyval=7;break;

case 0x12:keyval=4;break;

case 0x14:keyval=1;break;

case 0x18:keyval=10;break;

case 0x21:keyval=8;break;

case 0x22:keyval=5;break;

case 0x24:keyval=2;break;

case 0x28:keyval=0;break;

case 0x41:keyval=9;break;

case 0x42:keyval=6;break;

case 0x44:keyval=3;break;

case 0x48:keyval=11;break;

case 0x81:keyval=12;break;

case 0x82:keyval=13;break;

case 0x84:keyval=14;break;

case 0x88:keyval=15;break;

default:keyval=0xff;break;

}

//以下处理独立按键

if(skey==0)

{

if(keyval!=0xff)keyval+=16; //如果独立键按下,键值加16

while(skey==0); //等待独立键释放

}

}

void t0isr() interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

switch(num)

{

case 0:P2=0x01;break;

case 1:P2=0x02;break;

case 2:P2=0x04;break;

case 3:P2=0x08;break;

default:break;

}

if(keyval<16) P0=~tab[keyval]; //独立键未按正常显示

else P0=~(tab[keyval]|0x80); //独立键按下显示+DP

num++;

num&=0x03;

}

main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

getkey();

}

}

以上就是关于若51单片机的P1.0口接了一个独立按键,编写程序完成按键检测程序要求每按下一次P1.全部的内容,包括:若51单片机的P1.0口接了一个独立按键,编写程序完成按键检测程序要求每按下一次P1.、c51单片机独立按键控制,流水灯程序、最简单c5l独立按键控制led灯亮灭程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存