|
這個是我之前實驗做出來程序
*******************************************************************************/
#include<reg52.h>
void delay(unsigned char t);
bit key_certain(void);
/*******************************************************************************
* 實現(xiàn)功能:4×4鍵盤檢測
* 現(xiàn)象描述:按下4×4按鍵數(shù)碼管上顯示相應(yīng)的值
* K1(0) K2(1) K3(2) K4(3) K9(8) K10(9) K11(A) K12(B)
* K5(4) K6(5) K7(6) K8(7) K13(C) K14(D) K15(E) K16(F) *
*******************************************************************************/
sbit wei1=P0^7;//位定義數(shù)碼管用到的片選,高電平有效
unsigned char code tab[ ]={0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71};//0到F的16個鍵植
/*******************************************************************************
* 名稱 : Main() *
*******************************************************************************/
void main(void)//主函數(shù)
{
unsigned char key, j ,k, s;
while(1)
{
if(key_certain()== 1) //確定鍵被按下后,掃描是那個鍵被按下
{
P2=0xfe; //送第一行為低電平
k=0xfe; //保留這次掃描數(shù)值,備移位用
for(j=0;j<4;j++) //四次掃描處理
{
s=P2&0xf0; //屏蔽低四位,取高四位,根據(jù)s數(shù)值確定那一列,根據(jù)掃描的j行確定行數(shù),
switch(s)
{
case 0xe0: key=4*j+0; break; //第1列
case 0xd0: key=4*j+1; break; //第2列
case 0xb0: key=4*j+2; break; //第3列
case 0x70: key=4*j+3; break; //第4列
default: break;
}
k=(k<<1)|0x01; //循環(huán)掃描,
P2=k; //每次僅向一行送0掃描
}//for
}//if
P1=tab[key]; //數(shù)據(jù)送數(shù)碼管顯示數(shù)據(jù)口
wei1=0; //選中片選
delay(10);
}//while
}
/*******************************************************************************
* 名稱 : delay()
*******************************************************************************/
void delay(unsigned char t)//延時函數(shù)
{
unsigned char a;
while( --t != 0)
{
for(a=0;a<125;a++);
}
}
/*******************************************************************************
* 名稱 : 判斷鍵的否被按下,通過返回值確定
*******************************************************************************/
bit key_certain(void)//判斷鍵的否被按下,通過返回值確定
{
P2=0xf0;
if(P2!=0xf0)
{
delay(20);
if(P2 != 0xf0)//延時去抖動,再次確認鍵被按下,鍵按下返回值為1,否則為0
return 1;
else
return 0;
}
else
return 0;
} |
|