|
該消抖方法相當(dāng)于確定了一個(gè)下降沿
1.單按鍵
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^3;
void main(void)
{
uint n=0;
bit flag;
while(1)
{
if(P1_7==0)
{
n++;
if(n>300)
{
flag=1;
}
}
else
n=0;
if(flag&P1_7==1)
{
flag=0;
P3_7=~P3_7;//按鍵要完成的功能,這實(shí)際上是一個(gè)上升沿。不管按鍵按下多久,都只動(dòng)作一次。
}
}
}
================================================================
2.4X4矩陣鍵盤
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uint key_H;//高電平計(jì)次
uchar k,n;
bit key_flag; //高電平狀態(tài)標(biāo)志位
unsigned char code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};//共陽(yáng)極
uchar keybd_4x4(void)
{
P1=0xfe;
if(P1_4==0) return 1;
else if(P1_5==0)return 2;
else if(P1_6==0)return 3;
else if(P1_7==0)return 4;
P1=0xfd;
if(P1_4==0) return 5;
else if(P1_5==0)return 6;
else if(P1_6==0)return 7;
else if(P1_7==0)return 8;
P1=0xfb;
if(P1_4==0) return 9;
else if(P1_5==0)return 10;
else if(P1_6==0)return 11;
else if(P1_7==0)return 12;
P1=0xf7;
if(P1_4==0) return 13;
else if(P1_5==0)return 14;
else if(P1_6==0)return 15;
else if(P1_7==0)return 16;
return 0;
}
uchar key_do(void)
{
uchar tab_data;
if(k==0) //計(jì)算沒(méi)按鍵的時(shí)間,如果沒(méi)按下保持高電平,
if(key_flag==1)
{
if(++key_H>50000)//判斷按鍵高電平次數(shù)(死循環(huán)計(jì)次),說(shuō)明高電平持續(xù)很長(zhǎng)時(shí)間
{
key_H=0; //小于設(shè)定次數(shù)時(shí)清
key_flag=1;//并將標(biāo)志位置1,這樣,當(dāng)鍵按下后有低電平視為有效
}
}
else
{
key_H=0;
}
else if(k==1) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=1;
}
}
else if(k==2) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=2;
}
}
else if(k==3) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=3;
}
}
else if(k==4) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=4;
}
}
else if(k==5) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=5;
}
}
else if(k==6) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=6;
}
}
else if(k==7) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=7;
}
}
else if(k==8) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=8;
}
}
else if(k==9) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=9;
}
}
else if(k==10) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=0;
}
}
/* else if(k==11) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
//功能P0=tabca[k];
}
}
else if(k==12) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
//功能P0=tabca[k];
}
}*/
return tab_data;
}
void LED_7seg_dis(uchar x,uchar seg_data)
{
P2=1<<x-1;
P0=tabca[seg_data];
}
void main(void)
{
while(1)
{
k=keybd_4x4();
n=key_do();
LED_7seg_dis(1,n);
}
}
==========================================================

3.復(fù)合按鍵程序
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uint key_H;//高電平計(jì)次
uchar k,n,range,temp,TH=20,TL=30;
bit key_flag; //高電平狀態(tài)標(biāo)志位
unsigned char code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x00,0xbf};//共陽(yáng)極
void delay(uint us)
{
while(us--);
}
uchar keybd_4x4(void)
{
P1=0xfe;
if(P1_4==0) return 1;
else if(P1_5==0)return 2;
else if(P1_6==0)return 3;
else if(P1_7==0)return 4;
P1=0xfd;
if(P1_4==0) return 5;
else if(P1_5==0)return 6;
else if(P1_6==0)return 7;
else if(P1_7==0)return 8;
P1=0xfb;
if(P1_4==0) return 9;
else if(P1_5==0)return 10;
else if(P1_6==0)return 11;
else if(P1_7==0)return 12;
P1=0xf7;
if(P1_4==0) return 13;
else if(P1_5==0)return 14;
else if(P1_6==0)return 15;
else if(P1_7==0)return 16;
return 0;
}
uchar key_do(void)
{
uchar tab_data;
if(k==0) //計(jì)算沒(méi)按鍵的時(shí)間,如果沒(méi)按下保持高電平,
if(key_flag==1)
{
if(++key_H>60000)//判斷按鍵高電平次數(shù)(死循環(huán)計(jì)次),說(shuō)明高電平持續(xù)很長(zhǎng)時(shí)間
{
key_H=0; //小于設(shè)定次數(shù)時(shí)清
key_flag=1;//并將標(biāo)志位置1,這樣,當(dāng)鍵按下后有低電平視為有效
}
}
else
{
key_H=0;
}
else if(k==1) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=1;
}
}
else if(k==2) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=2;
}
}
else if(k==3) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=3;
}
}
else if(k==4) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=4;
}
}
else if(k==5) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=5;
}
}
else if(k==6) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=6;
}
}
else if(k==7) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=7;
}
}
else if(k==8) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=8;
}
}
else if(k==9) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=9;
}
}
else if(k==10) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
tab_data=0;
}
}
else if(k==11) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
if(range<2)
range++;
else
range=0;
}
}
/*else if(k==12) //其他就是key=0
{
if(key_flag==0) //說(shuō)明按鍵被按下且有效,Key如時(shí)間不夠長(zhǎng)前面計(jì)次結(jié)果不會(huì)置1
{
key_flag=0;//處理按鍵按下后的操作,并將標(biāo)志位清0,位下一個(gè)按下做準(zhǔn)備
//功能P0=tabca[k];
}
}*/
return tab_data;
}
void LED_7seg_dis(uchar x,uchar seg_data)
{
P2=1<<x-1;
P0=tabca[seg_data];
delay(50);
P0=0xff;
}
void main(void)
{
temp=27;
while(1)
{
LED_7seg_dis(8,11);
LED_7seg_dis(7,range);
LED_7seg_dis(6,11);
k=keybd_4x4();
n=key_do(); //按鍵值
LED_7seg_dis(2,temp/10);
LED_7seg_dis(1,temp%10);
}
}
|
|