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灯亮灭程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)